[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-microsoft-make-a365-agent":3,"mdc--4zcqxq-key":37,"related-repo-microsoft-make-a365-agent":2772,"related-org-microsoft-make-a365-agent":2782},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"make-a365-agent","provision Agent 365 teammates","Provisions a non-AI Teammate agent with Agent 365 — use this skill for Register and Observability paths. Runs a365 setup all to create the Blueprint and Entra ID permissions. After setup, always offers instrument-observability (optional) and add-workiq-tools (optional, skipped automatically when authMode = s2s) as add-ons. Supports .NET AgentFramework, Node.js, and Python agents. Normally delegated to from a365-setup after CLI and Azure prerequisites are confirmed. Can also be invoked directly when those steps are already done.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"microsoft","Microsoft","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmicrosoft.png",[12,16,19,20,23],{"name":13,"slug":14,"type":15},"Observability","observability","tag",{"name":17,"slug":18,"type":15},"Microsoft 365","microsoft-365",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"Agents","agents",{"name":24,"slug":25,"type":15},"Entra ID","entra-id",10,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent365-skills","2026-07-07T06:54:20.138366",null,2,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"AI coding skills for Microsoft Agent 365 — transform agents into AI Teammates with Teams hosting, WorkIQ MCP tools, and OTel observability. Works with Claude Code and GitHub Copilot.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fagent365-skills\u002Ftree\u002FHEAD\u002Fplugins\u002Fagent365\u002Fskills\u002Fmake-a365-agent","---\nname: make-a365-agent\ndescription: >\n  Provisions a non-AI Teammate agent with Agent 365 — use this skill for Register\n  and Observability paths. Runs a365 setup all to create the Blueprint and Entra ID permissions.\n  After setup, always offers instrument-observability (optional) and add-workiq-tools (optional,\n  skipped automatically when authMode = s2s) as add-ons. Supports .NET AgentFramework, Node.js, and Python agents.\n  Normally delegated to from a365-setup after CLI and Azure prerequisites are confirmed.\n  Can also be invoked directly when those steps are already done.\ncompatibility:\n  - claude-code\n  - vscode-copilot\n  - github-copilot-cli\nuser-invocable: true\nargument-hint: \"Optional: agent project path\"\nallowed-tools: Read, Write, Edit, Grep, Glob, Bash, AskUserQuestion, TaskCreate, TaskUpdate, TaskList\nmodel: sonnet\nhooks:\n  preToolUse:\n    - type: command\n      command: node ${CLAUDE_PLUGIN_ROOT}\u002Fhooks\u002FpreToolUse\u002Fpath-guard.js\n      timeout: 5000\n  stop:\n    - type: command\n      command: node ${CLAUDE_PLUGIN_ROOT}\u002Fhooks\u002Fstop\u002Fvalidate-make-a365-agent.js\n      timeout: 15000\n    - type: prompt\n      prompt: |\n        Before ending, verify ALL of the following:\n        1. a365 setup all completed without fatal errors.\n        2. a365.generated.config.json exists with a valid agentBlueprintId.\n        3. Setup Summary table was shown to the user verbatim.\n        4. instrument-observability was offered and either invoked or explicitly skipped by user.\n        5. add-workiq-tools was offered and either invoked or explicitly skipped by user — OR authMode = s2s (WorkIQ is not available for S2S agents and must not be offered).\n        If any item is incomplete, return {\"ok\": false, \"reason\": \"\u003Cspecific item>\"}.\n        If all items completed (or were explicitly skipped by the user), return {\"ok\": true}.\n      timeout: 30000\n---\n\n# Make A365 Agent\n\n> **Trigger phrases** — any of these will activate this skill:\n> - \"provision this agent with agent 365\"\n> - \"register this agent\"\n> - \"make this agent findable in the Agent 365 catalog\"\n> - \"Registration setup for this agent\"\n> - \"make this a custom engine agent\"\n> - \"run a365 setup all\"\n> - \"create a365 blueprint for this agent\"\n> - \"set up this agent for observability only\"\n\n> **What this skill does:** Provisions your agent with Agent 365 — creates the Blueprint\n> and Entra ID permissions. After setup, always offers observability\n> (instrument-observability) and WorkIQ tools (add-workiq-tools) as optional add-ons.\n>\n> **This skill is normally called from `a365-setup`** after CLI verification and Azure\n> prerequisites are confirmed. It can also be invoked directly when those steps are done.\n\n---\n\n> **YOUR FIRST ACTION:** Load context (Phase 0), then create all todos before running anything.\n\n---\n\n## Phase 0 — Load Context\n\n> **Show the user a visible task checklist BEFORE Phase 1 work begins.** This skill has no per-phase `TaskCreate` calls in the body — derive the checklist from the phase headers (`## Phase 0 — Load Context`, `## Phase 1 — Collect Provisioning Inputs`, `## Phase 2 — Register with Agent 365`, etc.). Exactly one item in_progress at a time; complete before moving on.\n> - **Claude Code:** call `TaskCreate` once per phase header (already in `allowed-tools`); the list renders natively. Use `TaskUpdate` to flip statuses.\n> - **VS Code Copilot Chat \u002F GitHub Copilot CLI:** `allowed-tools` is ignored — emit a markdown checklist directly in chat (`- [ ] Load context…`, `- [ ] Collect provisioning inputs…`, etc.) and edit items to `- [x]` as each phase completes.\n\n**Check for context passed from a365-setup.** If this skill was invoked by `a365-setup`,\nthe session already has `capabilities`, `agentStack`, `programmingLanguage`, and\n`usesTeamsOrCopilot` set. Load those values directly.\n\n**If invoked directly (no session context):**\n\n1. **Read** `.a365-workspace-detection.local.json` if it exists and `detectedAt` is within 60 minutes.\n   Load `agentStack`, `programmingLanguage`, and `usesTeamsOrCopilot` from it.\n\n2. **If no fresh cache**, ask the user in a single message:\n\n```\nWhat capabilities would you like to enable? (options can be combined)\n\n  1. Register — make the agent findable in the Agent 365 catalog\n  2. Observability — end-to-end activity tracing for every message, LLM call,\n     and tool use, visible in the Agent 365 portal and Microsoft Defender\n  3. WorkIQ — add WorkIQ MCP servers (M365 data: email, calendar, Teams, SharePoint, OneDrive)\n     (only show this option when authMode ≠ s2s — WorkIQ requires a user token)\n  4. AI Teammate — the agent needs a first-class M365 identity\n     (Agentic User with UPN, mailbox, presence). Handled by a different skill.\n```\n\n   - If the user selects **option 4 (AI Teammate)** — stop here and tell them:\n     > \"AI Teammate setup is handled by the `make-ai-teammate` skill. Run `\u002Fagent365:a365-setup` and select the AI Teammate path, or invoke `make-ai-teammate` directly.\"\n   - Otherwise store the answer as `capabilities` and continue.\n\n**Create all todos for this session:**\n\n- Todo 1: `Register agent with Agent 365 (a365 setup all)`\n- Todo 2: `Add Observability (optional)`\n- Todo 3: `Add WorkIQ Tools (optional)`\n\nMark Todo 1 in-progress.\n\n---\n\n## Phase 1 — Collect Provisioning Inputs\n\n### 1.0 — Check for Existing Blueprint\n\n**Before asking for any inputs**, check whether a blueprint config already exists:\n\n```bash\nls a365.config.json a365.generated.config.json 2>\u002Fdev\u002Fnull\n```\n\nIf either file exists, read it and extract the blueprint ID — the field name differs by file:\n- `a365.config.json` → read `blueprintId`\n- `a365.generated.config.json` → read `agentBlueprintId`\n\nStore whichever is present as `existingBlueprintId`. Then ask:\n\n```\nI found an existing Agent 365 config in this project.\n  • File: {filename found}\n  • Blueprint ID: {existingBlueprintId if found, otherwise \"not yet set\"}\n\nWhat would you like to do?\n\n  1. Reuse the existing blueprint — I'll skip `a365 setup all` and use this blueprint directly\n     (use this if setup already ran successfully and you just want to add capabilities)\n  2. Create a fresh blueprint — runs `a365 setup all` and overwrites the existing config\n     (use this if you want to start over or the existing config is stale)\n```\n\nWait for the answer:\n- If **1 (reuse)**: if `agentBlueprintId` is empty, ask \"Please provide your blueprint ID.\" Store as `existingBlueprintId`. Set `reuseBlueprint = true`. **Write** both values back to `.a365-workspace-detection.local.json` (merge, preserve all other fields) so the stop-hook validator and follow-on skills can read them. Skip Phase 2 (setup all) entirely — proceed directly to Phase 3.\n- If **2 (fresh)**: set `reuseBlueprint = false`. **Write** `reuseBlueprint: false` to `.a365-workspace-detection.local.json`. Continue with Phase 1 inputs and Phase 2 as normal.\n\nIf no existing config is found: set `reuseBlueprint = false` and continue.\n\n---\n\nAsk both questions in a single message:\n\n```\nTo provision your agent with Agent 365, I need two things:\n\n  1. Agent Name — short, unique identifier for your tenant (e.g. \"contoso-hr-agent\" or \"FabrikamHelpdesk\")\n     Rules: letters, numbers, hyphens only. Start with a letter. 3–20 chars (the CLI appends \" Blueprint\" to derive the Teams manifest `name.short`, capped at 30).\n     This derives the Blueprint name. Pass the name exactly as you type it — do NOT normalize case.\n     Type \"default\" to use the name \"developer\".\n\n  2. Project directory — full path to your agent code, or \"current\" for this directory.\n```\n\nStore as `agent_name` and `project_dir`. If the user replies `current`, use CWD.\nIf the user types `default`, set `agent_name = \"developer\"`.\n\n### 1.1 — Determine Messaging Endpoint\n\nAsk the user where their agent is (or will be) hosted:\n\n```\nWhere will your agent run?\n\n  1. Azure \u002F Cloud — the agent has (or will have) a public HTTPS endpoint already\n  2. Local \u002F Dev Tunnel — the agent runs on localhost and needs a dev tunnel for a public URL\n  3. Skip - I just want to set up the Blueprint and Entra ID permissions for now, without registering an endpoint yet\n```\n\n**If Cloud (option 1):** Ask for the full HTTPS endpoint URL (e.g. `https:\u002F\u002Fmyagent.azurewebsites.net\u002Fapi\u002Fmessages`). Store as `messagingEndpoint`.\n\n**If Local \u002F Dev Tunnel (option 2):** **auto-start the tunnel — do NOT ask the user to paste a URL.**\n\n#### Dev Tunnel Setup (auto-start)\n\n1. **Verify CLI is installed:** `devtunnel --version`. If it fails, install it and stop until the user confirms:\n\n   | OS | Install command |\n   |----|-----------------|\n   | Windows | `winget install Microsoft.devtunnel` |\n   | macOS | `brew install --cask devtunnel` |\n   | Linux | `curl -sL https:\u002F\u002Faka.ms\u002FDevTunnelCliInstall | bash` |\n\n2. **Verify login:** `devtunnel user show`. If it exits non-zero or prints \"not logged in\", run `devtunnel user login` (or `devtunnel user login --device-code` on headless machines), wait for the user to complete sign-in, then retry `devtunnel user show`.\n\n3. **Create the tunnel + port** (idempotent — treat \"already exists\" as success). The port is the agent's listening port — `3978` for Node.js \u002F Python, the .NET project's launch port for .NET (default `5000`):\n\n   ```bash\n   devtunnel create \u003Cagent-name>-tunnel --allow-anonymous\n   devtunnel port create \u003Cagent-name>-tunnel -p \u003Cport>\n   ```\n\n   Parse the **Tunnel ID** from the create output — format is `\u003Cid>.\u003Ccluster>` (e.g. `abc123xy.usw3`).\n\n4. **Start hosting in the background** — this is a long-running process. Run with `run_in_background=true` so the tunnel keeps running while the skill continues; the user does NOT need a separate terminal:\n\n   ```bash\n   devtunnel host \u003Cagent-name>-tunnel\n   ```\n\n5. **Resolve the public URL deterministically** — it is `https:\u002F\u002F\u003Cid-without-cluster>-\u003Cport>.\u003Ccluster>.devtunnels.ms`. Example: tunnel ID `abc123xy.usw3` + port `3978` → `https:\u002F\u002Fabc123xy-3978.usw3.devtunnels.ms`. Sanity-check with `devtunnel show \u003Cagent-name>-tunnel` and confirm the printed Access URL matches.\n\n6. **Store `tunnelUrl`** and set `messagingEndpoint = \"${tunnelUrl}\u002Fapi\u002Fmessages\"`. Tell the user verbatim: *\"Dev tunnel started at `\u003CURL>`. Hosting in the background — leave this session open. Using this endpoint for `a365 setup all`.\"*\n\n> **Tunnel not reachable:** confirm `--allow-anonymous` flag was used and the agent process is listening on the configured port.\n\n---\n\n## Phase 2 — Register with Agent 365\n\n### 2.0 — Guardrail: route AI Teammate agents away\n\nThis skill is for **Agent (Non AI Teammate)** registration only. Re-read `.a365-workspace-detection.local.json`:\n\n- **If `agentType = \"ai-teammate\"`** (stale cache from a prior session, or user picked the wrong skill): **abort this skill** and tell the user verbatim: *\"This agent is registered as an AI Teammate. The `make-a365-agent` skill handles non-AI-Teammate agents only — appending `--authmode obo|s2s` to `a365 setup all` would conflict with `--aiteammate`. Switch to `\u002Fagent365:make-ai-teammate` instead, which uses `a365 setup all --aiteammate --m365` and never passes `--authmode`.\"* Do NOT proceed to 2.1.\n- **If `agentType = \"system-agent\"`** (or unset): proceed to 2.1.\n\n### 2.1 — Dry-run preview (REQUIRED before applying anything)\n\n```bash\ncd \"\u003Cproject_dir>\" && a365 setup all --agent-name \u003Cagent_name> --dry-run\n```\n\n> **`--authmode` flag:** If the user's auth mode is known from `.a365-workspace-detection.local.json`, append `--authmode obo` or `--authmode s2s` to all `setup all` commands. This controls how the agent identity SP receives permissions (OBO = principal-scoped delegated grants, S2S = application app-role assignments requiring GA).\n\nShow the full dry-run output to the user, then ask:\n\n> \"Here's what `a365 setup all` will create. Does this look correct? Type **yes** to proceed or **no** to abort.\"\n\n- **no**: Stop. Tell the user \"Setup cancelled. Run the make-a365-agent skill again when ready.\"\n- **yes**: Proceed to 2.2.\n\n### 2.2 — Apply setup\n\n> ⚠️ **`a365 setup all` is long-running and block-buffers under chat-tool execution.** If output stalls, see [AGENTS.md § CLI output buffering under chat-tool execution](..\u002F..\u002F..\u002F..\u002FAGENTS.md#cli-output-buffering-under-chat-tool-execution) — preferred remediation is `run_in_background: true` (Claude Code Bash tool); fallback is hand-off to a separate terminal.\n\nChoose the right flags based on the detected agent type:\n\n```bash\n# Agent (Non AI Teammate) — default\ncd \"\u003Cproject_dir>\" && a365 setup all --agent-name \u003Cagent_name>\n\n# With explicit auth mode (append based on .a365-workspace-detection.local.json authMode)\ncd \"\u003Cproject_dir>\" && a365 setup all --agent-name \u003Cagent_name> --authmode obo\ncd \"\u003Cproject_dir>\" && a365 setup all --agent-name \u003Cagent_name> --authmode s2s\n\n# Custom Engine Agent (CEA) with Teams\u002FCopilot integration — add --m365\ncd \"\u003Cproject_dir>\" && a365 setup all --agent-name \u003Cagent_name> --m365\n```\n\n**For CEA agents (`usesTeamsOrCopilot = 1`):** after `setup all`, also run the bot permission step:\n```bash\na365 setup permissions bot\n```\nThis is required for Messaging Bot API grants and must follow `setup all` (which handles `permissions mcp`).\n\nThis command:\n- Creates the Agent 365 Blueprint in Entra ID (agent identity + app registration)\n- Grants required Entra ID permissions\n- For registration: makes the agent findable in the Agent 365 catalog\n- For Custom Engine Agents (`--m365`): registers the endpoint via MCP Platform\n\nMonitor output carefully:\n- The CLI logs progress in numbered steps (e.g. `[1\u002F5]`). Watch for errors or warnings.\n- Existing resources from a previous run are skipped — this is expected behavior.\n- **If the command fails or prints any error\u002Fwarning block: show the full CLI output verbatim** before consulting the error table below.\n\n> **Windows Account Manager (WAM):** If you see `\"Authenticating via Windows Account Manager...\"` in the output, a native Windows sign-in dialog has appeared. Do NOT kill the process. Tell the user: \"A Windows sign-in dialog has appeared — please complete it. Setup will continue automatically after you sign in.\"\n> - If no dialog appears on a headless machine: `Ctrl+C`, run `az login --allow-no-subscriptions` to populate the token cache, then retry.\n> - **Conditional Access Policy (CAP):** If WAM\u002Fbrowser auth is blocked by CAP (AADSTS53003, AADSTS53000), the CLI automatically falls back to device code flow — no user action needed.\n\n**Handle these conditions:**\n\n| Condition | Action |\n|-----------|--------|\n| `Graph API Forbidden \u002F Authorization_RequestDenied` | Stop. Resolve permission issue (return to a365-setup Step 2 or grant the role). Then re-run. |\n| Interactive browser auth required | If headless, instruct user to use `az login --device-code` first. |\n| `managerApplications` error \u002F blueprint rejected | Blueprint was created before May 2025 and lacks `managerApplications`. Delete and re-run `a365 setup all`, or patch via Graph API. |\n| `AADSTS700016` \u002F `Authorization_IdentityNotFound` immediately after blueprint creation | Entra replication lag — the CLI retries automatically with exponential back-off (up to 5× for identity, 12× for blueprint token, 60-second cap). No manual retry needed; wait for the CLI to complete. |\n\n`a365 setup all` is idempotent — safe to re-run after fixing an issue.\n\n### 2.3 — Show setup output\n\nAfter `a365 setup all` completes, show the user:\n\n1. **The Setup Summary table** from CLI output — verbatim.\n2. **`Agent365.Observability.OtelWrite` is automatically granted** to the agent identity by `a365 setup all` — no GA consent step required for newly provisioned agents. If the CLI output includes a \"Permission Grants\" action item (upgrade scenario for pre-1.1 agents), display the PowerShell script verbatim so the user can hand it to a Global Admin.\n3. **Skip the client secret action item entirely.** Do not show or mention it.\n\nMark Todo 1 as completed.\n\n---\n\n## Phase 3 — Add Observability (Optional)\n\nMark Todo 2 in-progress.\n\nAsk the user:\n\n```\nYour agent is provisioned. Observability lets you track every message, LLM call, and tool\ninvocation in the Agent 365 portal and Microsoft Defender.\n\n  Would you like to add observability now?\n    • yes  — I'll run the instrument-observability skill now\n    • skip — you can add it later by running the instrument-observability skill\n```\n\n**If yes:** **Read** `${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Finstrument-observability\u002FSKILL.md` and follow it.\nThe skill will detect the project language and wire up OTel + A365 tracing exporter.\n\n**If skip:** Note that the user can run the `instrument-observability` skill at any time.\n\nMark Todo 2 as completed when done (or skipped by user).\n\n---\n\n## Phase 4 — Add WorkIQ Tools (Optional)\n\nMark Todo 3 in-progress.\n\n**If `authMode = s2s`:** Skip this phase entirely — WorkIQ is not available for S2S agents (requires a user token). Mark Todo 3 as completed and proceed to Phase 5.\n\nAsk the user:\n\n```\nWould you like to add WorkIQ tools? These give your agent access to Microsoft 365 data —\nemail, calendar, Teams messages, SharePoint files, OneDrive, and more.\n\nNote: WorkIQ MCP calls use OAuth On-Behalf-Of (OBO) tokens. Users will be prompted to\nconsent the first time the agent accesses their data.\n\n  • yes  — I'll run the add-workiq-tools skill now\n  • skip — you can add it later by running the add-workiq-tools skill\n```\n\n**If yes:** **Read** `${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fadd-workiq-tools\u002FSKILL.md` and follow it.\n\n**If skip:** Note that the user can run the `add-workiq-tools` skill at any time.\n\nMark Todo 3 as completed when done (or skipped by user).\n\n---\n\n## Phase 5 — Final Summary\n\nShow the user a summary:\n\n```\n✅ Agent provisioned with Agent 365!\n\nYour agent now has:\n  • Blueprint:       Created in Entra ID (Blueprint ID in `a365.generated.config.json`)\n  • Register: Agent appears in the Agent 365 catalog\n  [• Observability:  OpenTelemetry + A365 tracing exporter wired]  (if added)\n  [• WorkIQ tools:   M365 data access via MCP]                     (if added)\n\nNext steps:\n  1. If admin consent was required, ensure a Global Admin has run the PowerShell script.\n  2. Test discovery: search for your agent in Microsoft 365 apps.\n  3. Add observability:  run the instrument-observability skill  (if not done)\n  4. Add WorkIQ tools:   run the add-workiq-tools skill          (if not done)\n```\n\n---\n\n## Error Handling\n\n**CLI error surfacing:** When any CLI command exits non-zero or prints a warning or error line, **show the complete output verbatim** in a fenced code block before suggesting a fix. Do not abstract, paraphrase, or discard CLI output — the exact error message is always more useful than a summary. If the error is not in the table below, display it and ask the user how to proceed.\n\n- Run failing commands with `-v` \u002F `--verbose` for detailed logs.\n- Manage and locate CLI diagnostic logs via `a365 logs --help`. Log files live at Windows `%APPDATA%\u002Fa365\u002Flogs\u002F`, Linux\u002FMac `~\u002F.config\u002Fa365\u002Flogs\u002F`.\n- Most `a365` commands are idempotent — safe to re-run after fixing an issue.\n- For a full cleanup of a config-free agent: `a365 cleanup --agent-name \u003Cname>`. For granular cleanup: `a365 cleanup blueprint`, `a365 cleanup azure`, or `a365 cleanup instance`. Use only as a last resort.\n",{"data":38,"body":61},{"name":4,"description":6,"compatibility":39,"user-invocable":43,"argument-hint":44,"allowed-tools":45,"model":46,"hooks":47},[40,41,42],"claude-code","vscode-copilot","github-copilot-cli",true,"Optional: agent project path","Read, Write, Edit, Grep, Glob, Bash, AskUserQuestion, TaskCreate, TaskUpdate, TaskList","sonnet",{"preToolUse":48,"stop":53},[49],{"type":50,"command":51,"timeout":52},"command","node ${CLAUDE_PLUGIN_ROOT}\u002Fhooks\u002FpreToolUse\u002Fpath-guard.js",5000,[54,57],{"type":50,"command":55,"timeout":56},"node ${CLAUDE_PLUGIN_ROOT}\u002Fhooks\u002Fstop\u002Fvalidate-make-a365-agent.js",15000,{"type":58,"prompt":59,"timeout":60},"prompt","Before ending, verify ALL of the following:\n1. a365 setup all completed without fatal errors.\n2. a365.generated.config.json exists with a valid agentBlueprintId.\n3. Setup Summary table was shown to the user verbatim.\n4. instrument-observability was offered and either invoked or explicitly skipped by user.\n5. add-workiq-tools was offered and either invoked or explicitly skipped by user — OR authMode = s2s (WorkIQ is not available for S2S agents and must not be offered).\nIf any item is incomplete, return {\"ok\": false, \"reason\": \"\u003Cspecific item>\"}.\nIf all items completed (or were explicitly skipped by the user), return {\"ok\": true}.\n",30000,{"type":62,"children":63},"root",[64,72,133,163,167,180,183,190,310,357,365,424,436,494,502,538,543,546,552,559,569,612,617,653,666,675,680,769,780,783,788,797,842,848,853,862,887,901,908,1368,1389,1392,1398,1404,1423,1522,1528,1606,1655,1660,1689,1710,1716,1752,1757,2055,2079,2108,2127,2132,2163,2168,2199,2254,2262,2382,2392,2398,2410,2456,2461,2464,2470,2475,2480,2489,2511,2529,2534,2537,2543,2548,2564,2568,2577,2598,2613,2618,2621,2627,2632,2641,2644,2650,2667,2766],{"type":65,"tag":66,"props":67,"children":68},"element","h1",{"id":4},[69],{"type":70,"value":71},"text","Make A365 Agent",{"type":65,"tag":73,"props":74,"children":75},"blockquote",{},[76,88],{"type":65,"tag":77,"props":78,"children":79},"p",{},[80,86],{"type":65,"tag":81,"props":82,"children":83},"strong",{},[84],{"type":70,"value":85},"Trigger phrases",{"type":70,"value":87}," — any of these will activate this skill:",{"type":65,"tag":89,"props":90,"children":91},"ul",{},[92,98,103,108,113,118,123,128],{"type":65,"tag":93,"props":94,"children":95},"li",{},[96],{"type":70,"value":97},"\"provision this agent with agent 365\"",{"type":65,"tag":93,"props":99,"children":100},{},[101],{"type":70,"value":102},"\"register this agent\"",{"type":65,"tag":93,"props":104,"children":105},{},[106],{"type":70,"value":107},"\"make this agent findable in the Agent 365 catalog\"",{"type":65,"tag":93,"props":109,"children":110},{},[111],{"type":70,"value":112},"\"Registration setup for this agent\"",{"type":65,"tag":93,"props":114,"children":115},{},[116],{"type":70,"value":117},"\"make this a custom engine agent\"",{"type":65,"tag":93,"props":119,"children":120},{},[121],{"type":70,"value":122},"\"run a365 setup all\"",{"type":65,"tag":93,"props":124,"children":125},{},[126],{"type":70,"value":127},"\"create a365 blueprint for this agent\"",{"type":65,"tag":93,"props":129,"children":130},{},[131],{"type":70,"value":132},"\"set up this agent for observability only\"",{"type":65,"tag":73,"props":134,"children":135},{},[136,146],{"type":65,"tag":77,"props":137,"children":138},{},[139,144],{"type":65,"tag":81,"props":140,"children":141},{},[142],{"type":70,"value":143},"What this skill does:",{"type":70,"value":145}," Provisions your agent with Agent 365 — creates the Blueprint\nand Entra ID permissions. After setup, always offers observability\n(instrument-observability) and WorkIQ tools (add-workiq-tools) as optional add-ons.",{"type":65,"tag":77,"props":147,"children":148},{},[149,161],{"type":65,"tag":81,"props":150,"children":151},{},[152,154],{"type":70,"value":153},"This skill is normally called from ",{"type":65,"tag":155,"props":156,"children":158},"code",{"className":157},[],[159],{"type":70,"value":160},"a365-setup",{"type":70,"value":162}," after CLI verification and Azure\nprerequisites are confirmed. It can also be invoked directly when those steps are done.",{"type":65,"tag":164,"props":165,"children":166},"hr",{},[],{"type":65,"tag":73,"props":168,"children":169},{},[170],{"type":65,"tag":77,"props":171,"children":172},{},[173,178],{"type":65,"tag":81,"props":174,"children":175},{},[176],{"type":70,"value":177},"YOUR FIRST ACTION:",{"type":70,"value":179}," Load context (Phase 0), then create all todos before running anything.",{"type":65,"tag":164,"props":181,"children":182},{},[],{"type":65,"tag":184,"props":185,"children":187},"h2",{"id":186},"phase-0-load-context",[188],{"type":70,"value":189},"Phase 0 — Load Context",{"type":65,"tag":73,"props":191,"children":192},{},[193,234],{"type":65,"tag":77,"props":194,"children":195},{},[196,201,203,209,211,217,219,225,226,232],{"type":65,"tag":81,"props":197,"children":198},{},[199],{"type":70,"value":200},"Show the user a visible task checklist BEFORE Phase 1 work begins.",{"type":70,"value":202}," This skill has no per-phase ",{"type":65,"tag":155,"props":204,"children":206},{"className":205},[],[207],{"type":70,"value":208},"TaskCreate",{"type":70,"value":210}," calls in the body — derive the checklist from the phase headers (",{"type":65,"tag":155,"props":212,"children":214},{"className":213},[],[215],{"type":70,"value":216},"## Phase 0 — Load Context",{"type":70,"value":218},", ",{"type":65,"tag":155,"props":220,"children":222},{"className":221},[],[223],{"type":70,"value":224},"## Phase 1 — Collect Provisioning Inputs",{"type":70,"value":218},{"type":65,"tag":155,"props":227,"children":229},{"className":228},[],[230],{"type":70,"value":231},"## Phase 2 — Register with Agent 365",{"type":70,"value":233},", etc.). Exactly one item in_progress at a time; complete before moving on.",{"type":65,"tag":89,"props":235,"children":236},{},[237,270],{"type":65,"tag":93,"props":238,"children":239},{},[240,245,247,252,254,260,262,268],{"type":65,"tag":81,"props":241,"children":242},{},[243],{"type":70,"value":244},"Claude Code:",{"type":70,"value":246}," call ",{"type":65,"tag":155,"props":248,"children":250},{"className":249},[],[251],{"type":70,"value":208},{"type":70,"value":253}," once per phase header (already in ",{"type":65,"tag":155,"props":255,"children":257},{"className":256},[],[258],{"type":70,"value":259},"allowed-tools",{"type":70,"value":261},"); the list renders natively. Use ",{"type":65,"tag":155,"props":263,"children":265},{"className":264},[],[266],{"type":70,"value":267},"TaskUpdate",{"type":70,"value":269}," to flip statuses.",{"type":65,"tag":93,"props":271,"children":272},{},[273,278,280,285,287,293,294,300,302,308],{"type":65,"tag":81,"props":274,"children":275},{},[276],{"type":70,"value":277},"VS Code Copilot Chat \u002F GitHub Copilot CLI:",{"type":70,"value":279}," ",{"type":65,"tag":155,"props":281,"children":283},{"className":282},[],[284],{"type":70,"value":259},{"type":70,"value":286}," is ignored — emit a markdown checklist directly in chat (",{"type":65,"tag":155,"props":288,"children":290},{"className":289},[],[291],{"type":70,"value":292},"- [ ] Load context…",{"type":70,"value":218},{"type":65,"tag":155,"props":295,"children":297},{"className":296},[],[298],{"type":70,"value":299},"- [ ] Collect provisioning inputs…",{"type":70,"value":301},", etc.) and edit items to ",{"type":65,"tag":155,"props":303,"children":305},{"className":304},[],[306],{"type":70,"value":307},"- [x]",{"type":70,"value":309}," as each phase completes.",{"type":65,"tag":77,"props":311,"children":312},{},[313,318,320,325,327,333,334,340,341,347,349,355],{"type":65,"tag":81,"props":314,"children":315},{},[316],{"type":70,"value":317},"Check for context passed from a365-setup.",{"type":70,"value":319}," If this skill was invoked by ",{"type":65,"tag":155,"props":321,"children":323},{"className":322},[],[324],{"type":70,"value":160},{"type":70,"value":326},",\nthe session already has ",{"type":65,"tag":155,"props":328,"children":330},{"className":329},[],[331],{"type":70,"value":332},"capabilities",{"type":70,"value":218},{"type":65,"tag":155,"props":335,"children":337},{"className":336},[],[338],{"type":70,"value":339},"agentStack",{"type":70,"value":218},{"type":65,"tag":155,"props":342,"children":344},{"className":343},[],[345],{"type":70,"value":346},"programmingLanguage",{"type":70,"value":348},", and\n",{"type":65,"tag":155,"props":350,"children":352},{"className":351},[],[353],{"type":70,"value":354},"usesTeamsOrCopilot",{"type":70,"value":356}," set. Load those values directly.",{"type":65,"tag":77,"props":358,"children":359},{},[360],{"type":65,"tag":81,"props":361,"children":362},{},[363],{"type":70,"value":364},"If invoked directly (no session context):",{"type":65,"tag":366,"props":367,"children":368},"ol",{},[369,414],{"type":65,"tag":93,"props":370,"children":371},{},[372,377,378,384,386,392,394,399,400,405,407,412],{"type":65,"tag":81,"props":373,"children":374},{},[375],{"type":70,"value":376},"Read",{"type":70,"value":279},{"type":65,"tag":155,"props":379,"children":381},{"className":380},[],[382],{"type":70,"value":383},".a365-workspace-detection.local.json",{"type":70,"value":385}," if it exists and ",{"type":65,"tag":155,"props":387,"children":389},{"className":388},[],[390],{"type":70,"value":391},"detectedAt",{"type":70,"value":393}," is within 60 minutes.\nLoad ",{"type":65,"tag":155,"props":395,"children":397},{"className":396},[],[398],{"type":70,"value":339},{"type":70,"value":218},{"type":65,"tag":155,"props":401,"children":403},{"className":402},[],[404],{"type":70,"value":346},{"type":70,"value":406},", and ",{"type":65,"tag":155,"props":408,"children":410},{"className":409},[],[411],{"type":70,"value":354},{"type":70,"value":413}," from it.",{"type":65,"tag":93,"props":415,"children":416},{},[417,422],{"type":65,"tag":81,"props":418,"children":419},{},[420],{"type":70,"value":421},"If no fresh cache",{"type":70,"value":423},", ask the user in a single message:",{"type":65,"tag":425,"props":426,"children":430},"pre",{"className":427,"code":429,"language":70},[428],"language-text","What capabilities would you like to enable? (options can be combined)\n\n  1. Register — make the agent findable in the Agent 365 catalog\n  2. Observability — end-to-end activity tracing for every message, LLM call,\n     and tool use, visible in the Agent 365 portal and Microsoft Defender\n  3. WorkIQ — add WorkIQ MCP servers (M365 data: email, calendar, Teams, SharePoint, OneDrive)\n     (only show this option when authMode ≠ s2s — WorkIQ requires a user token)\n  4. AI Teammate — the agent needs a first-class M365 identity\n     (Agentic User with UPN, mailbox, presence). Handled by a different skill.\n",[431],{"type":65,"tag":155,"props":432,"children":434},{"__ignoreMap":433},"",[435],{"type":70,"value":429},{"type":65,"tag":89,"props":437,"children":438},{},[439,482],{"type":65,"tag":93,"props":440,"children":441},{},[442,444,449,451],{"type":70,"value":443},"If the user selects ",{"type":65,"tag":81,"props":445,"children":446},{},[447],{"type":70,"value":448},"option 4 (AI Teammate)",{"type":70,"value":450}," — stop here and tell them:\n",{"type":65,"tag":73,"props":452,"children":453},{},[454],{"type":65,"tag":77,"props":455,"children":456},{},[457,459,465,467,473,475,480],{"type":70,"value":458},"\"AI Teammate setup is handled by the ",{"type":65,"tag":155,"props":460,"children":462},{"className":461},[],[463],{"type":70,"value":464},"make-ai-teammate",{"type":70,"value":466}," skill. Run ",{"type":65,"tag":155,"props":468,"children":470},{"className":469},[],[471],{"type":70,"value":472},"\u002Fagent365:a365-setup",{"type":70,"value":474}," and select the AI Teammate path, or invoke ",{"type":65,"tag":155,"props":476,"children":478},{"className":477},[],[479],{"type":70,"value":464},{"type":70,"value":481}," directly.\"",{"type":65,"tag":93,"props":483,"children":484},{},[485,487,492],{"type":70,"value":486},"Otherwise store the answer as ",{"type":65,"tag":155,"props":488,"children":490},{"className":489},[],[491],{"type":70,"value":332},{"type":70,"value":493}," and continue.",{"type":65,"tag":77,"props":495,"children":496},{},[497],{"type":65,"tag":81,"props":498,"children":499},{},[500],{"type":70,"value":501},"Create all todos for this session:",{"type":65,"tag":89,"props":503,"children":504},{},[505,516,527],{"type":65,"tag":93,"props":506,"children":507},{},[508,510],{"type":70,"value":509},"Todo 1: ",{"type":65,"tag":155,"props":511,"children":513},{"className":512},[],[514],{"type":70,"value":515},"Register agent with Agent 365 (a365 setup all)",{"type":65,"tag":93,"props":517,"children":518},{},[519,521],{"type":70,"value":520},"Todo 2: ",{"type":65,"tag":155,"props":522,"children":524},{"className":523},[],[525],{"type":70,"value":526},"Add Observability (optional)",{"type":65,"tag":93,"props":528,"children":529},{},[530,532],{"type":70,"value":531},"Todo 3: ",{"type":65,"tag":155,"props":533,"children":535},{"className":534},[],[536],{"type":70,"value":537},"Add WorkIQ Tools (optional)",{"type":65,"tag":77,"props":539,"children":540},{},[541],{"type":70,"value":542},"Mark Todo 1 in-progress.",{"type":65,"tag":164,"props":544,"children":545},{},[],{"type":65,"tag":184,"props":547,"children":549},{"id":548},"phase-1-collect-provisioning-inputs",[550],{"type":70,"value":551},"Phase 1 — Collect Provisioning Inputs",{"type":65,"tag":553,"props":554,"children":556},"h3",{"id":555},"_10-check-for-existing-blueprint",[557],{"type":70,"value":558},"1.0 — Check for Existing Blueprint",{"type":65,"tag":77,"props":560,"children":561},{},[562,567],{"type":65,"tag":81,"props":563,"children":564},{},[565],{"type":70,"value":566},"Before asking for any inputs",{"type":70,"value":568},", check whether a blueprint config already exists:",{"type":65,"tag":425,"props":570,"children":574},{"className":571,"code":572,"language":573,"meta":433,"style":433},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ls a365.config.json a365.generated.config.json 2>\u002Fdev\u002Fnull\n","bash",[575],{"type":65,"tag":155,"props":576,"children":577},{"__ignoreMap":433},[578],{"type":65,"tag":579,"props":580,"children":583},"span",{"class":581,"line":582},"line",1,[584,590,596,601,607],{"type":65,"tag":579,"props":585,"children":587},{"style":586},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[588],{"type":70,"value":589},"ls",{"type":65,"tag":579,"props":591,"children":593},{"style":592},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[594],{"type":70,"value":595}," a365.config.json",{"type":65,"tag":579,"props":597,"children":598},{"style":592},[599],{"type":70,"value":600}," a365.generated.config.json",{"type":65,"tag":579,"props":602,"children":604},{"style":603},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[605],{"type":70,"value":606}," 2>",{"type":65,"tag":579,"props":608,"children":609},{"style":592},[610],{"type":70,"value":611},"\u002Fdev\u002Fnull\n",{"type":65,"tag":77,"props":613,"children":614},{},[615],{"type":70,"value":616},"If either file exists, read it and extract the blueprint ID — the field name differs by file:",{"type":65,"tag":89,"props":618,"children":619},{},[620,637],{"type":65,"tag":93,"props":621,"children":622},{},[623,629,631],{"type":65,"tag":155,"props":624,"children":626},{"className":625},[],[627],{"type":70,"value":628},"a365.config.json",{"type":70,"value":630}," → read ",{"type":65,"tag":155,"props":632,"children":634},{"className":633},[],[635],{"type":70,"value":636},"blueprintId",{"type":65,"tag":93,"props":638,"children":639},{},[640,646,647],{"type":65,"tag":155,"props":641,"children":643},{"className":642},[],[644],{"type":70,"value":645},"a365.generated.config.json",{"type":70,"value":630},{"type":65,"tag":155,"props":648,"children":650},{"className":649},[],[651],{"type":70,"value":652},"agentBlueprintId",{"type":65,"tag":77,"props":654,"children":655},{},[656,658,664],{"type":70,"value":657},"Store whichever is present as ",{"type":65,"tag":155,"props":659,"children":661},{"className":660},[],[662],{"type":70,"value":663},"existingBlueprintId",{"type":70,"value":665},". Then ask:",{"type":65,"tag":425,"props":667,"children":670},{"className":668,"code":669,"language":70},[428],"I found an existing Agent 365 config in this project.\n  • File: {filename found}\n  • Blueprint ID: {existingBlueprintId if found, otherwise \"not yet set\"}\n\nWhat would you like to do?\n\n  1. Reuse the existing blueprint — I'll skip `a365 setup all` and use this blueprint directly\n     (use this if setup already ran successfully and you just want to add capabilities)\n  2. Create a fresh blueprint — runs `a365 setup all` and overwrites the existing config\n     (use this if you want to start over or the existing config is stale)\n",[671],{"type":65,"tag":155,"props":672,"children":673},{"__ignoreMap":433},[674],{"type":70,"value":669},{"type":65,"tag":77,"props":676,"children":677},{},[678],{"type":70,"value":679},"Wait for the answer:",{"type":65,"tag":89,"props":681,"children":682},{},[683,731],{"type":65,"tag":93,"props":684,"children":685},{},[686,688,693,695,700,702,707,709,715,717,722,724,729],{"type":70,"value":687},"If ",{"type":65,"tag":81,"props":689,"children":690},{},[691],{"type":70,"value":692},"1 (reuse)",{"type":70,"value":694},": if ",{"type":65,"tag":155,"props":696,"children":698},{"className":697},[],[699],{"type":70,"value":652},{"type":70,"value":701}," is empty, ask \"Please provide your blueprint ID.\" Store as ",{"type":65,"tag":155,"props":703,"children":705},{"className":704},[],[706],{"type":70,"value":663},{"type":70,"value":708},". Set ",{"type":65,"tag":155,"props":710,"children":712},{"className":711},[],[713],{"type":70,"value":714},"reuseBlueprint = true",{"type":70,"value":716},". ",{"type":65,"tag":81,"props":718,"children":719},{},[720],{"type":70,"value":721},"Write",{"type":70,"value":723}," both values back to ",{"type":65,"tag":155,"props":725,"children":727},{"className":726},[],[728],{"type":70,"value":383},{"type":70,"value":730}," (merge, preserve all other fields) so the stop-hook validator and follow-on skills can read them. Skip Phase 2 (setup all) entirely — proceed directly to Phase 3.",{"type":65,"tag":93,"props":732,"children":733},{},[734,735,740,742,748,749,753,754,760,762,767],{"type":70,"value":687},{"type":65,"tag":81,"props":736,"children":737},{},[738],{"type":70,"value":739},"2 (fresh)",{"type":70,"value":741},": set ",{"type":65,"tag":155,"props":743,"children":745},{"className":744},[],[746],{"type":70,"value":747},"reuseBlueprint = false",{"type":70,"value":716},{"type":65,"tag":81,"props":750,"children":751},{},[752],{"type":70,"value":721},{"type":70,"value":279},{"type":65,"tag":155,"props":755,"children":757},{"className":756},[],[758],{"type":70,"value":759},"reuseBlueprint: false",{"type":70,"value":761}," to ",{"type":65,"tag":155,"props":763,"children":765},{"className":764},[],[766],{"type":70,"value":383},{"type":70,"value":768},". Continue with Phase 1 inputs and Phase 2 as normal.",{"type":65,"tag":77,"props":770,"children":771},{},[772,774,779],{"type":70,"value":773},"If no existing config is found: set ",{"type":65,"tag":155,"props":775,"children":777},{"className":776},[],[778],{"type":70,"value":747},{"type":70,"value":493},{"type":65,"tag":164,"props":781,"children":782},{},[],{"type":65,"tag":77,"props":784,"children":785},{},[786],{"type":70,"value":787},"Ask both questions in a single message:",{"type":65,"tag":425,"props":789,"children":792},{"className":790,"code":791,"language":70},[428],"To provision your agent with Agent 365, I need two things:\n\n  1. Agent Name — short, unique identifier for your tenant (e.g. \"contoso-hr-agent\" or \"FabrikamHelpdesk\")\n     Rules: letters, numbers, hyphens only. Start with a letter. 3–20 chars (the CLI appends \" Blueprint\" to derive the Teams manifest `name.short`, capped at 30).\n     This derives the Blueprint name. Pass the name exactly as you type it — do NOT normalize case.\n     Type \"default\" to use the name \"developer\".\n\n  2. Project directory — full path to your agent code, or \"current\" for this directory.\n",[793],{"type":65,"tag":155,"props":794,"children":795},{"__ignoreMap":433},[796],{"type":70,"value":791},{"type":65,"tag":77,"props":798,"children":799},{},[800,802,808,810,816,818,824,826,832,834,840],{"type":70,"value":801},"Store as ",{"type":65,"tag":155,"props":803,"children":805},{"className":804},[],[806],{"type":70,"value":807},"agent_name",{"type":70,"value":809}," and ",{"type":65,"tag":155,"props":811,"children":813},{"className":812},[],[814],{"type":70,"value":815},"project_dir",{"type":70,"value":817},". If the user replies ",{"type":65,"tag":155,"props":819,"children":821},{"className":820},[],[822],{"type":70,"value":823},"current",{"type":70,"value":825},", use CWD.\nIf the user types ",{"type":65,"tag":155,"props":827,"children":829},{"className":828},[],[830],{"type":70,"value":831},"default",{"type":70,"value":833},", set ",{"type":65,"tag":155,"props":835,"children":837},{"className":836},[],[838],{"type":70,"value":839},"agent_name = \"developer\"",{"type":70,"value":841},".",{"type":65,"tag":553,"props":843,"children":845},{"id":844},"_11-determine-messaging-endpoint",[846],{"type":70,"value":847},"1.1 — Determine Messaging Endpoint",{"type":65,"tag":77,"props":849,"children":850},{},[851],{"type":70,"value":852},"Ask the user where their agent is (or will be) hosted:",{"type":65,"tag":425,"props":854,"children":857},{"className":855,"code":856,"language":70},[428],"Where will your agent run?\n\n  1. Azure \u002F Cloud — the agent has (or will have) a public HTTPS endpoint already\n  2. Local \u002F Dev Tunnel — the agent runs on localhost and needs a dev tunnel for a public URL\n  3. Skip - I just want to set up the Blueprint and Entra ID permissions for now, without registering an endpoint yet\n",[858],{"type":65,"tag":155,"props":859,"children":860},{"__ignoreMap":433},[861],{"type":70,"value":856},{"type":65,"tag":77,"props":863,"children":864},{},[865,870,872,878,880,886],{"type":65,"tag":81,"props":866,"children":867},{},[868],{"type":70,"value":869},"If Cloud (option 1):",{"type":70,"value":871}," Ask for the full HTTPS endpoint URL (e.g. ",{"type":65,"tag":155,"props":873,"children":875},{"className":874},[],[876],{"type":70,"value":877},"https:\u002F\u002Fmyagent.azurewebsites.net\u002Fapi\u002Fmessages",{"type":70,"value":879},"). Store as ",{"type":65,"tag":155,"props":881,"children":883},{"className":882},[],[884],{"type":70,"value":885},"messagingEndpoint",{"type":70,"value":841},{"type":65,"tag":77,"props":888,"children":889},{},[890,895,896],{"type":65,"tag":81,"props":891,"children":892},{},[893],{"type":70,"value":894},"If Local \u002F Dev Tunnel (option 2):",{"type":70,"value":279},{"type":65,"tag":81,"props":897,"children":898},{},[899],{"type":70,"value":900},"auto-start the tunnel — do NOT ask the user to paste a URL.",{"type":65,"tag":902,"props":903,"children":905},"h4",{"id":904},"dev-tunnel-setup-auto-start",[906],{"type":70,"value":907},"Dev Tunnel Setup (auto-start)",{"type":65,"tag":366,"props":909,"children":910},{},[911,1011,1050,1216,1274,1322],{"type":65,"tag":93,"props":912,"children":913},{},[914,919,920,926,928],{"type":65,"tag":81,"props":915,"children":916},{},[917],{"type":70,"value":918},"Verify CLI is installed:",{"type":70,"value":279},{"type":65,"tag":155,"props":921,"children":923},{"className":922},[],[924],{"type":70,"value":925},"devtunnel --version",{"type":70,"value":927},". If it fails, install it and stop until the user confirms:",{"type":65,"tag":929,"props":930,"children":931},"table",{},[932,951],{"type":65,"tag":933,"props":934,"children":935},"thead",{},[936],{"type":65,"tag":937,"props":938,"children":939},"tr",{},[940,946],{"type":65,"tag":941,"props":942,"children":943},"th",{},[944],{"type":70,"value":945},"OS",{"type":65,"tag":941,"props":947,"children":948},{},[949],{"type":70,"value":950},"Install command",{"type":65,"tag":952,"props":953,"children":954},"tbody",{},[955,973,990],{"type":65,"tag":937,"props":956,"children":957},{},[958,964],{"type":65,"tag":959,"props":960,"children":961},"td",{},[962],{"type":70,"value":963},"Windows",{"type":65,"tag":959,"props":965,"children":966},{},[967],{"type":65,"tag":155,"props":968,"children":970},{"className":969},[],[971],{"type":70,"value":972},"winget install Microsoft.devtunnel",{"type":65,"tag":937,"props":974,"children":975},{},[976,981],{"type":65,"tag":959,"props":977,"children":978},{},[979],{"type":70,"value":980},"macOS",{"type":65,"tag":959,"props":982,"children":983},{},[984],{"type":65,"tag":155,"props":985,"children":987},{"className":986},[],[988],{"type":70,"value":989},"brew install --cask devtunnel",{"type":65,"tag":937,"props":991,"children":992},{},[993,998],{"type":65,"tag":959,"props":994,"children":995},{},[996],{"type":70,"value":997},"Linux",{"type":65,"tag":959,"props":999,"children":1000},{},[1001,1003],{"type":70,"value":1002},"`curl -sL ",{"type":65,"tag":1004,"props":1005,"children":1009},"a",{"href":1006,"rel":1007},"https:\u002F\u002Faka.ms\u002FDevTunnelCliInstall",[1008],"nofollow",[1010],{"type":70,"value":1006},{"type":65,"tag":93,"props":1012,"children":1013},{},[1014,1019,1020,1026,1028,1034,1036,1042,1044,1049],{"type":65,"tag":81,"props":1015,"children":1016},{},[1017],{"type":70,"value":1018},"Verify login:",{"type":70,"value":279},{"type":65,"tag":155,"props":1021,"children":1023},{"className":1022},[],[1024],{"type":70,"value":1025},"devtunnel user show",{"type":70,"value":1027},". If it exits non-zero or prints \"not logged in\", run ",{"type":65,"tag":155,"props":1029,"children":1031},{"className":1030},[],[1032],{"type":70,"value":1033},"devtunnel user login",{"type":70,"value":1035}," (or ",{"type":65,"tag":155,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":70,"value":1041},"devtunnel user login --device-code",{"type":70,"value":1043}," on headless machines), wait for the user to complete sign-in, then retry ",{"type":65,"tag":155,"props":1045,"children":1047},{"className":1046},[],[1048],{"type":70,"value":1025},{"type":70,"value":841},{"type":65,"tag":93,"props":1051,"children":1052},{},[1053,1058,1060,1066,1068,1074,1076,1187,1191,1193,1198,1200,1206,1208,1214],{"type":65,"tag":81,"props":1054,"children":1055},{},[1056],{"type":70,"value":1057},"Create the tunnel + port",{"type":70,"value":1059}," (idempotent — treat \"already exists\" as success). The port is the agent's listening port — ",{"type":65,"tag":155,"props":1061,"children":1063},{"className":1062},[],[1064],{"type":70,"value":1065},"3978",{"type":70,"value":1067}," for Node.js \u002F Python, the .NET project's launch port for .NET (default ",{"type":65,"tag":155,"props":1069,"children":1071},{"className":1070},[],[1072],{"type":70,"value":1073},"5000",{"type":70,"value":1075},"):",{"type":65,"tag":425,"props":1077,"children":1079},{"className":571,"code":1078,"language":573,"meta":433,"style":433},"devtunnel create \u003Cagent-name>-tunnel --allow-anonymous\ndevtunnel port create \u003Cagent-name>-tunnel -p \u003Cport>\n",[1080],{"type":65,"tag":155,"props":1081,"children":1082},{"__ignoreMap":433},[1083,1127],{"type":65,"tag":579,"props":1084,"children":1085},{"class":581,"line":582},[1086,1091,1096,1101,1106,1112,1117,1122],{"type":65,"tag":579,"props":1087,"children":1088},{"style":586},[1089],{"type":70,"value":1090},"devtunnel",{"type":65,"tag":579,"props":1092,"children":1093},{"style":592},[1094],{"type":70,"value":1095}," create",{"type":65,"tag":579,"props":1097,"children":1098},{"style":603},[1099],{"type":70,"value":1100}," \u003C",{"type":65,"tag":579,"props":1102,"children":1103},{"style":592},[1104],{"type":70,"value":1105},"agent-nam",{"type":65,"tag":579,"props":1107,"children":1109},{"style":1108},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1110],{"type":70,"value":1111},"e",{"type":65,"tag":579,"props":1113,"children":1114},{"style":603},[1115],{"type":70,"value":1116},">",{"type":65,"tag":579,"props":1118,"children":1119},{"style":592},[1120],{"type":70,"value":1121},"-tunnel",{"type":65,"tag":579,"props":1123,"children":1124},{"style":592},[1125],{"type":70,"value":1126}," --allow-anonymous\n",{"type":65,"tag":579,"props":1128,"children":1129},{"class":581,"line":30},[1130,1134,1139,1143,1147,1151,1155,1159,1163,1168,1172,1177,1182],{"type":65,"tag":579,"props":1131,"children":1132},{"style":586},[1133],{"type":70,"value":1090},{"type":65,"tag":579,"props":1135,"children":1136},{"style":592},[1137],{"type":70,"value":1138}," port",{"type":65,"tag":579,"props":1140,"children":1141},{"style":592},[1142],{"type":70,"value":1095},{"type":65,"tag":579,"props":1144,"children":1145},{"style":603},[1146],{"type":70,"value":1100},{"type":65,"tag":579,"props":1148,"children":1149},{"style":592},[1150],{"type":70,"value":1105},{"type":65,"tag":579,"props":1152,"children":1153},{"style":1108},[1154],{"type":70,"value":1111},{"type":65,"tag":579,"props":1156,"children":1157},{"style":603},[1158],{"type":70,"value":1116},{"type":65,"tag":579,"props":1160,"children":1161},{"style":592},[1162],{"type":70,"value":1121},{"type":65,"tag":579,"props":1164,"children":1165},{"style":592},[1166],{"type":70,"value":1167}," -p",{"type":65,"tag":579,"props":1169,"children":1170},{"style":603},[1171],{"type":70,"value":1100},{"type":65,"tag":579,"props":1173,"children":1174},{"style":592},[1175],{"type":70,"value":1176},"por",{"type":65,"tag":579,"props":1178,"children":1179},{"style":1108},[1180],{"type":70,"value":1181},"t",{"type":65,"tag":579,"props":1183,"children":1184},{"style":603},[1185],{"type":70,"value":1186},">\n",{"type":65,"tag":1188,"props":1189,"children":1190},"br",{},[],{"type":70,"value":1192},"Parse the ",{"type":65,"tag":81,"props":1194,"children":1195},{},[1196],{"type":70,"value":1197},"Tunnel ID",{"type":70,"value":1199}," from the create output — format is ",{"type":65,"tag":155,"props":1201,"children":1203},{"className":1202},[],[1204],{"type":70,"value":1205},"\u003Cid>.\u003Ccluster>",{"type":70,"value":1207}," (e.g. ",{"type":65,"tag":155,"props":1209,"children":1211},{"className":1210},[],[1212],{"type":70,"value":1213},"abc123xy.usw3",{"type":70,"value":1215},").",{"type":65,"tag":93,"props":1217,"children":1218},{},[1219,1224,1226,1232,1234],{"type":65,"tag":81,"props":1220,"children":1221},{},[1222],{"type":70,"value":1223},"Start hosting in the background",{"type":70,"value":1225}," — this is a long-running process. Run with ",{"type":65,"tag":155,"props":1227,"children":1229},{"className":1228},[],[1230],{"type":70,"value":1231},"run_in_background=true",{"type":70,"value":1233}," so the tunnel keeps running while the skill continues; the user does NOT need a separate terminal:",{"type":65,"tag":425,"props":1235,"children":1237},{"className":571,"code":1236,"language":573,"meta":433,"style":433},"devtunnel host \u003Cagent-name>-tunnel\n",[1238],{"type":65,"tag":155,"props":1239,"children":1240},{"__ignoreMap":433},[1241],{"type":65,"tag":579,"props":1242,"children":1243},{"class":581,"line":582},[1244,1248,1253,1257,1261,1265,1269],{"type":65,"tag":579,"props":1245,"children":1246},{"style":586},[1247],{"type":70,"value":1090},{"type":65,"tag":579,"props":1249,"children":1250},{"style":592},[1251],{"type":70,"value":1252}," host",{"type":65,"tag":579,"props":1254,"children":1255},{"style":603},[1256],{"type":70,"value":1100},{"type":65,"tag":579,"props":1258,"children":1259},{"style":592},[1260],{"type":70,"value":1105},{"type":65,"tag":579,"props":1262,"children":1263},{"style":1108},[1264],{"type":70,"value":1111},{"type":65,"tag":579,"props":1266,"children":1267},{"style":603},[1268],{"type":70,"value":1116},{"type":65,"tag":579,"props":1270,"children":1271},{"style":592},[1272],{"type":70,"value":1273},"-tunnel\n",{"type":65,"tag":93,"props":1275,"children":1276},{},[1277,1282,1284,1290,1292,1297,1299,1304,1306,1312,1314,1320],{"type":65,"tag":81,"props":1278,"children":1279},{},[1280],{"type":70,"value":1281},"Resolve the public URL deterministically",{"type":70,"value":1283}," — it is ",{"type":65,"tag":155,"props":1285,"children":1287},{"className":1286},[],[1288],{"type":70,"value":1289},"https:\u002F\u002F\u003Cid-without-cluster>-\u003Cport>.\u003Ccluster>.devtunnels.ms",{"type":70,"value":1291},". Example: tunnel ID ",{"type":65,"tag":155,"props":1293,"children":1295},{"className":1294},[],[1296],{"type":70,"value":1213},{"type":70,"value":1298}," + port ",{"type":65,"tag":155,"props":1300,"children":1302},{"className":1301},[],[1303],{"type":70,"value":1065},{"type":70,"value":1305}," → ",{"type":65,"tag":155,"props":1307,"children":1309},{"className":1308},[],[1310],{"type":70,"value":1311},"https:\u002F\u002Fabc123xy-3978.usw3.devtunnels.ms",{"type":70,"value":1313},". Sanity-check with ",{"type":65,"tag":155,"props":1315,"children":1317},{"className":1316},[],[1318],{"type":70,"value":1319},"devtunnel show \u003Cagent-name>-tunnel",{"type":70,"value":1321}," and confirm the printed Access URL matches.",{"type":65,"tag":93,"props":1323,"children":1324},{},[1325,1336,1338,1344,1346],{"type":65,"tag":81,"props":1326,"children":1327},{},[1328,1330],{"type":70,"value":1329},"Store ",{"type":65,"tag":155,"props":1331,"children":1333},{"className":1332},[],[1334],{"type":70,"value":1335},"tunnelUrl",{"type":70,"value":1337}," and set ",{"type":65,"tag":155,"props":1339,"children":1341},{"className":1340},[],[1342],{"type":70,"value":1343},"messagingEndpoint = \"${tunnelUrl}\u002Fapi\u002Fmessages\"",{"type":70,"value":1345},". Tell the user verbatim: ",{"type":65,"tag":1347,"props":1348,"children":1349},"em",{},[1350,1352,1358,1360,1366],{"type":70,"value":1351},"\"Dev tunnel started at ",{"type":65,"tag":155,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":70,"value":1357},"\u003CURL>",{"type":70,"value":1359},". Hosting in the background — leave this session open. Using this endpoint for ",{"type":65,"tag":155,"props":1361,"children":1363},{"className":1362},[],[1364],{"type":70,"value":1365},"a365 setup all",{"type":70,"value":1367},".\"",{"type":65,"tag":73,"props":1369,"children":1370},{},[1371],{"type":65,"tag":77,"props":1372,"children":1373},{},[1374,1379,1381,1387],{"type":65,"tag":81,"props":1375,"children":1376},{},[1377],{"type":70,"value":1378},"Tunnel not reachable:",{"type":70,"value":1380}," confirm ",{"type":65,"tag":155,"props":1382,"children":1384},{"className":1383},[],[1385],{"type":70,"value":1386},"--allow-anonymous",{"type":70,"value":1388}," flag was used and the agent process is listening on the configured port.",{"type":65,"tag":164,"props":1390,"children":1391},{},[],{"type":65,"tag":184,"props":1393,"children":1395},{"id":1394},"phase-2-register-with-agent-365",[1396],{"type":70,"value":1397},"Phase 2 — Register with Agent 365",{"type":65,"tag":553,"props":1399,"children":1401},{"id":1400},"_20-guardrail-route-ai-teammate-agents-away",[1402],{"type":70,"value":1403},"2.0 — Guardrail: route AI Teammate agents away",{"type":65,"tag":77,"props":1405,"children":1406},{},[1407,1409,1414,1416,1421],{"type":70,"value":1408},"This skill is for ",{"type":65,"tag":81,"props":1410,"children":1411},{},[1412],{"type":70,"value":1413},"Agent (Non AI Teammate)",{"type":70,"value":1415}," registration only. Re-read ",{"type":65,"tag":155,"props":1417,"children":1419},{"className":1418},[],[1420],{"type":70,"value":383},{"type":70,"value":1422},":",{"type":65,"tag":89,"props":1424,"children":1425},{},[1426,1507],{"type":65,"tag":93,"props":1427,"children":1428},{},[1429,1439,1441,1446,1448,1505],{"type":65,"tag":81,"props":1430,"children":1431},{},[1432,1433],{"type":70,"value":687},{"type":65,"tag":155,"props":1434,"children":1436},{"className":1435},[],[1437],{"type":70,"value":1438},"agentType = \"ai-teammate\"",{"type":70,"value":1440}," (stale cache from a prior session, or user picked the wrong skill): ",{"type":65,"tag":81,"props":1442,"children":1443},{},[1444],{"type":70,"value":1445},"abort this skill",{"type":70,"value":1447}," and tell the user verbatim: ",{"type":65,"tag":1347,"props":1449,"children":1450},{},[1451,1453,1458,1460,1466,1467,1472,1474,1480,1482,1488,1490,1496,1498,1504],{"type":70,"value":1452},"\"This agent is registered as an AI Teammate. The ",{"type":65,"tag":155,"props":1454,"children":1456},{"className":1455},[],[1457],{"type":70,"value":4},{"type":70,"value":1459}," skill handles non-AI-Teammate agents only — appending ",{"type":65,"tag":155,"props":1461,"children":1463},{"className":1462},[],[1464],{"type":70,"value":1465},"--authmode obo|s2s",{"type":70,"value":761},{"type":65,"tag":155,"props":1468,"children":1470},{"className":1469},[],[1471],{"type":70,"value":1365},{"type":70,"value":1473}," would conflict with ",{"type":65,"tag":155,"props":1475,"children":1477},{"className":1476},[],[1478],{"type":70,"value":1479},"--aiteammate",{"type":70,"value":1481},". Switch to ",{"type":65,"tag":155,"props":1483,"children":1485},{"className":1484},[],[1486],{"type":70,"value":1487},"\u002Fagent365:make-ai-teammate",{"type":70,"value":1489}," instead, which uses ",{"type":65,"tag":155,"props":1491,"children":1493},{"className":1492},[],[1494],{"type":70,"value":1495},"a365 setup all --aiteammate --m365",{"type":70,"value":1497}," and never passes ",{"type":65,"tag":155,"props":1499,"children":1501},{"className":1500},[],[1502],{"type":70,"value":1503},"--authmode",{"type":70,"value":1367},{"type":70,"value":1506}," Do NOT proceed to 2.1.",{"type":65,"tag":93,"props":1508,"children":1509},{},[1510,1520],{"type":65,"tag":81,"props":1511,"children":1512},{},[1513,1514],{"type":70,"value":687},{"type":65,"tag":155,"props":1515,"children":1517},{"className":1516},[],[1518],{"type":70,"value":1519},"agentType = \"system-agent\"",{"type":70,"value":1521}," (or unset): proceed to 2.1.",{"type":65,"tag":553,"props":1523,"children":1525},{"id":1524},"_21-dry-run-preview-required-before-applying-anything",[1526],{"type":70,"value":1527},"2.1 — Dry-run preview (REQUIRED before applying anything)",{"type":65,"tag":425,"props":1529,"children":1531},{"className":571,"code":1530,"language":573,"meta":433,"style":433},"cd \"\u003Cproject_dir>\" && a365 setup all --agent-name \u003Cagent_name> --dry-run\n",[1532],{"type":65,"tag":155,"props":1533,"children":1534},{"__ignoreMap":433},[1535],{"type":65,"tag":579,"props":1536,"children":1537},{"class":581,"line":582},[1538,1544,1549,1554,1559,1564,1569,1574,1579,1584,1588,1593,1597,1601],{"type":65,"tag":579,"props":1539,"children":1541},{"style":1540},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[1542],{"type":70,"value":1543},"cd",{"type":65,"tag":579,"props":1545,"children":1546},{"style":603},[1547],{"type":70,"value":1548}," \"",{"type":65,"tag":579,"props":1550,"children":1551},{"style":592},[1552],{"type":70,"value":1553},"\u003Cproject_dir>",{"type":65,"tag":579,"props":1555,"children":1556},{"style":603},[1557],{"type":70,"value":1558},"\"",{"type":65,"tag":579,"props":1560,"children":1561},{"style":603},[1562],{"type":70,"value":1563}," &&",{"type":65,"tag":579,"props":1565,"children":1566},{"style":586},[1567],{"type":70,"value":1568}," a365",{"type":65,"tag":579,"props":1570,"children":1571},{"style":592},[1572],{"type":70,"value":1573}," setup",{"type":65,"tag":579,"props":1575,"children":1576},{"style":592},[1577],{"type":70,"value":1578}," all",{"type":65,"tag":579,"props":1580,"children":1581},{"style":592},[1582],{"type":70,"value":1583}," --agent-name",{"type":65,"tag":579,"props":1585,"children":1586},{"style":603},[1587],{"type":70,"value":1100},{"type":65,"tag":579,"props":1589,"children":1590},{"style":592},[1591],{"type":70,"value":1592},"agent_nam",{"type":65,"tag":579,"props":1594,"children":1595},{"style":1108},[1596],{"type":70,"value":1111},{"type":65,"tag":579,"props":1598,"children":1599},{"style":603},[1600],{"type":70,"value":1116},{"type":65,"tag":579,"props":1602,"children":1603},{"style":592},[1604],{"type":70,"value":1605}," --dry-run\n",{"type":65,"tag":73,"props":1607,"children":1608},{},[1609],{"type":65,"tag":77,"props":1610,"children":1611},{},[1612,1622,1624,1629,1631,1637,1639,1645,1647,1653],{"type":65,"tag":81,"props":1613,"children":1614},{},[1615,1620],{"type":65,"tag":155,"props":1616,"children":1618},{"className":1617},[],[1619],{"type":70,"value":1503},{"type":70,"value":1621}," flag:",{"type":70,"value":1623}," If the user's auth mode is known from ",{"type":65,"tag":155,"props":1625,"children":1627},{"className":1626},[],[1628],{"type":70,"value":383},{"type":70,"value":1630},", append ",{"type":65,"tag":155,"props":1632,"children":1634},{"className":1633},[],[1635],{"type":70,"value":1636},"--authmode obo",{"type":70,"value":1638}," or ",{"type":65,"tag":155,"props":1640,"children":1642},{"className":1641},[],[1643],{"type":70,"value":1644},"--authmode s2s",{"type":70,"value":1646}," to all ",{"type":65,"tag":155,"props":1648,"children":1650},{"className":1649},[],[1651],{"type":70,"value":1652},"setup all",{"type":70,"value":1654}," commands. This controls how the agent identity SP receives permissions (OBO = principal-scoped delegated grants, S2S = application app-role assignments requiring GA).",{"type":65,"tag":77,"props":1656,"children":1657},{},[1658],{"type":70,"value":1659},"Show the full dry-run output to the user, then ask:",{"type":65,"tag":73,"props":1661,"children":1662},{},[1663],{"type":65,"tag":77,"props":1664,"children":1665},{},[1666,1668,1673,1675,1680,1682,1687],{"type":70,"value":1667},"\"Here's what ",{"type":65,"tag":155,"props":1669,"children":1671},{"className":1670},[],[1672],{"type":70,"value":1365},{"type":70,"value":1674}," will create. Does this look correct? Type ",{"type":65,"tag":81,"props":1676,"children":1677},{},[1678],{"type":70,"value":1679},"yes",{"type":70,"value":1681}," to proceed or ",{"type":65,"tag":81,"props":1683,"children":1684},{},[1685],{"type":70,"value":1686},"no",{"type":70,"value":1688}," to abort.\"",{"type":65,"tag":89,"props":1690,"children":1691},{},[1692,1701],{"type":65,"tag":93,"props":1693,"children":1694},{},[1695,1699],{"type":65,"tag":81,"props":1696,"children":1697},{},[1698],{"type":70,"value":1686},{"type":70,"value":1700},": Stop. Tell the user \"Setup cancelled. Run the make-a365-agent skill again when ready.\"",{"type":65,"tag":93,"props":1702,"children":1703},{},[1704,1708],{"type":65,"tag":81,"props":1705,"children":1706},{},[1707],{"type":70,"value":1679},{"type":70,"value":1709},": Proceed to 2.2.",{"type":65,"tag":553,"props":1711,"children":1713},{"id":1712},"_22-apply-setup",[1714],{"type":70,"value":1715},"2.2 — Apply setup",{"type":65,"tag":73,"props":1717,"children":1718},{},[1719],{"type":65,"tag":77,"props":1720,"children":1721},{},[1722,1724,1734,1736,1742,1744,1750],{"type":70,"value":1723},"⚠️ ",{"type":65,"tag":81,"props":1725,"children":1726},{},[1727,1732],{"type":65,"tag":155,"props":1728,"children":1730},{"className":1729},[],[1731],{"type":70,"value":1365},{"type":70,"value":1733}," is long-running and block-buffers under chat-tool execution.",{"type":70,"value":1735}," If output stalls, see ",{"type":65,"tag":1004,"props":1737,"children":1739},{"href":1738},"..\u002F..\u002F..\u002F..\u002FAGENTS.md#cli-output-buffering-under-chat-tool-execution",[1740],{"type":70,"value":1741},"AGENTS.md § CLI output buffering under chat-tool execution",{"type":70,"value":1743}," — preferred remediation is ",{"type":65,"tag":155,"props":1745,"children":1747},{"className":1746},[],[1748],{"type":70,"value":1749},"run_in_background: true",{"type":70,"value":1751}," (Claude Code Bash tool); fallback is hand-off to a separate terminal.",{"type":65,"tag":77,"props":1753,"children":1754},{},[1755],{"type":70,"value":1756},"Choose the right flags based on the detected agent type:",{"type":65,"tag":425,"props":1758,"children":1760},{"className":571,"code":1759,"language":573,"meta":433,"style":433},"# Agent (Non AI Teammate) — default\ncd \"\u003Cproject_dir>\" && a365 setup all --agent-name \u003Cagent_name>\n\n# With explicit auth mode (append based on .a365-workspace-detection.local.json authMode)\ncd \"\u003Cproject_dir>\" && a365 setup all --agent-name \u003Cagent_name> --authmode obo\ncd \"\u003Cproject_dir>\" && a365 setup all --agent-name \u003Cagent_name> --authmode s2s\n\n# Custom Engine Agent (CEA) with Teams\u002FCopilot integration — add --m365\ncd \"\u003Cproject_dir>\" && a365 setup all --agent-name \u003Cagent_name> --m365\n",[1761],{"type":65,"tag":155,"props":1762,"children":1763},{"__ignoreMap":433},[1764,1773,1828,1837,1846,1912,1977,1985,1994],{"type":65,"tag":579,"props":1765,"children":1766},{"class":581,"line":582},[1767],{"type":65,"tag":579,"props":1768,"children":1770},{"style":1769},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1771],{"type":70,"value":1772},"# Agent (Non AI Teammate) — default\n",{"type":65,"tag":579,"props":1774,"children":1775},{"class":581,"line":30},[1776,1780,1784,1788,1792,1796,1800,1804,1808,1812,1816,1820,1824],{"type":65,"tag":579,"props":1777,"children":1778},{"style":1540},[1779],{"type":70,"value":1543},{"type":65,"tag":579,"props":1781,"children":1782},{"style":603},[1783],{"type":70,"value":1548},{"type":65,"tag":579,"props":1785,"children":1786},{"style":592},[1787],{"type":70,"value":1553},{"type":65,"tag":579,"props":1789,"children":1790},{"style":603},[1791],{"type":70,"value":1558},{"type":65,"tag":579,"props":1793,"children":1794},{"style":603},[1795],{"type":70,"value":1563},{"type":65,"tag":579,"props":1797,"children":1798},{"style":586},[1799],{"type":70,"value":1568},{"type":65,"tag":579,"props":1801,"children":1802},{"style":592},[1803],{"type":70,"value":1573},{"type":65,"tag":579,"props":1805,"children":1806},{"style":592},[1807],{"type":70,"value":1578},{"type":65,"tag":579,"props":1809,"children":1810},{"style":592},[1811],{"type":70,"value":1583},{"type":65,"tag":579,"props":1813,"children":1814},{"style":603},[1815],{"type":70,"value":1100},{"type":65,"tag":579,"props":1817,"children":1818},{"style":592},[1819],{"type":70,"value":1592},{"type":65,"tag":579,"props":1821,"children":1822},{"style":1108},[1823],{"type":70,"value":1111},{"type":65,"tag":579,"props":1825,"children":1826},{"style":603},[1827],{"type":70,"value":1186},{"type":65,"tag":579,"props":1829,"children":1831},{"class":581,"line":1830},3,[1832],{"type":65,"tag":579,"props":1833,"children":1834},{"emptyLinePlaceholder":43},[1835],{"type":70,"value":1836},"\n",{"type":65,"tag":579,"props":1838,"children":1840},{"class":581,"line":1839},4,[1841],{"type":65,"tag":579,"props":1842,"children":1843},{"style":1769},[1844],{"type":70,"value":1845},"# With explicit auth mode (append based on .a365-workspace-detection.local.json authMode)\n",{"type":65,"tag":579,"props":1847,"children":1849},{"class":581,"line":1848},5,[1850,1854,1858,1862,1866,1870,1874,1878,1882,1886,1890,1894,1898,1902,1907],{"type":65,"tag":579,"props":1851,"children":1852},{"style":1540},[1853],{"type":70,"value":1543},{"type":65,"tag":579,"props":1855,"children":1856},{"style":603},[1857],{"type":70,"value":1548},{"type":65,"tag":579,"props":1859,"children":1860},{"style":592},[1861],{"type":70,"value":1553},{"type":65,"tag":579,"props":1863,"children":1864},{"style":603},[1865],{"type":70,"value":1558},{"type":65,"tag":579,"props":1867,"children":1868},{"style":603},[1869],{"type":70,"value":1563},{"type":65,"tag":579,"props":1871,"children":1872},{"style":586},[1873],{"type":70,"value":1568},{"type":65,"tag":579,"props":1875,"children":1876},{"style":592},[1877],{"type":70,"value":1573},{"type":65,"tag":579,"props":1879,"children":1880},{"style":592},[1881],{"type":70,"value":1578},{"type":65,"tag":579,"props":1883,"children":1884},{"style":592},[1885],{"type":70,"value":1583},{"type":65,"tag":579,"props":1887,"children":1888},{"style":603},[1889],{"type":70,"value":1100},{"type":65,"tag":579,"props":1891,"children":1892},{"style":592},[1893],{"type":70,"value":1592},{"type":65,"tag":579,"props":1895,"children":1896},{"style":1108},[1897],{"type":70,"value":1111},{"type":65,"tag":579,"props":1899,"children":1900},{"style":603},[1901],{"type":70,"value":1116},{"type":65,"tag":579,"props":1903,"children":1904},{"style":592},[1905],{"type":70,"value":1906}," --authmode",{"type":65,"tag":579,"props":1908,"children":1909},{"style":592},[1910],{"type":70,"value":1911}," obo\n",{"type":65,"tag":579,"props":1913,"children":1915},{"class":581,"line":1914},6,[1916,1920,1924,1928,1932,1936,1940,1944,1948,1952,1956,1960,1964,1968,1972],{"type":65,"tag":579,"props":1917,"children":1918},{"style":1540},[1919],{"type":70,"value":1543},{"type":65,"tag":579,"props":1921,"children":1922},{"style":603},[1923],{"type":70,"value":1548},{"type":65,"tag":579,"props":1925,"children":1926},{"style":592},[1927],{"type":70,"value":1553},{"type":65,"tag":579,"props":1929,"children":1930},{"style":603},[1931],{"type":70,"value":1558},{"type":65,"tag":579,"props":1933,"children":1934},{"style":603},[1935],{"type":70,"value":1563},{"type":65,"tag":579,"props":1937,"children":1938},{"style":586},[1939],{"type":70,"value":1568},{"type":65,"tag":579,"props":1941,"children":1942},{"style":592},[1943],{"type":70,"value":1573},{"type":65,"tag":579,"props":1945,"children":1946},{"style":592},[1947],{"type":70,"value":1578},{"type":65,"tag":579,"props":1949,"children":1950},{"style":592},[1951],{"type":70,"value":1583},{"type":65,"tag":579,"props":1953,"children":1954},{"style":603},[1955],{"type":70,"value":1100},{"type":65,"tag":579,"props":1957,"children":1958},{"style":592},[1959],{"type":70,"value":1592},{"type":65,"tag":579,"props":1961,"children":1962},{"style":1108},[1963],{"type":70,"value":1111},{"type":65,"tag":579,"props":1965,"children":1966},{"style":603},[1967],{"type":70,"value":1116},{"type":65,"tag":579,"props":1969,"children":1970},{"style":592},[1971],{"type":70,"value":1906},{"type":65,"tag":579,"props":1973,"children":1974},{"style":592},[1975],{"type":70,"value":1976}," s2s\n",{"type":65,"tag":579,"props":1978,"children":1980},{"class":581,"line":1979},7,[1981],{"type":65,"tag":579,"props":1982,"children":1983},{"emptyLinePlaceholder":43},[1984],{"type":70,"value":1836},{"type":65,"tag":579,"props":1986,"children":1988},{"class":581,"line":1987},8,[1989],{"type":65,"tag":579,"props":1990,"children":1991},{"style":1769},[1992],{"type":70,"value":1993},"# Custom Engine Agent (CEA) with Teams\u002FCopilot integration — add --m365\n",{"type":65,"tag":579,"props":1995,"children":1997},{"class":581,"line":1996},9,[1998,2002,2006,2010,2014,2018,2022,2026,2030,2034,2038,2042,2046,2050],{"type":65,"tag":579,"props":1999,"children":2000},{"style":1540},[2001],{"type":70,"value":1543},{"type":65,"tag":579,"props":2003,"children":2004},{"style":603},[2005],{"type":70,"value":1548},{"type":65,"tag":579,"props":2007,"children":2008},{"style":592},[2009],{"type":70,"value":1553},{"type":65,"tag":579,"props":2011,"children":2012},{"style":603},[2013],{"type":70,"value":1558},{"type":65,"tag":579,"props":2015,"children":2016},{"style":603},[2017],{"type":70,"value":1563},{"type":65,"tag":579,"props":2019,"children":2020},{"style":586},[2021],{"type":70,"value":1568},{"type":65,"tag":579,"props":2023,"children":2024},{"style":592},[2025],{"type":70,"value":1573},{"type":65,"tag":579,"props":2027,"children":2028},{"style":592},[2029],{"type":70,"value":1578},{"type":65,"tag":579,"props":2031,"children":2032},{"style":592},[2033],{"type":70,"value":1583},{"type":65,"tag":579,"props":2035,"children":2036},{"style":603},[2037],{"type":70,"value":1100},{"type":65,"tag":579,"props":2039,"children":2040},{"style":592},[2041],{"type":70,"value":1592},{"type":65,"tag":579,"props":2043,"children":2044},{"style":1108},[2045],{"type":70,"value":1111},{"type":65,"tag":579,"props":2047,"children":2048},{"style":603},[2049],{"type":70,"value":1116},{"type":65,"tag":579,"props":2051,"children":2052},{"style":592},[2053],{"type":70,"value":2054}," --m365\n",{"type":65,"tag":77,"props":2056,"children":2057},{},[2058,2070,2072,2077],{"type":65,"tag":81,"props":2059,"children":2060},{},[2061,2063,2069],{"type":70,"value":2062},"For CEA agents (",{"type":65,"tag":155,"props":2064,"children":2066},{"className":2065},[],[2067],{"type":70,"value":2068},"usesTeamsOrCopilot = 1",{"type":70,"value":1075},{"type":70,"value":2071}," after ",{"type":65,"tag":155,"props":2073,"children":2075},{"className":2074},[],[2076],{"type":70,"value":1652},{"type":70,"value":2078},", also run the bot permission step:",{"type":65,"tag":425,"props":2080,"children":2082},{"className":571,"code":2081,"language":573,"meta":433,"style":433},"a365 setup permissions bot\n",[2083],{"type":65,"tag":155,"props":2084,"children":2085},{"__ignoreMap":433},[2086],{"type":65,"tag":579,"props":2087,"children":2088},{"class":581,"line":582},[2089,2094,2098,2103],{"type":65,"tag":579,"props":2090,"children":2091},{"style":586},[2092],{"type":70,"value":2093},"a365",{"type":65,"tag":579,"props":2095,"children":2096},{"style":592},[2097],{"type":70,"value":1573},{"type":65,"tag":579,"props":2099,"children":2100},{"style":592},[2101],{"type":70,"value":2102}," permissions",{"type":65,"tag":579,"props":2104,"children":2105},{"style":592},[2106],{"type":70,"value":2107}," bot\n",{"type":65,"tag":77,"props":2109,"children":2110},{},[2111,2113,2118,2120,2126],{"type":70,"value":2112},"This is required for Messaging Bot API grants and must follow ",{"type":65,"tag":155,"props":2114,"children":2116},{"className":2115},[],[2117],{"type":70,"value":1652},{"type":70,"value":2119}," (which handles ",{"type":65,"tag":155,"props":2121,"children":2123},{"className":2122},[],[2124],{"type":70,"value":2125},"permissions mcp",{"type":70,"value":1215},{"type":65,"tag":77,"props":2128,"children":2129},{},[2130],{"type":70,"value":2131},"This command:",{"type":65,"tag":89,"props":2133,"children":2134},{},[2135,2140,2145,2150],{"type":65,"tag":93,"props":2136,"children":2137},{},[2138],{"type":70,"value":2139},"Creates the Agent 365 Blueprint in Entra ID (agent identity + app registration)",{"type":65,"tag":93,"props":2141,"children":2142},{},[2143],{"type":70,"value":2144},"Grants required Entra ID permissions",{"type":65,"tag":93,"props":2146,"children":2147},{},[2148],{"type":70,"value":2149},"For registration: makes the agent findable in the Agent 365 catalog",{"type":65,"tag":93,"props":2151,"children":2152},{},[2153,2155,2161],{"type":70,"value":2154},"For Custom Engine Agents (",{"type":65,"tag":155,"props":2156,"children":2158},{"className":2157},[],[2159],{"type":70,"value":2160},"--m365",{"type":70,"value":2162},"): registers the endpoint via MCP Platform",{"type":65,"tag":77,"props":2164,"children":2165},{},[2166],{"type":70,"value":2167},"Monitor output carefully:",{"type":65,"tag":89,"props":2169,"children":2170},{},[2171,2184,2189],{"type":65,"tag":93,"props":2172,"children":2173},{},[2174,2176,2182],{"type":70,"value":2175},"The CLI logs progress in numbered steps (e.g. ",{"type":65,"tag":155,"props":2177,"children":2179},{"className":2178},[],[2180],{"type":70,"value":2181},"[1\u002F5]",{"type":70,"value":2183},"). Watch for errors or warnings.",{"type":65,"tag":93,"props":2185,"children":2186},{},[2187],{"type":70,"value":2188},"Existing resources from a previous run are skipped — this is expected behavior.",{"type":65,"tag":93,"props":2190,"children":2191},{},[2192,2197],{"type":65,"tag":81,"props":2193,"children":2194},{},[2195],{"type":70,"value":2196},"If the command fails or prints any error\u002Fwarning block: show the full CLI output verbatim",{"type":70,"value":2198}," before consulting the error table below.",{"type":65,"tag":73,"props":2200,"children":2201},{},[2202,2220],{"type":65,"tag":77,"props":2203,"children":2204},{},[2205,2210,2212,2218],{"type":65,"tag":81,"props":2206,"children":2207},{},[2208],{"type":70,"value":2209},"Windows Account Manager (WAM):",{"type":70,"value":2211}," If you see ",{"type":65,"tag":155,"props":2213,"children":2215},{"className":2214},[],[2216],{"type":70,"value":2217},"\"Authenticating via Windows Account Manager...\"",{"type":70,"value":2219}," in the output, a native Windows sign-in dialog has appeared. Do NOT kill the process. Tell the user: \"A Windows sign-in dialog has appeared — please complete it. Setup will continue automatically after you sign in.\"",{"type":65,"tag":89,"props":2221,"children":2222},{},[2223,2244],{"type":65,"tag":93,"props":2224,"children":2225},{},[2226,2228,2234,2236,2242],{"type":70,"value":2227},"If no dialog appears on a headless machine: ",{"type":65,"tag":155,"props":2229,"children":2231},{"className":2230},[],[2232],{"type":70,"value":2233},"Ctrl+C",{"type":70,"value":2235},", run ",{"type":65,"tag":155,"props":2237,"children":2239},{"className":2238},[],[2240],{"type":70,"value":2241},"az login --allow-no-subscriptions",{"type":70,"value":2243}," to populate the token cache, then retry.",{"type":65,"tag":93,"props":2245,"children":2246},{},[2247,2252],{"type":65,"tag":81,"props":2248,"children":2249},{},[2250],{"type":70,"value":2251},"Conditional Access Policy (CAP):",{"type":70,"value":2253}," If WAM\u002Fbrowser auth is blocked by CAP (AADSTS53003, AADSTS53000), the CLI automatically falls back to device code flow — no user action needed.",{"type":65,"tag":77,"props":2255,"children":2256},{},[2257],{"type":65,"tag":81,"props":2258,"children":2259},{},[2260],{"type":70,"value":2261},"Handle these conditions:",{"type":65,"tag":929,"props":2263,"children":2264},{},[2265,2281],{"type":65,"tag":933,"props":2266,"children":2267},{},[2268],{"type":65,"tag":937,"props":2269,"children":2270},{},[2271,2276],{"type":65,"tag":941,"props":2272,"children":2273},{},[2274],{"type":70,"value":2275},"Condition",{"type":65,"tag":941,"props":2277,"children":2278},{},[2279],{"type":70,"value":2280},"Action",{"type":65,"tag":952,"props":2282,"children":2283},{},[2284,2301,2322,2355],{"type":65,"tag":937,"props":2285,"children":2286},{},[2287,2296],{"type":65,"tag":959,"props":2288,"children":2289},{},[2290],{"type":65,"tag":155,"props":2291,"children":2293},{"className":2292},[],[2294],{"type":70,"value":2295},"Graph API Forbidden \u002F Authorization_RequestDenied",{"type":65,"tag":959,"props":2297,"children":2298},{},[2299],{"type":70,"value":2300},"Stop. Resolve permission issue (return to a365-setup Step 2 or grant the role). Then re-run.",{"type":65,"tag":937,"props":2302,"children":2303},{},[2304,2309],{"type":65,"tag":959,"props":2305,"children":2306},{},[2307],{"type":70,"value":2308},"Interactive browser auth required",{"type":65,"tag":959,"props":2310,"children":2311},{},[2312,2314,2320],{"type":70,"value":2313},"If headless, instruct user to use ",{"type":65,"tag":155,"props":2315,"children":2317},{"className":2316},[],[2318],{"type":70,"value":2319},"az login --device-code",{"type":70,"value":2321}," first.",{"type":65,"tag":937,"props":2323,"children":2324},{},[2325,2336],{"type":65,"tag":959,"props":2326,"children":2327},{},[2328,2334],{"type":65,"tag":155,"props":2329,"children":2331},{"className":2330},[],[2332],{"type":70,"value":2333},"managerApplications",{"type":70,"value":2335}," error \u002F blueprint rejected",{"type":65,"tag":959,"props":2337,"children":2338},{},[2339,2341,2346,2348,2353],{"type":70,"value":2340},"Blueprint was created before May 2025 and lacks ",{"type":65,"tag":155,"props":2342,"children":2344},{"className":2343},[],[2345],{"type":70,"value":2333},{"type":70,"value":2347},". Delete and re-run ",{"type":65,"tag":155,"props":2349,"children":2351},{"className":2350},[],[2352],{"type":70,"value":1365},{"type":70,"value":2354},", or patch via Graph API.",{"type":65,"tag":937,"props":2356,"children":2357},{},[2358,2377],{"type":65,"tag":959,"props":2359,"children":2360},{},[2361,2367,2369,2375],{"type":65,"tag":155,"props":2362,"children":2364},{"className":2363},[],[2365],{"type":70,"value":2366},"AADSTS700016",{"type":70,"value":2368}," \u002F ",{"type":65,"tag":155,"props":2370,"children":2372},{"className":2371},[],[2373],{"type":70,"value":2374},"Authorization_IdentityNotFound",{"type":70,"value":2376}," immediately after blueprint creation",{"type":65,"tag":959,"props":2378,"children":2379},{},[2380],{"type":70,"value":2381},"Entra replication lag — the CLI retries automatically with exponential back-off (up to 5× for identity, 12× for blueprint token, 60-second cap). No manual retry needed; wait for the CLI to complete.",{"type":65,"tag":77,"props":2383,"children":2384},{},[2385,2390],{"type":65,"tag":155,"props":2386,"children":2388},{"className":2387},[],[2389],{"type":70,"value":1365},{"type":70,"value":2391}," is idempotent — safe to re-run after fixing an issue.",{"type":65,"tag":553,"props":2393,"children":2395},{"id":2394},"_23-show-setup-output",[2396],{"type":70,"value":2397},"2.3 — Show setup output",{"type":65,"tag":77,"props":2399,"children":2400},{},[2401,2403,2408],{"type":70,"value":2402},"After ",{"type":65,"tag":155,"props":2404,"children":2406},{"className":2405},[],[2407],{"type":70,"value":1365},{"type":70,"value":2409}," completes, show the user:",{"type":65,"tag":366,"props":2411,"children":2412},{},[2413,2423,2446],{"type":65,"tag":93,"props":2414,"children":2415},{},[2416,2421],{"type":65,"tag":81,"props":2417,"children":2418},{},[2419],{"type":70,"value":2420},"The Setup Summary table",{"type":70,"value":2422}," from CLI output — verbatim.",{"type":65,"tag":93,"props":2424,"children":2425},{},[2426,2437,2439,2444],{"type":65,"tag":81,"props":2427,"children":2428},{},[2429,2435],{"type":65,"tag":155,"props":2430,"children":2432},{"className":2431},[],[2433],{"type":70,"value":2434},"Agent365.Observability.OtelWrite",{"type":70,"value":2436}," is automatically granted",{"type":70,"value":2438}," to the agent identity by ",{"type":65,"tag":155,"props":2440,"children":2442},{"className":2441},[],[2443],{"type":70,"value":1365},{"type":70,"value":2445}," — no GA consent step required for newly provisioned agents. If the CLI output includes a \"Permission Grants\" action item (upgrade scenario for pre-1.1 agents), display the PowerShell script verbatim so the user can hand it to a Global Admin.",{"type":65,"tag":93,"props":2447,"children":2448},{},[2449,2454],{"type":65,"tag":81,"props":2450,"children":2451},{},[2452],{"type":70,"value":2453},"Skip the client secret action item entirely.",{"type":70,"value":2455}," Do not show or mention it.",{"type":65,"tag":77,"props":2457,"children":2458},{},[2459],{"type":70,"value":2460},"Mark Todo 1 as completed.",{"type":65,"tag":164,"props":2462,"children":2463},{},[],{"type":65,"tag":184,"props":2465,"children":2467},{"id":2466},"phase-3-add-observability-optional",[2468],{"type":70,"value":2469},"Phase 3 — Add Observability (Optional)",{"type":65,"tag":77,"props":2471,"children":2472},{},[2473],{"type":70,"value":2474},"Mark Todo 2 in-progress.",{"type":65,"tag":77,"props":2476,"children":2477},{},[2478],{"type":70,"value":2479},"Ask the user:",{"type":65,"tag":425,"props":2481,"children":2484},{"className":2482,"code":2483,"language":70},[428],"Your agent is provisioned. Observability lets you track every message, LLM call, and tool\ninvocation in the Agent 365 portal and Microsoft Defender.\n\n  Would you like to add observability now?\n    • yes  — I'll run the instrument-observability skill now\n    • skip — you can add it later by running the instrument-observability skill\n",[2485],{"type":65,"tag":155,"props":2486,"children":2487},{"__ignoreMap":433},[2488],{"type":70,"value":2483},{"type":65,"tag":77,"props":2490,"children":2491},{},[2492,2497,2498,2502,2503,2509],{"type":65,"tag":81,"props":2493,"children":2494},{},[2495],{"type":70,"value":2496},"If yes:",{"type":70,"value":279},{"type":65,"tag":81,"props":2499,"children":2500},{},[2501],{"type":70,"value":376},{"type":70,"value":279},{"type":65,"tag":155,"props":2504,"children":2506},{"className":2505},[],[2507],{"type":70,"value":2508},"${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Finstrument-observability\u002FSKILL.md",{"type":70,"value":2510}," and follow it.\nThe skill will detect the project language and wire up OTel + A365 tracing exporter.",{"type":65,"tag":77,"props":2512,"children":2513},{},[2514,2519,2521,2527],{"type":65,"tag":81,"props":2515,"children":2516},{},[2517],{"type":70,"value":2518},"If skip:",{"type":70,"value":2520}," Note that the user can run the ",{"type":65,"tag":155,"props":2522,"children":2524},{"className":2523},[],[2525],{"type":70,"value":2526},"instrument-observability",{"type":70,"value":2528}," skill at any time.",{"type":65,"tag":77,"props":2530,"children":2531},{},[2532],{"type":70,"value":2533},"Mark Todo 2 as completed when done (or skipped by user).",{"type":65,"tag":164,"props":2535,"children":2536},{},[],{"type":65,"tag":184,"props":2538,"children":2540},{"id":2539},"phase-4-add-workiq-tools-optional",[2541],{"type":70,"value":2542},"Phase 4 — Add WorkIQ Tools (Optional)",{"type":65,"tag":77,"props":2544,"children":2545},{},[2546],{"type":70,"value":2547},"Mark Todo 3 in-progress.",{"type":65,"tag":77,"props":2549,"children":2550},{},[2551,2562],{"type":65,"tag":81,"props":2552,"children":2553},{},[2554,2555,2561],{"type":70,"value":687},{"type":65,"tag":155,"props":2556,"children":2558},{"className":2557},[],[2559],{"type":70,"value":2560},"authMode = s2s",{"type":70,"value":1422},{"type":70,"value":2563}," Skip this phase entirely — WorkIQ is not available for S2S agents (requires a user token). Mark Todo 3 as completed and proceed to Phase 5.",{"type":65,"tag":77,"props":2565,"children":2566},{},[2567],{"type":70,"value":2479},{"type":65,"tag":425,"props":2569,"children":2572},{"className":2570,"code":2571,"language":70},[428],"Would you like to add WorkIQ tools? These give your agent access to Microsoft 365 data —\nemail, calendar, Teams messages, SharePoint files, OneDrive, and more.\n\nNote: WorkIQ MCP calls use OAuth On-Behalf-Of (OBO) tokens. Users will be prompted to\nconsent the first time the agent accesses their data.\n\n  • yes  — I'll run the add-workiq-tools skill now\n  • skip — you can add it later by running the add-workiq-tools skill\n",[2573],{"type":65,"tag":155,"props":2574,"children":2575},{"__ignoreMap":433},[2576],{"type":70,"value":2571},{"type":65,"tag":77,"props":2578,"children":2579},{},[2580,2584,2585,2589,2590,2596],{"type":65,"tag":81,"props":2581,"children":2582},{},[2583],{"type":70,"value":2496},{"type":70,"value":279},{"type":65,"tag":81,"props":2586,"children":2587},{},[2588],{"type":70,"value":376},{"type":70,"value":279},{"type":65,"tag":155,"props":2591,"children":2593},{"className":2592},[],[2594],{"type":70,"value":2595},"${CLAUDE_PLUGIN_ROOT}\u002Fskills\u002Fadd-workiq-tools\u002FSKILL.md",{"type":70,"value":2597}," and follow it.",{"type":65,"tag":77,"props":2599,"children":2600},{},[2601,2605,2606,2612],{"type":65,"tag":81,"props":2602,"children":2603},{},[2604],{"type":70,"value":2518},{"type":70,"value":2520},{"type":65,"tag":155,"props":2607,"children":2609},{"className":2608},[],[2610],{"type":70,"value":2611},"add-workiq-tools",{"type":70,"value":2528},{"type":65,"tag":77,"props":2614,"children":2615},{},[2616],{"type":70,"value":2617},"Mark Todo 3 as completed when done (or skipped by user).",{"type":65,"tag":164,"props":2619,"children":2620},{},[],{"type":65,"tag":184,"props":2622,"children":2624},{"id":2623},"phase-5-final-summary",[2625],{"type":70,"value":2626},"Phase 5 — Final Summary",{"type":65,"tag":77,"props":2628,"children":2629},{},[2630],{"type":70,"value":2631},"Show the user a summary:",{"type":65,"tag":425,"props":2633,"children":2636},{"className":2634,"code":2635,"language":70},[428],"✅ Agent provisioned with Agent 365!\n\nYour agent now has:\n  • Blueprint:       Created in Entra ID (Blueprint ID in `a365.generated.config.json`)\n  • Register: Agent appears in the Agent 365 catalog\n  [• Observability:  OpenTelemetry + A365 tracing exporter wired]  (if added)\n  [• WorkIQ tools:   M365 data access via MCP]                     (if added)\n\nNext steps:\n  1. If admin consent was required, ensure a Global Admin has run the PowerShell script.\n  2. Test discovery: search for your agent in Microsoft 365 apps.\n  3. Add observability:  run the instrument-observability skill  (if not done)\n  4. Add WorkIQ tools:   run the add-workiq-tools skill          (if not done)\n",[2637],{"type":65,"tag":155,"props":2638,"children":2639},{"__ignoreMap":433},[2640],{"type":70,"value":2635},{"type":65,"tag":164,"props":2642,"children":2643},{},[],{"type":65,"tag":184,"props":2645,"children":2647},{"id":2646},"error-handling",[2648],{"type":70,"value":2649},"Error Handling",{"type":65,"tag":77,"props":2651,"children":2652},{},[2653,2658,2660,2665],{"type":65,"tag":81,"props":2654,"children":2655},{},[2656],{"type":70,"value":2657},"CLI error surfacing:",{"type":70,"value":2659}," When any CLI command exits non-zero or prints a warning or error line, ",{"type":65,"tag":81,"props":2661,"children":2662},{},[2663],{"type":70,"value":2664},"show the complete output verbatim",{"type":70,"value":2666}," in a fenced code block before suggesting a fix. Do not abstract, paraphrase, or discard CLI output — the exact error message is always more useful than a summary. If the error is not in the table below, display it and ask the user how to proceed.",{"type":65,"tag":89,"props":2668,"children":2669},{},[2670,2690,2718,2730],{"type":65,"tag":93,"props":2671,"children":2672},{},[2673,2675,2681,2682,2688],{"type":70,"value":2674},"Run failing commands with ",{"type":65,"tag":155,"props":2676,"children":2678},{"className":2677},[],[2679],{"type":70,"value":2680},"-v",{"type":70,"value":2368},{"type":65,"tag":155,"props":2683,"children":2685},{"className":2684},[],[2686],{"type":70,"value":2687},"--verbose",{"type":70,"value":2689}," for detailed logs.",{"type":65,"tag":93,"props":2691,"children":2692},{},[2693,2695,2701,2703,2709,2711,2717],{"type":70,"value":2694},"Manage and locate CLI diagnostic logs via ",{"type":65,"tag":155,"props":2696,"children":2698},{"className":2697},[],[2699],{"type":70,"value":2700},"a365 logs --help",{"type":70,"value":2702},". Log files live at Windows ",{"type":65,"tag":155,"props":2704,"children":2706},{"className":2705},[],[2707],{"type":70,"value":2708},"%APPDATA%\u002Fa365\u002Flogs\u002F",{"type":70,"value":2710},", Linux\u002FMac ",{"type":65,"tag":155,"props":2712,"children":2714},{"className":2713},[],[2715],{"type":70,"value":2716},"~\u002F.config\u002Fa365\u002Flogs\u002F",{"type":70,"value":841},{"type":65,"tag":93,"props":2719,"children":2720},{},[2721,2723,2728],{"type":70,"value":2722},"Most ",{"type":65,"tag":155,"props":2724,"children":2726},{"className":2725},[],[2727],{"type":70,"value":2093},{"type":70,"value":2729}," commands are idempotent — safe to re-run after fixing an issue.",{"type":65,"tag":93,"props":2731,"children":2732},{},[2733,2735,2741,2743,2749,2750,2756,2758,2764],{"type":70,"value":2734},"For a full cleanup of a config-free agent: ",{"type":65,"tag":155,"props":2736,"children":2738},{"className":2737},[],[2739],{"type":70,"value":2740},"a365 cleanup --agent-name \u003Cname>",{"type":70,"value":2742},". For granular cleanup: ",{"type":65,"tag":155,"props":2744,"children":2746},{"className":2745},[],[2747],{"type":70,"value":2748},"a365 cleanup blueprint",{"type":70,"value":218},{"type":65,"tag":155,"props":2751,"children":2753},{"className":2752},[],[2754],{"type":70,"value":2755},"a365 cleanup azure",{"type":70,"value":2757},", or ",{"type":65,"tag":155,"props":2759,"children":2761},{"className":2760},[],[2762],{"type":70,"value":2763},"a365 cleanup instance",{"type":70,"value":2765},". Use only as a last resort.",{"type":65,"tag":2767,"props":2768,"children":2769},"style",{},[2770],{"type":70,"value":2771},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2773,"total":582},[2774],{"slug":4,"name":4,"fn":5,"description":6,"org":2775,"tags":2776,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2777,2778,2779,2780,2781],{"name":21,"slug":22,"type":15},{"name":24,"slug":25,"type":15},{"name":9,"slug":8,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"items":2783,"total":2976},[2784,2806,2825,2846,2861,2878,2889,2902,2917,2932,2951,2964],{"slug":2785,"name":2785,"fn":2786,"description":2787,"org":2788,"tags":2789,"stars":2803,"repoUrl":2804,"updatedAt":2805},"rushstack-best-practices","manage Rush monorepos with best practices","Provides best practices and guidance for working with Rush monorepos. Use when the user is working in a Rush-based repository, asks about Rush commands (install, update, build, rebuild), needs help with project selection, dependency management, build caching, subspace configuration, or troubleshooting Rush-specific issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2790,2793,2796,2797,2800],{"name":2791,"slug":2792,"type":15},"Engineering","engineering",{"name":2794,"slug":2795,"type":15},"Local Development","local-development",{"name":9,"slug":8,"type":15},{"name":2798,"slug":2799,"type":15},"Project Management","project-management",{"name":2801,"slug":2802,"type":15},"Rush","rush",6484,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frushstack","2026-04-06T18:34:44.965032",{"slug":2807,"name":2807,"fn":2808,"description":2809,"org":2810,"tags":2811,"stars":2822,"repoUrl":2823,"updatedAt":2824},"azure-ai-agents-persistent-dotnet","build AI agents with Azure .NET SDK","Azure AI Agents Persistent SDK for .NET. Low-level SDK for creating and managing AI agents with threads, messages, runs, and tools. Use for agent CRUD, conversation threads, streaming responses, function calling, file search, and code interpreter. Triggers: \"PersistentAgentsClient\", \"persistent agents\", \"agent threads\", \"agent runs\", \"streaming agents\", \"function calling agents .NET\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2812,2815,2816,2819],{"name":2813,"slug":2814,"type":15},".NET","net",{"name":21,"slug":22,"type":15},{"name":2817,"slug":2818,"type":15},"Azure","azure",{"name":2820,"slug":2821,"type":15},"LLM","llm",2804,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills","2026-07-03T16:32:10.297433",{"slug":2826,"name":2826,"fn":2827,"description":2828,"org":2829,"tags":2830,"stars":2822,"repoUrl":2823,"updatedAt":2845},"azure-ai-anomalydetector-java","build anomaly detection applications with Java","Build anomaly detection applications with Azure AI Anomaly Detector SDK for Java. Use when implementing univariate\u002Fmultivariate anomaly detection, time-series analysis, or AI-powered monitoring.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2831,2834,2835,2838,2841,2842],{"name":2832,"slug":2833,"type":15},"Analytics","analytics",{"name":2817,"slug":2818,"type":15},{"name":2836,"slug":2837,"type":15},"Data Analysis","data-analysis",{"name":2839,"slug":2840,"type":15},"Java","java",{"name":9,"slug":8,"type":15},{"name":2843,"slug":2844,"type":15},"Monitoring","monitoring","2026-05-13T06:14:16.261754",{"slug":2847,"name":2847,"fn":2848,"description":2849,"org":2850,"tags":2851,"stars":2822,"repoUrl":2823,"updatedAt":2860},"azure-ai-contentsafety-java","build content moderation applications with Azure AI","Build content moderation applications with Azure AI Content Safety SDK for Java. Use when implementing text\u002Fimage analysis, blocklist management, or harm detection for hate, violence, sexual content, and self-harm.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2852,2855,2856,2857],{"name":2853,"slug":2854,"type":15},"AI Infrastructure","ai-infrastructure",{"name":2817,"slug":2818,"type":15},{"name":2839,"slug":2840,"type":15},{"name":2858,"slug":2859,"type":15},"Security","security","2026-07-07T06:53:31.293235",{"slug":2862,"name":2862,"fn":2863,"description":2864,"org":2865,"tags":2866,"stars":2822,"repoUrl":2823,"updatedAt":2877},"azure-ai-contentsafety-py","detect harmful content with Azure AI Content Safety","Azure AI Content Safety SDK for Python. Use for detecting harmful content in text and images with multi-severity classification.\nTriggers: \"azure-ai-contentsafety\", \"ContentSafetyClient\", \"content moderation\", \"harmful content\", \"text analysis\", \"image analysis\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2867,2868,2871,2872,2873,2876],{"name":2817,"slug":2818,"type":15},{"name":2869,"slug":2870,"type":15},"Compliance","compliance",{"name":2820,"slug":2821,"type":15},{"name":9,"slug":8,"type":15},{"name":2874,"slug":2875,"type":15},"Python","python",{"name":2858,"slug":2859,"type":15},"2026-07-18T05:14:23.017504",{"slug":2879,"name":2879,"fn":2880,"description":2881,"org":2882,"tags":2883,"stars":2822,"repoUrl":2823,"updatedAt":2888},"azure-ai-language-conversations-py","implement conversational language understanding with Python","Implement Conversational Language Understanding (CLU) using the azure-ai-language-conversations Python SDK. Use when working with ConversationAnalysisClient to analyze conversation intent and entities, building NLP features, or integrating language understanding into applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2884,2885,2886,2887],{"name":2832,"slug":2833,"type":15},{"name":2817,"slug":2818,"type":15},{"name":2820,"slug":2821,"type":15},{"name":2874,"slug":2875,"type":15},"2026-07-31T05:54:29.068751",{"slug":2890,"name":2890,"fn":2891,"description":2892,"org":2893,"tags":2894,"stars":2822,"repoUrl":2823,"updatedAt":2901},"azure-ai-translation-text-py","translate text using Azure AI services","Azure AI Text Translation SDK for real-time text translation, transliteration, language detection, and dictionary lookup. Use for translating text content in applications.\nTriggers: \"text translation\", \"translator\", \"translate text\", \"transliterate\", \"TextTranslationClient\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2895,2898,2899,2900],{"name":2896,"slug":2897,"type":15},"API Development","api-development",{"name":2817,"slug":2818,"type":15},{"name":9,"slug":8,"type":15},{"name":2874,"slug":2875,"type":15},"2026-07-18T05:14:16.988376",{"slug":2903,"name":2903,"fn":2904,"description":2905,"org":2906,"tags":2907,"stars":2822,"repoUrl":2823,"updatedAt":2916},"azure-ai-vision-imageanalysis-py","analyze images with Azure AI Vision","Azure AI Vision Image Analysis SDK for captions, tags, objects, OCR, people detection, and smart cropping. Use for computer vision and image understanding tasks.\nTriggers: \"image analysis\", \"computer vision\", \"OCR\", \"object detection\", \"ImageAnalysisClient\", \"image caption\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2908,2909,2912,2915],{"name":2817,"slug":2818,"type":15},{"name":2910,"slug":2911,"type":15},"Computer Vision","computer-vision",{"name":2913,"slug":2914,"type":15},"Images","images",{"name":2874,"slug":2875,"type":15},"2026-07-18T05:14:18.007737",{"slug":2918,"name":2918,"fn":2919,"description":2920,"org":2921,"tags":2922,"stars":2822,"repoUrl":2823,"updatedAt":2931},"azure-appconfiguration-java","manage configuration with Azure App Configuration","Azure App Configuration SDK for Java. Centralized application configuration management with key-value settings, feature flags, and snapshots.\nTriggers: \"ConfigurationClient java\", \"app configuration java\", \"feature flag java\", \"configuration setting java\", \"azure config java\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2923,2924,2927,2930],{"name":2817,"slug":2818,"type":15},{"name":2925,"slug":2926,"type":15},"Configuration","configuration",{"name":2928,"slug":2929,"type":15},"Feature Flags","feature-flags",{"name":2839,"slug":2840,"type":15},"2026-07-03T16:32:01.278468",{"slug":2933,"name":2933,"fn":2934,"description":2935,"org":2936,"tags":2937,"stars":2822,"repoUrl":2823,"updatedAt":2950},"azure-cosmos-rust","build applications with Azure Cosmos DB","Azure Cosmos DB library for Rust (NoSQL API). Document CRUD, containers, and globally distributed data.\nTriggers: \"cosmos db rust\", \"CosmosClient rust\", \"document crud rust\", \"NoSQL rust\", \"partition key rust\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2938,2941,2944,2947],{"name":2939,"slug":2940,"type":15},"Cosmos DB","cosmos-db",{"name":2942,"slug":2943,"type":15},"Database","database",{"name":2945,"slug":2946,"type":15},"NoSQL","nosql",{"name":2948,"slug":2949,"type":15},"Rust","rust","2026-07-31T05:54:27.021432",{"slug":2952,"name":2952,"fn":2934,"description":2953,"org":2954,"tags":2955,"stars":2822,"repoUrl":2823,"updatedAt":2963},"azure-cosmos-ts","Azure Cosmos DB JavaScript\u002FTypeScript SDK (@azure\u002Fcosmos) for data plane operations. Use for CRUD operations on documents, queries, bulk operations, and container management. Triggers: \"Cosmos DB\", \"@azure\u002Fcosmos\", \"CosmosClient\", \"document CRUD\", \"NoSQL queries\", \"bulk operations\", \"partition key\", \"container.items\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2956,2957,2958,2959,2960],{"name":2939,"slug":2940,"type":15},{"name":2942,"slug":2943,"type":15},{"name":9,"slug":8,"type":15},{"name":2945,"slug":2946,"type":15},{"name":2961,"slug":2962,"type":15},"TypeScript","typescript","2026-07-03T16:31:19.368382",{"slug":2965,"name":2965,"fn":2966,"description":2967,"org":2968,"tags":2969,"stars":2822,"repoUrl":2823,"updatedAt":2975},"azure-data-tables-java","build table storage applications with Java","Build table storage applications with Azure Tables SDK for Java. Use when working with Azure Table Storage or Cosmos DB Table API for NoSQL key-value data, schemaless storage, or structured data at scale.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2970,2971,2972,2973,2974],{"name":2817,"slug":2818,"type":15},{"name":2939,"slug":2940,"type":15},{"name":2942,"slug":2943,"type":15},{"name":2839,"slug":2840,"type":15},{"name":2945,"slug":2946,"type":15},"2026-05-13T06:14:17.582229",267]