@cursor/july 0.1.95 → 0.1.97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +3 -4
- package/README.md +3 -2
- package/dist/bin/agent-serve.js +14 -3
- package/dist/channels/deployments/types.d.ts +1 -1
- package/dist/channels/deployments/types.d.ts.map +1 -1
- package/dist/channels/deployments/types.js +1 -0
- package/dist/channels/origin/api.d.ts +72 -15
- package/dist/channels/origin/api.d.ts.map +1 -1
- package/dist/channels/origin/api.js +185 -28
- package/dist/channels/origin/binding.d.ts +13 -2
- package/dist/channels/origin/binding.d.ts.map +1 -1
- package/dist/channels/origin/binding.js +41 -25
- package/dist/channels/origin/checks.d.ts +6 -6
- package/dist/channels/origin/checks.js +6 -6
- package/dist/channels/origin/cursor-account.d.ts +5 -3
- package/dist/channels/origin/cursor-account.d.ts.map +1 -1
- package/dist/channels/origin/cursor-account.js +5 -3
- package/dist/channels/origin/index.d.ts +1 -0
- package/dist/channels/origin/index.d.ts.map +1 -1
- package/dist/channels/origin/index.js +1 -0
- package/dist/channels/origin/origin-channel.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.js +3 -0
- package/dist/channels/origin/reactions.d.ts +56 -0
- package/dist/channels/origin/reactions.d.ts.map +1 -0
- package/dist/channels/origin/reactions.js +67 -0
- package/dist/channels/origin/types.d.ts +11 -0
- package/dist/channels/origin/types.d.ts.map +1 -1
- package/dist/channels/slack/api.d.ts +9 -0
- package/dist/channels/slack/api.d.ts.map +1 -1
- package/dist/channels/slack/api.js +36 -5
- package/dist/channels/slack/approvals.d.ts +16 -0
- package/dist/channels/slack/approvals.d.ts.map +1 -1
- package/dist/channels/slack/approvals.js +86 -0
- package/dist/channels/slack/cli-project.d.ts +19 -0
- package/dist/channels/slack/cli-project.d.ts.map +1 -0
- package/dist/channels/slack/cli-project.js +234 -0
- package/dist/channels/slack/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +110 -81
- package/dist/channels/slack/dispatch.d.ts +7 -1
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +47 -23
- package/dist/channels/slack/inbound.d.ts +8 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +32 -0
- package/dist/channels/slack/init.d.ts +3 -2
- package/dist/channels/slack/init.d.ts.map +1 -1
- package/dist/channels/slack/init.js +5 -5
- package/dist/channels/slack/interactive.d.ts +2 -1
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +15 -4
- package/dist/channels/slack/live-delivery.d.ts +26 -29
- package/dist/channels/slack/live-delivery.d.ts.map +1 -1
- package/dist/channels/slack/live-delivery.js +172 -73
- package/dist/channels/slack/manifest.d.ts +1 -1
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +6 -2
- package/dist/channels/slack/nudge-carrier.d.ts +2 -0
- package/dist/channels/slack/nudge-carrier.d.ts.map +1 -1
- package/dist/channels/slack/nudge-carrier.js +48 -1
- package/dist/channels/slack/setup.d.ts +1 -1
- package/dist/channels/slack/setup.d.ts.map +1 -1
- package/dist/channels/slack/setup.js +10 -6
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +3 -2
- package/dist/channels/slack/tool-approval-events.d.ts.map +1 -1
- package/dist/channels/slack/tool-approval-events.js +91 -1
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.BBj0klBO.js → app.B3rWNYE1.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.BU9nHdnQ.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.CUEXpL78.js → VPLocalSearchBox.C1lhqJJR.js} +1 -1
- package/dist/docs/assets/chunks/{theme.DabmQnia.js → theme.B40_SXuv.js} +2 -2
- package/dist/docs/assets/{deployment.md.D9msOFOW.js → deployment.md.MFPKqsqI.js} +2 -2
- package/dist/docs/assets/{guides_mcp-oauth.md.DPYmBCbV.js → guides_mcp-oauth.md.CN-6YmTJ.js} +4 -4
- package/dist/docs/assets/{guides_mcp-oauth.md.DPYmBCbV.lean.js → guides_mcp-oauth.md.CN-6YmTJ.lean.js} +1 -1
- package/dist/docs/assets/guides_slack.md.VDXQV3ja.js +22 -0
- package/dist/docs/assets/guides_slack.md.VDXQV3ja.lean.js +1 -0
- package/dist/docs/assets/index.md.CVeRUOeZ.js +5 -0
- package/dist/docs/assets/{index.md.BoHaMdeZ.lean.js → index.md.CVeRUOeZ.lean.js} +1 -1
- package/dist/docs/assets/{reference_agent-config.md.Cp_x38Nl.js → reference_agent-config.md.BHeYMgme.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.BsMOxDvh.js → reference_cli.md.RyZf5OTE.js} +10 -6
- package/dist/docs/assets/{reference_cli.md.BsMOxDvh.lean.js → reference_cli.md.RyZf5OTE.lean.js} +1 -1
- package/dist/docs/assets/{reference_connections.md.BH8Oc0D0.js → reference_connections.md.DxldvyIB.js} +4 -3
- package/dist/docs/assets/{reference_http-api.md.D89k1mdm.js → reference_http-api.md.5zOAbV86.js} +1 -1
- package/dist/docs/assets/reference_sessions.md.NxFP_CAC.js +1 -0
- package/dist/docs/assets/{reference_tools.md.BHeXn2id.js → reference_tools.md.B84gw9Ii.js} +1 -1
- package/dist/docs/assets/templates_agents-md.md.CXSMZljE.js +2 -0
- package/dist/docs/assets/templates_agents-md.md.CXSMZljE.lean.js +1 -0
- package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.js +2 -0
- package/dist/docs/assets/templates_code-wiki.md.CDYZIBFN.lean.js +1 -0
- package/dist/docs/assets/troubleshooting.md.DCiPBhYs.js +1 -0
- package/dist/docs/building-with-agents.html +4 -4
- package/dist/docs/concepts.html +4 -4
- package/dist/docs/deployment.html +7 -7
- package/dist/docs/deployment.md +5 -4
- package/dist/docs/evals.html +4 -4
- package/dist/docs/guides/agent-to-agent.html +4 -4
- package/dist/docs/guides/cloud-runtime.html +4 -4
- package/dist/docs/guides/convert-automation.html +4 -4
- package/dist/docs/guides/github.html +4 -4
- package/dist/docs/guides/human-in-the-loop.html +4 -4
- package/dist/docs/guides/mcp-oauth.html +8 -8
- package/dist/docs/guides/mcp-oauth.md +26 -8
- package/dist/docs/guides/opentelemetry.html +4 -4
- package/dist/docs/guides/slack.html +17 -33
- package/dist/docs/guides/slack.md +92 -201
- package/dist/docs/guides/webhooks.html +4 -4
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +4 -4
- package/dist/docs/index.html +6 -6
- package/dist/docs/index.md +7 -3
- package/dist/docs/llms-full.txt +398 -653
- package/dist/docs/llms.txt +3 -2
- package/dist/docs/quickstart.html +4 -4
- package/dist/docs/reference/agent-config.html +6 -6
- package/dist/docs/reference/agent-config.md +2 -2
- package/dist/docs/reference/artifacts.html +4 -4
- package/dist/docs/reference/channels.html +4 -4
- package/dist/docs/reference/cli.html +14 -10
- package/dist/docs/reference/cli.md +39 -16
- package/dist/docs/reference/connections.html +9 -8
- package/dist/docs/reference/connections.md +6 -3
- package/dist/docs/reference/hooks.html +4 -4
- package/dist/docs/reference/http-api.html +6 -6
- package/dist/docs/reference/http-api.md +2 -1
- package/dist/docs/reference/instructions.html +4 -4
- package/dist/docs/reference/playground.html +4 -4
- package/dist/docs/reference/project-layout.html +4 -4
- package/dist/docs/reference/prompt.html +4 -4
- package/dist/docs/reference/schedules.html +4 -4
- package/dist/docs/reference/sessions.html +5 -5
- package/dist/docs/reference/sessions.md +4 -2
- package/dist/docs/reference/skills.html +4 -4
- package/dist/docs/reference/subagents.html +4 -4
- package/dist/docs/reference/tools.html +6 -6
- package/dist/docs/reference/tools.md +9 -2
- package/dist/docs/scaffolding-agents.html +4 -4
- package/dist/docs/storage.html +4 -4
- package/dist/docs/templates/agentic-owners.html +4 -4
- package/dist/docs/templates/agents-md.html +28 -0
- package/dist/docs/templates/agents-md.md +105 -0
- package/dist/docs/templates/code-wiki.html +28 -0
- package/dist/docs/templates/code-wiki.md +91 -0
- package/dist/docs/templates/demo.html +5 -5
- package/dist/docs/templates/pr-autofixer.html +4 -4
- package/dist/docs/templates/security-help.html +4 -4
- package/dist/docs/templates/security-reviewer.html +5 -5
- package/dist/docs/templates/triage.html +4 -4
- package/dist/docs/troubleshooting.html +5 -5
- package/dist/docs/troubleshooting.md +2 -2
- package/dist/evals/run-facts.d.ts.map +1 -1
- package/dist/evals/run-facts.js +27 -0
- package/dist/files-backends/cursor-hosted.d.ts +26 -4
- package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/files-backends/cursor-hosted.js +32 -4
- package/dist/internal/advertise-tools.d.ts +2 -0
- package/dist/internal/advertise-tools.d.ts.map +1 -1
- package/dist/internal/advertise-tools.js +30 -10
- package/dist/internal/approval-gate.d.ts +12 -13
- package/dist/internal/approval-gate.d.ts.map +1 -1
- package/dist/internal/approval-gate.js +16 -21
- package/dist/internal/bounded.d.ts +7 -0
- package/dist/internal/bounded.d.ts.map +1 -0
- package/dist/internal/bounded.js +32 -0
- package/dist/internal/chat-client.js +10 -0
- package/dist/internal/cli-deploy.d.ts +5 -0
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +57 -18
- package/dist/internal/cli-mcp-oauth.js +8 -18
- package/dist/internal/cli-slack-manual.d.ts +24 -2
- package/dist/internal/cli-slack-manual.d.ts.map +1 -1
- package/dist/internal/cli-slack-manual.js +251 -20
- package/dist/internal/cli-slack.d.ts +9 -2
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +29 -82
- package/dist/internal/conversation-mirror.d.ts +11 -8
- package/dist/internal/conversation-mirror.d.ts.map +1 -1
- package/dist/internal/conversation-mirror.js +116 -55
- package/dist/internal/cursor/account-mcp.d.ts +1 -0
- package/dist/internal/cursor/account-mcp.d.ts.map +1 -1
- package/dist/internal/cursor/account-mcp.js +17 -0
- package/dist/internal/cursor/backend-client.d.ts.map +1 -1
- package/dist/internal/cursor/backend-client.js +22 -48
- package/dist/internal/cursor/session-token.d.ts +45 -0
- package/dist/internal/cursor/session-token.d.ts.map +1 -0
- package/dist/internal/cursor/session-token.js +99 -0
- package/dist/internal/cursor-agent-template.d.ts +1 -1
- package/dist/internal/cursor-agent-template.d.ts.map +1 -1
- package/dist/internal/cursor-agent-template.js +2 -0
- package/dist/internal/deploy-client.d.ts +17 -0
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +31 -10
- package/dist/internal/env-file.d.ts +19 -0
- package/dist/internal/env-file.d.ts.map +1 -0
- package/dist/internal/env-file.js +90 -0
- package/dist/internal/framework-file-storage.d.ts +61 -0
- package/dist/internal/framework-file-storage.d.ts.map +1 -0
- package/dist/internal/framework-file-storage.js +210 -0
- package/dist/internal/framework-storage-selection.d.ts +11 -5
- package/dist/internal/framework-storage-selection.d.ts.map +1 -1
- package/dist/internal/framework-storage-selection.js +38 -11
- package/dist/internal/hosted-delivery-protocol.d.ts +7 -0
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +7 -0
- package/dist/internal/hosted-delivery.d.ts +13 -0
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +64 -19
- package/dist/internal/hosted-execution-diag.d.ts +48 -0
- package/dist/internal/hosted-execution-diag.d.ts.map +1 -0
- package/dist/internal/hosted-execution-diag.js +150 -0
- package/dist/internal/http-channel.d.ts.map +1 -1
- package/dist/internal/http-channel.js +81 -1
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +4 -0
- package/dist/internal/install-cursor-skills.d.ts.map +1 -1
- package/dist/internal/install-cursor-skills.js +1 -3
- package/dist/internal/logs-client.d.ts +5 -0
- package/dist/internal/logs-client.d.ts.map +1 -1
- package/dist/internal/logs-client.js +5 -0
- package/dist/internal/managed-delivery.d.ts +80 -0
- package/dist/internal/managed-delivery.d.ts.map +1 -0
- package/dist/internal/managed-delivery.js +86 -0
- package/dist/internal/mcp-endpoint.js +2 -3
- package/dist/internal/mcp-host.d.ts +10 -0
- package/dist/internal/mcp-host.d.ts.map +1 -1
- package/dist/internal/mcp-host.js +57 -8
- package/dist/internal/mcp-oauth-on-demand.d.ts +68 -0
- package/dist/internal/mcp-oauth-on-demand.d.ts.map +1 -0
- package/dist/internal/mcp-oauth-on-demand.js +287 -0
- package/dist/internal/mcp-oauth-persist.d.ts +42 -0
- package/dist/internal/mcp-oauth-persist.d.ts.map +1 -0
- package/dist/internal/mcp-oauth-persist.js +92 -0
- package/dist/internal/mcp-oauth.d.ts +1 -0
- package/dist/internal/mcp-oauth.d.ts.map +1 -1
- package/dist/internal/mcp-oauth.js +10 -2
- package/dist/internal/otel/collector.d.ts.map +1 -1
- package/dist/internal/otel/collector.js +22 -9
- package/dist/internal/runtime-dispatch-runner.d.ts +5 -1
- package/dist/internal/runtime-dispatch-runner.d.ts.map +1 -1
- package/dist/internal/runtime-dispatch-runner.js +7 -0
- package/dist/internal/sdk-runner.d.ts +11 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +39 -8
- package/dist/internal/server.d.ts +3 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +49 -21
- package/dist/internal/session-engine.d.ts +101 -3
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +577 -46
- package/dist/internal/sessions-client.d.ts +9 -7
- package/dist/internal/sessions-client.d.ts.map +1 -1
- package/dist/internal/sessions-client.js +3 -1
- package/dist/internal/steering.d.ts +15 -0
- package/dist/internal/steering.d.ts.map +1 -0
- package/dist/internal/steering.js +18 -0
- package/dist/internal/storage-coordinator.d.ts +7 -0
- package/dist/internal/storage-coordinator.d.ts.map +1 -1
- package/dist/internal/storage-coordinator.js +28 -5
- package/dist/internal/storage-roles.d.ts +5 -0
- package/dist/internal/storage-roles.d.ts.map +1 -1
- package/dist/internal/stream-progress.d.ts.map +1 -1
- package/dist/internal/stream-progress.js +10 -0
- package/dist/internal/tool-policy.d.ts +9 -1
- package/dist/internal/tool-policy.d.ts.map +1 -1
- package/dist/internal/tool-policy.js +13 -0
- package/dist/internal/trajectory.d.ts.map +1 -1
- package/dist/internal/trajectory.js +10 -0
- package/dist/internal/turn-outbox.d.ts +24 -0
- package/dist/internal/turn-outbox.d.ts.map +1 -0
- package/dist/internal/turn-outbox.js +80 -0
- package/dist/playground/assets/{index-CZA1uEWA.js → index-DrkI6y5O.js} +51 -51
- package/dist/playground/assets/index-DzNGwm7q.css +1 -0
- package/dist/playground/index.html +2 -2
- package/dist/storage-backends/cursor-hosted.d.ts +9 -6
- package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted.js +16 -3
- package/dist/storage.d.ts +8 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/types.d.ts +65 -8
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +7 -3
- package/docs/deployment.md +5 -4
- package/docs/guides/mcp-oauth.md +26 -8
- package/docs/guides/slack.md +93 -202
- package/docs/reference/agent-config.md +2 -2
- package/docs/reference/cli.md +39 -16
- package/docs/reference/connections.md +6 -3
- package/docs/reference/http-api.md +2 -1
- package/docs/reference/sessions.md +4 -2
- package/docs/reference/tools.md +9 -2
- package/docs/templates/agents-md.md +110 -0
- package/docs/templates/code-wiki.md +96 -0
- package/docs/troubleshooting.md +2 -2
- package/package.json +2 -2
- package/skills/ab/SKILL.md +13 -97
- package/skills/create-agent/SKILL.md +124 -223
- package/skills/debug/SKILL.md +34 -68
- package/skills/evals/SKILL.md +55 -180
- package/skills/framework-map/SKILL.md +83 -145
- package/skills/github/SKILL.md +53 -111
- package/skills/hillclimb/SKILL.md +40 -163
- package/skills/mcp-auth/SKILL.md +51 -107
- package/skills/otel/SKILL.md +22 -68
- package/skills/setup-slack/SKILL.md +91 -212
- package/src/bin/agent-serve.ts +13 -1
- package/src/channels/deployments/types.ts +1 -0
- package/src/channels/origin/api.ts +264 -33
- package/src/channels/origin/binding.ts +57 -28
- package/src/channels/origin/checks.ts +6 -6
- package/src/channels/origin/cursor-account.ts +5 -3
- package/src/channels/origin/index.ts +1 -0
- package/src/channels/origin/origin-channel.ts +4 -0
- package/src/channels/origin/reactions.ts +82 -0
- package/src/channels/origin/types.ts +11 -0
- package/src/channels/slack/api.ts +41 -5
- package/src/channels/slack/approvals.ts +105 -0
- package/src/channels/slack/cli-project.ts +267 -0
- package/src/channels/slack/defaults.ts +122 -93
- package/src/channels/slack/dispatch.ts +56 -22
- package/src/channels/slack/inbound.ts +43 -0
- package/src/channels/slack/init.ts +10 -5
- package/src/channels/slack/interactive.ts +35 -9
- package/src/channels/slack/live-delivery.ts +235 -114
- package/src/channels/slack/manifest.ts +6 -2
- package/src/channels/slack/nudge-carrier.ts +48 -1
- package/src/channels/slack/setup.ts +10 -6
- package/src/channels/slack/slack-channel.ts +3 -0
- package/src/channels/slack/tool-approval-events.ts +93 -0
- package/src/evals/run-facts.ts +32 -0
- package/src/files-backends/cursor-hosted.ts +40 -7
- package/src/internal/advertise-tools.ts +49 -12
- package/src/internal/approval-gate.ts +20 -29
- package/src/internal/bounded.ts +28 -0
- package/src/internal/chat-client.ts +19 -0
- package/src/internal/cli-deploy.ts +91 -9
- package/src/internal/cli-mcp-oauth.ts +7 -21
- package/src/internal/cli-slack-manual.ts +350 -18
- package/src/internal/cli-slack.ts +40 -84
- package/src/internal/conversation-mirror.ts +145 -69
- package/src/internal/cursor/account-mcp.ts +21 -0
- package/src/internal/cursor/backend-client.ts +34 -58
- package/src/internal/cursor/session-token.ts +115 -0
- package/src/internal/cursor-agent-template.ts +2 -0
- package/src/internal/deploy-client.ts +43 -0
- package/src/internal/env-file.ts +84 -0
- package/src/internal/framework-file-storage.ts +228 -0
- package/src/internal/framework-storage-selection.ts +51 -11
- package/src/internal/hosted-delivery-protocol.ts +7 -0
- package/src/internal/hosted-delivery.ts +107 -24
- package/src/internal/hosted-execution-diag.ts +207 -0
- package/src/internal/http-channel.ts +99 -0
- package/src/internal/init-project.ts +4 -0
- package/src/internal/install-cursor-skills.ts +1 -4
- package/src/internal/logs-client.ts +5 -0
- package/src/internal/managed-delivery.ts +125 -0
- package/src/internal/mcp-endpoint.ts +13 -4
- package/src/internal/mcp-host.ts +77 -11
- package/src/internal/mcp-oauth-on-demand.ts +352 -0
- package/src/internal/mcp-oauth-persist.ts +127 -0
- package/src/internal/mcp-oauth.ts +17 -1
- package/src/internal/otel/collector.ts +30 -0
- package/src/internal/runtime-dispatch-runner.ts +10 -0
- package/src/internal/sdk-runner.ts +56 -8
- package/src/internal/server.ts +61 -9
- package/src/internal/session-engine.ts +723 -60
- package/src/internal/sessions-client.ts +17 -8
- package/src/internal/steering.ts +17 -0
- package/src/internal/storage-coordinator.ts +38 -8
- package/src/internal/storage-roles.ts +7 -0
- package/src/internal/stream-progress.ts +19 -0
- package/src/internal/tool-policy.ts +18 -0
- package/src/internal/trajectory.ts +10 -0
- package/src/internal/turn-outbox.ts +85 -0
- package/src/storage-backends/cursor-hosted.ts +22 -8
- package/src/storage.ts +12 -0
- package/src/types.ts +70 -9
- package/templates/agents-md/README.md +39 -0
- package/templates/agents-md/agent/agent.ts +8 -0
- package/templates/agents-md/agent/channels/github.ts +10 -0
- package/templates/agents-md/agent/channels/queue.ts +28 -0
- package/templates/agents-md/agent/channels/slack.ts +9 -0
- package/templates/agents-md/agent/instructions.md +39 -0
- package/templates/agents-md/agent/lib/collect.ts +439 -0
- package/templates/agents-md/agent/lib/config.ts +8 -0
- package/templates/agents-md/agent/lib/paths.ts +51 -0
- package/templates/agents-md/agent/schedules/weekly.ts +17 -0
- package/templates/agents-md/agent/tools/apply_agents.ts +226 -0
- package/templates/agents-md/evals/agents.eval.ts +135 -0
- package/templates/agents-md/evals/evals.config.ts +5 -0
- package/templates/agents-md/init.json +38 -0
- package/templates/agents-md/package.json +18 -0
- package/templates/agents-md/tsconfig.json +12 -0
- package/templates/code-wiki/README.md +34 -0
- package/templates/code-wiki/agent/agent.ts +8 -0
- package/templates/code-wiki/agent/channels/github.ts +144 -0
- package/templates/code-wiki/agent/instructions.md +39 -0
- package/templates/code-wiki/agent/lib/repos.ts +5 -0
- package/templates/code-wiki/agent/lib/wiki.ts +22 -0
- package/templates/code-wiki/agent/tools/apply_wiki.ts +219 -0
- package/templates/code-wiki/evals/evals.config.ts +5 -0
- package/templates/code-wiki/evals/wiki.eval.ts +132 -0
- package/templates/code-wiki/init.json +25 -0
- package/templates/code-wiki/package.json +18 -0
- package/templates/code-wiki/tsconfig.json +12 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.oqPawjiD.js +0 -1
- package/dist/docs/assets/guides_slack.md.C32HsdKk.js +0 -38
- package/dist/docs/assets/guides_slack.md.C32HsdKk.lean.js +0 -1
- package/dist/docs/assets/index.md.BoHaMdeZ.js +0 -5
- package/dist/docs/assets/reference_sessions.md.D0mIh4KK.js +0 -1
- package/dist/docs/assets/troubleshooting.md.Ctv3T8C2.js +0 -1
- package/dist/docs/design/agsh.md +0 -406
- package/dist/internal/deployment-scm-event-stream.d.ts +0 -116
- package/dist/internal/deployment-scm-event-stream.d.ts.map +0 -1
- package/dist/internal/deployment-scm-event-stream.js +0 -474
- package/dist/playground/assets/index-CF7hUDnQ.css +0 -1
- package/docs/design/agsh.md +0 -406
- package/src/internal/deployment-scm-event-stream.ts +0 -593
- /package/dist/docs/assets/{deployment.md.D9msOFOW.lean.js → deployment.md.MFPKqsqI.lean.js} +0 -0
- /package/dist/docs/assets/{reference_agent-config.md.Cp_x38Nl.lean.js → reference_agent-config.md.BHeYMgme.lean.js} +0 -0
- /package/dist/docs/assets/{reference_connections.md.BH8Oc0D0.lean.js → reference_connections.md.DxldvyIB.lean.js} +0 -0
- /package/dist/docs/assets/{reference_http-api.md.D89k1mdm.lean.js → reference_http-api.md.5zOAbV86.lean.js} +0 -0
- /package/dist/docs/assets/{reference_sessions.md.D0mIh4KK.lean.js → reference_sessions.md.NxFP_CAC.lean.js} +0 -0
- /package/dist/docs/assets/{reference_tools.md.BHeXn2id.lean.js → reference_tools.md.B84gw9Ii.lean.js} +0 -0
- /package/dist/docs/assets/{troubleshooting.md.Ctv3T8C2.lean.js → troubleshooting.md.DCiPBhYs.lean.js} +0 -0
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const SLACK_APPROVE_ACTION_ID = "agent_serve_approve";
|
|
5
5
|
export const SLACK_DENY_ACTION_ID = "agent_serve_deny";
|
|
6
|
+
export const SLACK_AUTH_CONNECTED_ACTION_ID = "agent_serve_auth_connected";
|
|
7
|
+
export const SLACK_AUTH_CANCEL_ACTION_ID = "agent_serve_auth_cancel";
|
|
6
8
|
export function encodeApprovalActionValue(payload) {
|
|
7
9
|
return JSON.stringify(payload);
|
|
8
10
|
}
|
|
@@ -35,6 +37,24 @@ export function decisionFromActionId(actionId) {
|
|
|
35
37
|
}
|
|
36
38
|
return null;
|
|
37
39
|
}
|
|
40
|
+
export function decisionFromAuthActionId(actionId) {
|
|
41
|
+
if (actionId === SLACK_AUTH_CONNECTED_ACTION_ID) {
|
|
42
|
+
return "approve";
|
|
43
|
+
}
|
|
44
|
+
if (actionId === SLACK_AUTH_CANCEL_ACTION_ID) {
|
|
45
|
+
return "deny";
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
export function authThreadStatus(connection) {
|
|
50
|
+
const prefix = "Waiting for ";
|
|
51
|
+
const suffix = " auth…";
|
|
52
|
+
const budget = 50 - prefix.length - suffix.length;
|
|
53
|
+
const name = connection.length <= budget
|
|
54
|
+
? connection
|
|
55
|
+
: `${connection.slice(0, Math.max(0, budget - 1))}…`;
|
|
56
|
+
return `${prefix}${name}${suffix}`;
|
|
57
|
+
}
|
|
38
58
|
const REDACTED = "[REDACTED]";
|
|
39
59
|
const SENSITIVE_KEY = /(?:pass(?:word|wd)?|secret|token|api[_-]?key|authorization|credential|private[_-]?key|access[_-]?key)/i;
|
|
40
60
|
/** Strip likely secrets before args are shown in Slack cards. */
|
|
@@ -140,6 +160,72 @@ export function buildApprovalBlocks(args) {
|
|
|
140
160
|
},
|
|
141
161
|
];
|
|
142
162
|
}
|
|
163
|
+
export function buildAuthBlocks(args) {
|
|
164
|
+
const value = encodeApprovalActionValue({
|
|
165
|
+
sessionId: args.sessionId,
|
|
166
|
+
callId: args.callId,
|
|
167
|
+
});
|
|
168
|
+
const label = args.connection.length > 20
|
|
169
|
+
? `Authorize ${args.connection.slice(0, 17)}…`
|
|
170
|
+
: `Authorize ${args.connection}`;
|
|
171
|
+
return [
|
|
172
|
+
{
|
|
173
|
+
type: "header",
|
|
174
|
+
text: {
|
|
175
|
+
type: "plain_text",
|
|
176
|
+
text: "MCP authorization needed",
|
|
177
|
+
emoji: true,
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
type: "section",
|
|
182
|
+
text: {
|
|
183
|
+
type: "mrkdwn",
|
|
184
|
+
text: `Connect \`${args.connection}\` so \`${args.toolName}\` can continue.`,
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
type: "actions",
|
|
189
|
+
block_id: `auth_${args.callId}`.slice(0, 255),
|
|
190
|
+
elements: [
|
|
191
|
+
{
|
|
192
|
+
type: "button",
|
|
193
|
+
text: { type: "plain_text", text: label, emoji: true },
|
|
194
|
+
url: args.authUrl,
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
type: "button",
|
|
198
|
+
action_id: SLACK_AUTH_CONNECTED_ACTION_ID,
|
|
199
|
+
text: { type: "plain_text", text: "Connected", emoji: true },
|
|
200
|
+
style: "primary",
|
|
201
|
+
value,
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
type: "button",
|
|
205
|
+
action_id: SLACK_AUTH_CANCEL_ACTION_ID,
|
|
206
|
+
text: { type: "plain_text", text: "Cancel", emoji: true },
|
|
207
|
+
style: "danger",
|
|
208
|
+
value,
|
|
209
|
+
},
|
|
210
|
+
],
|
|
211
|
+
},
|
|
212
|
+
];
|
|
213
|
+
}
|
|
214
|
+
export function buildResolvedAuthBlocks(args) {
|
|
215
|
+
const verb = args.decision === "approve" ? "Connected" : "Cancelled";
|
|
216
|
+
const by = args.byUserId === undefined || args.byUserId === ""
|
|
217
|
+
? ""
|
|
218
|
+
: ` by <@${args.byUserId}>`;
|
|
219
|
+
return [
|
|
220
|
+
{
|
|
221
|
+
type: "section",
|
|
222
|
+
text: {
|
|
223
|
+
type: "mrkdwn",
|
|
224
|
+
text: `*${verb}*${by} — \`${args.connection}\``,
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
];
|
|
228
|
+
}
|
|
143
229
|
export function buildResolvedApprovalBlocks(args) {
|
|
144
230
|
const verb = args.decision === "approve" ? "Approved" : "Denied";
|
|
145
231
|
const by = args.byUserId === undefined || args.byUserId === ""
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Official Slack CLI project files for `slack init --manual`.
|
|
3
|
+
*
|
|
4
|
+
* `.slack/` is the committed Slack CLI project: hook, manifests, hooks.json.
|
|
5
|
+
* Agent SDK serve owns the socket; do not `slack deploy` / `slack run`.
|
|
6
|
+
*/
|
|
7
|
+
export declare const SLACK_CLI_HOME_BIN = ".slack/bin/slack";
|
|
8
|
+
export declare const SLACK_CLI_GET_MANIFEST = "node .slack/get-manifest.mjs";
|
|
9
|
+
export type SlackCliEnvironment = "local" | "deployed";
|
|
10
|
+
/** Official Slack CLI, if present. `SLACK_CLI` overrides. */
|
|
11
|
+
export declare function detectSlackCli(env?: NodeJS.ProcessEnv): string | undefined;
|
|
12
|
+
/** Hook + manifests under `.slack/`. Merge hooks.json; keep existing config. */
|
|
13
|
+
export declare function writeSlackCliProject(rootDir: string, manifests: ReadonlyArray<{
|
|
14
|
+
name: string;
|
|
15
|
+
contents: string;
|
|
16
|
+
}>): Promise<string[]>;
|
|
17
|
+
export declare function parseSlackAuthTeams(text: string): string[];
|
|
18
|
+
export declare function readSlackCliAppId(dir: string, environment: SlackCliEnvironment, team?: string): Promise<string | undefined>;
|
|
19
|
+
//# sourceMappingURL=cli-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-project.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/cli-project.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,eAAO,MAAM,kBAAkB,qBAAqB,CAAC;AAErD,eAAO,MAAM,sBAAsB,iCAAiC,CAAC;AAErE,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,UAAU,CAAC;AAkCvD,6DAA6D;AAC7D,wBAAgB,cAAc,CAC5B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,SAAS,CAQpB;AAED,gFAAgF;AAChF,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GAC3D,OAAO,CAAC,MAAM,EAAE,CAAC,CAmCnB;AAkFD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAS1D;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,mBAAmB,EAChC,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAS7B"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Official Slack CLI project files for `slack init --manual`.
|
|
3
|
+
*
|
|
4
|
+
* `.slack/` is the committed Slack CLI project: hook, manifests, hooks.json.
|
|
5
|
+
* Agent SDK serve owns the socket; do not `slack deploy` / `slack run`.
|
|
6
|
+
*/
|
|
7
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
8
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
9
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
10
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
11
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
12
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
13
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
import { randomUUID } from "node:crypto";
|
|
17
|
+
import { existsSync } from "node:fs";
|
|
18
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
19
|
+
import { homedir } from "node:os";
|
|
20
|
+
import { join } from "node:path";
|
|
21
|
+
export const SLACK_CLI_HOME_BIN = ".slack/bin/slack";
|
|
22
|
+
export const SLACK_CLI_GET_MANIFEST = "node .slack/get-manifest.mjs";
|
|
23
|
+
const TEAM_ID_RE = /\(Team ID: ([TE][A-Z0-9]+)\)/g;
|
|
24
|
+
const GET_MANIFEST_JS = `import { readFileSync } from "node:fs";
|
|
25
|
+
import { dirname, join } from "node:path";
|
|
26
|
+
import { fileURLToPath } from "node:url";
|
|
27
|
+
|
|
28
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
29
|
+
|
|
30
|
+
function target() {
|
|
31
|
+
const env = process.env.SLACK_ENV ?? process.env.SLACK_APP_ENVIRONMENT;
|
|
32
|
+
if (env === "deployed" || env === "prod") return "manifest.prod.json";
|
|
33
|
+
if (env === "local" || env === "dev") return "manifest.dev.json";
|
|
34
|
+
try {
|
|
35
|
+
const raw = readFileSync(join(here, "cli-environment"), "utf8").trim();
|
|
36
|
+
if (raw === "deployed" || raw === "prod") return "manifest.prod.json";
|
|
37
|
+
} catch {
|
|
38
|
+
// default local
|
|
39
|
+
}
|
|
40
|
+
return "manifest.dev.json";
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
process.stdout.write(readFileSync(join(here, target()), "utf8"));
|
|
44
|
+
`;
|
|
45
|
+
function isEnoent(error) {
|
|
46
|
+
return (error instanceof Error &&
|
|
47
|
+
"code" in error &&
|
|
48
|
+
error.code === "ENOENT");
|
|
49
|
+
}
|
|
50
|
+
/** Official Slack CLI, if present. `SLACK_CLI` overrides. */
|
|
51
|
+
export function detectSlackCli(env = process.env) {
|
|
52
|
+
var _a, _b;
|
|
53
|
+
const override = env.SLACK_CLI;
|
|
54
|
+
if (override !== undefined && override !== "") {
|
|
55
|
+
return override;
|
|
56
|
+
}
|
|
57
|
+
const home = (_b = (_a = env.HOME) !== null && _a !== void 0 ? _a : env.USERPROFILE) !== null && _b !== void 0 ? _b : homedir();
|
|
58
|
+
const homeBin = join(home, SLACK_CLI_HOME_BIN);
|
|
59
|
+
return existsSync(homeBin) ? homeBin : undefined;
|
|
60
|
+
}
|
|
61
|
+
/** Hook + manifests under `.slack/`. Merge hooks.json; keep existing config. */
|
|
62
|
+
export function writeSlackCliProject(rootDir, manifests) {
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
const slackDir = join(rootDir, ".slack");
|
|
65
|
+
yield mkdir(slackDir, { recursive: true });
|
|
66
|
+
const created = [];
|
|
67
|
+
yield writeFile(join(slackDir, "get-manifest.mjs"), GET_MANIFEST_JS);
|
|
68
|
+
created.push(".slack/get-manifest.mjs");
|
|
69
|
+
for (const file of manifests) {
|
|
70
|
+
yield writeFile(join(slackDir, file.name), file.contents);
|
|
71
|
+
created.push(`.slack/${file.name}`);
|
|
72
|
+
}
|
|
73
|
+
if (yield upsertGetManifestHook(slackDir)) {
|
|
74
|
+
created.push(".slack/hooks.json");
|
|
75
|
+
}
|
|
76
|
+
if (yield writeIfMissing(join(slackDir, "config.json"), `${JSON.stringify({
|
|
77
|
+
manifest: { source: "local" },
|
|
78
|
+
project_id: randomUUID(),
|
|
79
|
+
}, null, 2)}\n`)) {
|
|
80
|
+
created.push(".slack/config.json");
|
|
81
|
+
}
|
|
82
|
+
if (yield mergeGitignore(join(slackDir, ".gitignore"))) {
|
|
83
|
+
created.push(".slack/.gitignore");
|
|
84
|
+
}
|
|
85
|
+
return created;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function upsertGetManifestHook(slackDir) {
|
|
89
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
90
|
+
var _a;
|
|
91
|
+
const path = join(slackDir, "hooks.json");
|
|
92
|
+
let existing;
|
|
93
|
+
try {
|
|
94
|
+
const parsed = JSON.parse(yield readFile(path, "utf8"));
|
|
95
|
+
if (parsed === null ||
|
|
96
|
+
typeof parsed !== "object" ||
|
|
97
|
+
Array.isArray(parsed)) {
|
|
98
|
+
throw new Error(".slack/hooks.json is not a JSON object");
|
|
99
|
+
}
|
|
100
|
+
existing = parsed;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
if (!isEnoent(error)) {
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
yield writeFile(path, `${JSON.stringify({ hooks: { "get-manifest": SLACK_CLI_GET_MANIFEST } }, null, 2)}\n`);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
const hooks = (_a = existing.hooks) !== null && _a !== void 0 ? _a : {};
|
|
110
|
+
if (hooks["get-manifest"] === SLACK_CLI_GET_MANIFEST) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
hooks["get-manifest"] = SLACK_CLI_GET_MANIFEST;
|
|
114
|
+
existing.hooks = hooks;
|
|
115
|
+
yield writeFile(path, `${JSON.stringify(existing, null, 2)}\n`);
|
|
116
|
+
return true;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
function writeIfMissing(path, contents) {
|
|
120
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
121
|
+
try {
|
|
122
|
+
yield writeFile(path, contents, { flag: "wx" });
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (error instanceof Error &&
|
|
127
|
+
"code" in error &&
|
|
128
|
+
error.code === "EEXIST") {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
function mergeGitignore(path) {
|
|
136
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
137
|
+
const lines = ["apps.dev.json", "cache/", "cli-environment"];
|
|
138
|
+
let existing = "";
|
|
139
|
+
try {
|
|
140
|
+
existing = yield readFile(path, "utf8");
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (!isEnoent(error)) {
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
yield writeFile(path, `${lines.join("\n")}\n`);
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
const have = new Set(existing
|
|
150
|
+
.split(/\r?\n/)
|
|
151
|
+
.map((line) => line.trim())
|
|
152
|
+
.filter((line) => line !== ""));
|
|
153
|
+
const missing = lines.filter((line) => !have.has(line));
|
|
154
|
+
if (missing.length === 0) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
const prefix = existing === "" || existing.endsWith("\n") ? existing : `${existing}\n`;
|
|
158
|
+
yield writeFile(path, `${prefix}${missing.join("\n")}\n`);
|
|
159
|
+
return true;
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
export function parseSlackAuthTeams(text) {
|
|
163
|
+
const ids = [];
|
|
164
|
+
for (const match of text.matchAll(TEAM_ID_RE)) {
|
|
165
|
+
const id = match[1];
|
|
166
|
+
if (id !== undefined && !ids.includes(id)) {
|
|
167
|
+
ids.push(id);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return ids;
|
|
171
|
+
}
|
|
172
|
+
export function readSlackCliAppId(dir, environment, team) {
|
|
173
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
174
|
+
const apps = yield loadAppMap(dir, environment);
|
|
175
|
+
if (apps === undefined) {
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
if (team !== undefined) {
|
|
179
|
+
return appIdOf(apps[team]);
|
|
180
|
+
}
|
|
181
|
+
return firstAppId(apps);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
function loadAppMap(dir, environment) {
|
|
185
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
186
|
+
if (environment === "local") {
|
|
187
|
+
return readJson(join(dir, ".slack/apps.dev.json"));
|
|
188
|
+
}
|
|
189
|
+
const deployed = yield readJson(join(dir, ".slack/apps.json"));
|
|
190
|
+
if (deployed === undefined) {
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
const apps = deployed.apps;
|
|
194
|
+
if (apps !== undefined && typeof apps === "object" && apps !== null) {
|
|
195
|
+
return apps;
|
|
196
|
+
}
|
|
197
|
+
return deployed;
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
function firstAppId(value) {
|
|
201
|
+
for (const entry of Object.values(value)) {
|
|
202
|
+
const id = appIdOf(entry);
|
|
203
|
+
if (id !== undefined) {
|
|
204
|
+
return id;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
function appIdOf(entry) {
|
|
210
|
+
if (entry === undefined || entry === null || typeof entry !== "object") {
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
const appId = entry.app_id;
|
|
214
|
+
if (typeof appId === "string" && appId.startsWith("A")) {
|
|
215
|
+
return appId;
|
|
216
|
+
}
|
|
217
|
+
return undefined;
|
|
218
|
+
}
|
|
219
|
+
function readJson(path) {
|
|
220
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
221
|
+
try {
|
|
222
|
+
const parsed = JSON.parse(yield readFile(path, "utf8"));
|
|
223
|
+
if (parsed === null ||
|
|
224
|
+
typeof parsed !== "object" ||
|
|
225
|
+
Array.isArray(parsed)) {
|
|
226
|
+
return undefined;
|
|
227
|
+
}
|
|
228
|
+
return parsed;
|
|
229
|
+
}
|
|
230
|
+
catch (_a) {
|
|
231
|
+
return undefined;
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/defaults.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/defaults.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAuB,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAehF,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAMpB,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GACpC,cAAc,CAEhB;AAED,qCAAqC;AACrC,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,iBAAiB,GAAG,SAAS,GACpC,OAAO,CAET;AAED,6EAA6E;AAC7E,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAS7E;AA0BD,6EAA6E;AAC7E,wBAAgB,sBAAsB,CACpC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,EACnC,MAAM,CAAC,EAAE,iBAAiB,GACzB,mBAAmB,CAQrB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,EACnC,MAAM,CAAC,EAAE,iBAAiB,GACzB,mBAAmB,CAWrB;AAED,eAAO,MAAM,mBAAmB,EAAE,mBACR,CAAC;AAC3B,eAAO,MAAM,sBAAsB,EAAE,mBACX,CAAC;AAC3B,eAAO,MAAM,oBAAoB,EAAE,mBACL,CAAC;AAE/B,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC1C,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mEAAmE;IACnE,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,QAAQ,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,oBAAoB,CAAC,iBAAiB,CAAC,CA2azC"}
|
|
@@ -114,13 +114,87 @@ export function buildDefaultEvents(options = {}) {
|
|
|
114
114
|
status: "",
|
|
115
115
|
});
|
|
116
116
|
if (!result.ok) {
|
|
117
|
-
getLog().warn("
|
|
117
|
+
getLog().warn("slack setStatus not-ok", {
|
|
118
118
|
error: result.error,
|
|
119
119
|
channel: channelId,
|
|
120
120
|
thread_ts: threadTs,
|
|
121
121
|
});
|
|
122
122
|
}
|
|
123
123
|
});
|
|
124
|
+
/**
|
|
125
|
+
* Deliver assistant text to the bound Slack thread. Used by a stop-reason
|
|
126
|
+
* `message.completed` and by `turn.completed` when the last assistant
|
|
127
|
+
* block was `finishReason: "tool_call"` (answer then `tag_artifact`,
|
|
128
|
+
* etc.) so the playground result still reaches Slack.
|
|
129
|
+
*/
|
|
130
|
+
const deliverReplyText = (args) => __awaiter(this, void 0, void 0, function* () {
|
|
131
|
+
var _a, _b;
|
|
132
|
+
const log = getLog();
|
|
133
|
+
const state = args.channel.state;
|
|
134
|
+
if (state.channelId === null ||
|
|
135
|
+
state.threadTs === null ||
|
|
136
|
+
args.text === "") {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
if (state.lastPostedText === args.text) {
|
|
140
|
+
// Stream append sets this watermark while chat.stopStream is still
|
|
141
|
+
// pending. Treat a match as "already on Slack", not "already finalized".
|
|
142
|
+
const streamTs = state.streamTs;
|
|
143
|
+
if (streamTs !== null && streamTs !== "") {
|
|
144
|
+
const canStream = streaming && state.streamingUnavailable !== true;
|
|
145
|
+
if (canStream) {
|
|
146
|
+
yield strategy.finalize({
|
|
147
|
+
channel: args.channel,
|
|
148
|
+
channelId: (_a = state.streamChannelId) !== null && _a !== void 0 ? _a : state.channelId,
|
|
149
|
+
text: args.text,
|
|
150
|
+
sessionId: args.sessionId,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
yield strategy.cleanupOrphan({ channel: args.channel });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
const canStream = streaming && state.streamingUnavailable !== true;
|
|
160
|
+
if (canStream) {
|
|
161
|
+
const { delivered } = yield strategy.finalize({
|
|
162
|
+
channel: args.channel,
|
|
163
|
+
channelId: (_b = state.streamChannelId) !== null && _b !== void 0 ? _b : state.channelId,
|
|
164
|
+
text: args.text,
|
|
165
|
+
sessionId: args.sessionId,
|
|
166
|
+
});
|
|
167
|
+
if (delivered) {
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
const posted = yield postMessage({
|
|
173
|
+
botToken,
|
|
174
|
+
channel: state.channelId,
|
|
175
|
+
text: args.text,
|
|
176
|
+
threadTs: state.threadTs,
|
|
177
|
+
});
|
|
178
|
+
state.lastPostedText = args.text;
|
|
179
|
+
state.lastBotMessageTs = posted.ts;
|
|
180
|
+
log.info("reply delivered via postMessage", {
|
|
181
|
+
channel: state.channelId,
|
|
182
|
+
thread_ts: state.threadTs,
|
|
183
|
+
message_ts: posted.ts,
|
|
184
|
+
session: args.sessionId,
|
|
185
|
+
chars: args.text.length,
|
|
186
|
+
});
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
log.error(`postMessage failed: ${error instanceof Error ? error.message : String(error)}`, {
|
|
191
|
+
channel: state.channelId,
|
|
192
|
+
thread_ts: state.threadTs,
|
|
193
|
+
session: args.sessionId,
|
|
194
|
+
});
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
});
|
|
124
198
|
return {
|
|
125
199
|
"turn.started"(event, channel) {
|
|
126
200
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -150,18 +224,6 @@ export function buildDefaultEvents(options = {}) {
|
|
|
150
224
|
status: "Working…",
|
|
151
225
|
loadingMessages,
|
|
152
226
|
});
|
|
153
|
-
// Retry streaming each turn unless a prior call proved the feature
|
|
154
|
-
// unsupported for this workspace/app. Thinking stays on setStatus
|
|
155
|
-
// (Cursor-account proxy pins agent username/icon on that method).
|
|
156
|
-
if (!streaming || state.streamingUnavailable === true) {
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
yield strategy.start({
|
|
160
|
-
channel,
|
|
161
|
-
channelId: state.channelId,
|
|
162
|
-
threadTs: state.threadTs,
|
|
163
|
-
sessionId: event.sessionId,
|
|
164
|
-
});
|
|
165
227
|
});
|
|
166
228
|
},
|
|
167
229
|
"message.appended"(event, channel) {
|
|
@@ -170,18 +232,14 @@ export function buildDefaultEvents(options = {}) {
|
|
|
170
232
|
if (!streaming || channel.state.streamingUnavailable === true) {
|
|
171
233
|
return;
|
|
172
234
|
}
|
|
173
|
-
const streamTs = channel.state.streamTs;
|
|
174
235
|
const channelId = (_a = channel.state.streamChannelId) !== null && _a !== void 0 ? _a : channel.state.channelId;
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
channelId === null ||
|
|
178
|
-
channelId === "") {
|
|
236
|
+
const threadTs = channel.state.threadTs;
|
|
237
|
+
if (channelId === null || channelId === "" || threadTs === null) {
|
|
179
238
|
return;
|
|
180
239
|
}
|
|
181
240
|
yield strategy.append({
|
|
182
241
|
channel,
|
|
183
242
|
channelId,
|
|
184
|
-
streamTs,
|
|
185
243
|
text: event.data.text,
|
|
186
244
|
sessionId: event.sessionId,
|
|
187
245
|
});
|
|
@@ -235,19 +293,18 @@ export function buildDefaultEvents(options = {}) {
|
|
|
235
293
|
if (strategy.inlineToolSteps &&
|
|
236
294
|
thinkingSteps &&
|
|
237
295
|
streaming &&
|
|
238
|
-
channel.state.streamingUnavailable !== true
|
|
239
|
-
channel.state.streamTs !== null &&
|
|
240
|
-
channel.state.streamTs !== "") {
|
|
296
|
+
channel.state.streamingUnavailable !== true) {
|
|
241
297
|
const channelId = (_a = channel.state.streamChannelId) !== null && _a !== void 0 ? _a : channel.state.channelId;
|
|
242
|
-
|
|
298
|
+
const threadTs = channel.state.threadTs;
|
|
299
|
+
if (channelId !== null && channelId !== "" && threadTs !== null) {
|
|
243
300
|
const chunks = buildTaskChunksForCalls(event.data.calls, "in_progress");
|
|
244
|
-
const
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
ts: channel.state.streamTs,
|
|
301
|
+
const streamed = yield strategy.appendChunks({
|
|
302
|
+
channel,
|
|
303
|
+
channelId,
|
|
248
304
|
chunks,
|
|
305
|
+
sessionId: event.sessionId,
|
|
249
306
|
});
|
|
250
|
-
if (
|
|
307
|
+
if (streamed) {
|
|
251
308
|
if (channel.state.channelId !== null &&
|
|
252
309
|
channel.state.threadTs !== null) {
|
|
253
310
|
yield setThreadStatus({
|
|
@@ -301,8 +358,7 @@ export function buildDefaultEvents(options = {}) {
|
|
|
301
358
|
},
|
|
302
359
|
"message.completed"(event, channel) {
|
|
303
360
|
return __awaiter(this, void 0, void 0, function* () {
|
|
304
|
-
var _a
|
|
305
|
-
const log = getLog();
|
|
361
|
+
var _a;
|
|
306
362
|
if (event.data.finishReason === "tool_call") {
|
|
307
363
|
channel.state.pendingToolCallMessage = (_a = firstNonEmptyLine(event.data.text)) !== null && _a !== void 0 ? _a : null;
|
|
308
364
|
return;
|
|
@@ -315,58 +371,15 @@ export function buildDefaultEvents(options = {}) {
|
|
|
315
371
|
// Empty final text: still close any open stream / clear the skeleton
|
|
316
372
|
// and clear typing.
|
|
317
373
|
if (event.data.text === "") {
|
|
318
|
-
|
|
319
|
-
yield strategy.finalizeEmpty({
|
|
320
|
-
channel,
|
|
321
|
-
channelId: (_b = state.streamChannelId) !== null && _b !== void 0 ? _b : state.channelId,
|
|
322
|
-
streamTs: state.streamTs,
|
|
323
|
-
});
|
|
324
|
-
channel.state.streamTs = null;
|
|
325
|
-
}
|
|
374
|
+
yield strategy.finalizeEmpty({ channel });
|
|
326
375
|
yield clearWorkingStatus(state.channelId, state.threadTs);
|
|
327
376
|
return;
|
|
328
377
|
}
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
const { delivered } = yield strategy.finalize({
|
|
335
|
-
channel,
|
|
336
|
-
channelId: (_c = state.streamChannelId) !== null && _c !== void 0 ? _c : state.channelId,
|
|
337
|
-
streamTs: state.streamTs,
|
|
338
|
-
text: event.data.text,
|
|
339
|
-
sessionId: event.sessionId,
|
|
340
|
-
});
|
|
341
|
-
if (delivered) {
|
|
342
|
-
yield clearWorkingStatus(state.channelId, state.threadTs);
|
|
343
|
-
return;
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
try {
|
|
347
|
-
const posted = yield postMessage({
|
|
348
|
-
botToken,
|
|
349
|
-
channel: state.channelId,
|
|
350
|
-
text: event.data.text,
|
|
351
|
-
threadTs: state.threadTs,
|
|
352
|
-
});
|
|
353
|
-
channel.state.lastPostedText = event.data.text;
|
|
354
|
-
channel.state.lastBotMessageTs = posted.ts;
|
|
355
|
-
log.info("reply delivered via postMessage", {
|
|
356
|
-
channel: state.channelId,
|
|
357
|
-
thread_ts: state.threadTs,
|
|
358
|
-
message_ts: posted.ts,
|
|
359
|
-
session: event.sessionId,
|
|
360
|
-
chars: event.data.text.length,
|
|
361
|
-
});
|
|
362
|
-
}
|
|
363
|
-
catch (error) {
|
|
364
|
-
log.error(`postMessage failed: ${error instanceof Error ? error.message : String(error)}`, {
|
|
365
|
-
channel: state.channelId,
|
|
366
|
-
thread_ts: state.threadTs,
|
|
367
|
-
session: event.sessionId,
|
|
368
|
-
});
|
|
369
|
-
}
|
|
378
|
+
yield deliverReplyText({
|
|
379
|
+
channel,
|
|
380
|
+
text: event.data.text,
|
|
381
|
+
sessionId: event.sessionId,
|
|
382
|
+
});
|
|
370
383
|
yield clearWorkingStatus(state.channelId, state.threadTs);
|
|
371
384
|
});
|
|
372
385
|
},
|
|
@@ -379,6 +392,23 @@ export function buildDefaultEvents(options = {}) {
|
|
|
379
392
|
channel: channel.state.channelId,
|
|
380
393
|
thread_ts: channel.state.threadTs,
|
|
381
394
|
});
|
|
395
|
+
// Mid-turn `tool_call` text is held as status, not posted. If the
|
|
396
|
+
// turn ends without a later `finishReason: "stop"` block, the
|
|
397
|
+
// playground still has `result` (last assistant text) and Slack
|
|
398
|
+
// would otherwise stay silent.
|
|
399
|
+
const result = event.data.result;
|
|
400
|
+
const unpublished = typeof result === "string" &&
|
|
401
|
+
result !== "" &&
|
|
402
|
+
result !== channel.state.lastPostedText;
|
|
403
|
+
if (unpublished) {
|
|
404
|
+
yield deliverReplyText({
|
|
405
|
+
channel,
|
|
406
|
+
text: result,
|
|
407
|
+
sessionId: event.sessionId,
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
// Always close leftovers. deliverReplyText may fall through to
|
|
411
|
+
// postMessage when streaming is unavailable and leave streamTs open.
|
|
382
412
|
yield strategy.cleanupOrphan({ channel });
|
|
383
413
|
// Always drop the assistant chip. message.completed already clears
|
|
384
414
|
// after a normal reply, but a tool-call-only finish (or a missed
|
|
@@ -414,11 +444,10 @@ export function buildDefaultEvents(options = {}) {
|
|
|
414
444
|
}
|
|
415
445
|
const errorText = formatSlackTurnFailureMessage(event.data.message);
|
|
416
446
|
let delivered = false;
|
|
417
|
-
if (
|
|
447
|
+
if (streaming && state.streamingUnavailable !== true) {
|
|
418
448
|
({ delivered } = yield strategy.fail({
|
|
419
449
|
channel,
|
|
420
450
|
channelId: (_a = state.streamChannelId) !== null && _a !== void 0 ? _a : state.channelId,
|
|
421
|
-
streamTs: state.streamTs,
|
|
422
451
|
errorText,
|
|
423
452
|
sessionId: event.sessionId,
|
|
424
453
|
}));
|
|
@@ -7,7 +7,7 @@ import type { SlackBotMentionGate } from "./bot-mentions.js";
|
|
|
7
7
|
import type { ChannelPostWatcher } from "./channel-watch.js";
|
|
8
8
|
import type { EventIdDedupe } from "./event-id-dedupe.js";
|
|
9
9
|
import { type SlackLog } from "./log.js";
|
|
10
|
-
import type { SlackChannelState, SlackContinuationProbes, SlackCredentials, SlackMessage, SlackMessageHandler } from "./types.js";
|
|
10
|
+
import type { SlackChannelState, SlackContinuationProbes, SlackCredentials, SlackMessage, SlackMessageHandler, SlackSuggestedPrompt } from "./types.js";
|
|
11
11
|
/** Blank per-session adapter state. */
|
|
12
12
|
export declare function emptySlackChannelState(patch?: Partial<SlackChannelState>): SlackChannelState;
|
|
13
13
|
export interface SlackInboundDispatchDeps extends SlackContinuationProbes {
|
|
@@ -51,6 +51,12 @@ export interface SlackInboundDispatchDeps extends SlackContinuationProbes {
|
|
|
51
51
|
* `false` to admit them (or when an upstream gate already refused them).
|
|
52
52
|
*/
|
|
53
53
|
blockExternals?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Suggested prompts written on `assistant_thread_started` so the
|
|
56
|
+
* assistant pane is not blank before the first user message.
|
|
57
|
+
*/
|
|
58
|
+
suggestedPrompts?: SlackSuggestedPrompt[];
|
|
59
|
+
suggestedPromptsTitle?: string;
|
|
54
60
|
}
|
|
55
61
|
export declare function dispatchInboundMessage(args: {
|
|
56
62
|
kind: "app_mention" | "direct_message" | "channel_post" | "reaction_added" | "block_action";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/dispatch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,oBAAoB,EAI1B,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/dispatch.ts"],"names":[],"mappings":"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"}
|