@cursor/july 0.1.94 → 0.1.96
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/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/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +14 -2
- package/dist/channels/github/types.d.ts +18 -3
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/origin/api.d.ts +59 -13
- package/dist/channels/origin/api.d.ts.map +1 -1
- package/dist/channels/origin/api.js +168 -27
- package/dist/channels/origin/binding.d.ts +2 -2
- 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/origin-channel.d.ts.map +1 -1
- package/dist/channels/origin/origin-channel.js +11 -3
- package/dist/channels/origin/origin-webhook.d.ts +11 -1
- package/dist/channels/origin/origin-webhook.d.ts.map +1 -1
- package/dist/channels/origin/origin-webhook.js +23 -3
- package/dist/channels/origin/types.d.ts +8 -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/defaults.d.ts.map +1 -1
- package/dist/channels/slack/defaults.js +17 -46
- 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/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.map +1 -1
- package/dist/channels/slack/manifest.js +5 -1
- 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/pr-ref.d.ts +7 -1
- package/dist/channels/slack/pr-ref.d.ts.map +1 -1
- package/dist/channels/slack/pr-ref.js +42 -23
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +2 -2
- package/dist/docs/404.html +2 -2
- package/dist/docs/ab.html +4 -4
- package/dist/docs/assets/{app.CFDEas4I.js → app.jXleCmOc.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.DFoGuETX.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.B1IIYpYS.js → VPLocalSearchBox.8LhyglIT.js} +1 -1
- package/dist/docs/assets/chunks/{theme.Ct4NSiLm.js → theme.9ged-pr2.js} +2 -2
- package/dist/docs/assets/index.md.CI93Ltlb.js +5 -0
- package/dist/docs/assets/{index.md.DRakGHFe.lean.js → index.md.CI93Ltlb.lean.js} +1 -1
- package/dist/docs/assets/{reference_cli.md.Cw6_ICYG.js → reference_cli.md.CCnG-nJx.js} +4 -2
- package/dist/docs/assets/{reference_cli.md.Cw6_ICYG.lean.js → reference_cli.md.CCnG-nJx.lean.js} +1 -1
- package/dist/docs/assets/{reference_skills.md.8son6Hjm.js → reference_skills.md.BFW9retM.js} +3 -3
- package/dist/docs/assets/{templates_agentic-owners.md.DqtPdm6f.js → templates_agentic-owners.md.BZSH4N9z.js} +1 -1
- 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/{templates_demo.md.DhFcWN6j.js → templates_demo.md.BeQX9V3H.js} +1 -1
- package/dist/docs/assets/{templates_pr-autofixer.md.DU7dQpor.js → templates_pr-autofixer.md.x5zl6-GT.js} +2 -2
- package/dist/docs/assets/{templates_pr-autofixer.md.DU7dQpor.lean.js → templates_pr-autofixer.md.x5zl6-GT.lean.js} +1 -1
- package/dist/docs/assets/templates_security-help.md.C3Ny_Qr2.js +4 -0
- package/dist/docs/assets/templates_security-help.md.C3Ny_Qr2.lean.js +1 -0
- package/dist/docs/assets/{templates_security-reviewer.md.CTa7u_l1.js → templates_security-reviewer.md.lshxbCLK.js} +2 -2
- package/dist/docs/assets/{templates_security-reviewer.md.CTa7u_l1.lean.js → templates_security-reviewer.md.lshxbCLK.lean.js} +1 -1
- package/dist/docs/assets/{templates_triage.md.CVlpctKS.js → templates_triage.md.Co4UNzkZ.js} +3 -3
- package/dist/docs/assets/{templates_triage.md.CVlpctKS.lean.js → templates_triage.md.Co4UNzkZ.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +4 -4
- package/dist/docs/concepts.html +4 -4
- package/dist/docs/deployment.html +4 -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 +4 -4
- package/dist/docs/guides/opentelemetry.html +4 -4
- package/dist/docs/guides/slack.html +4 -4
- 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 +5 -1
- package/dist/docs/llms-full.txt +189 -26
- package/dist/docs/llms.txt +2 -0
- package/dist/docs/quickstart.html +4 -4
- package/dist/docs/reference/agent-config.html +4 -4
- package/dist/docs/reference/artifacts.html +4 -4
- package/dist/docs/reference/channels.html +4 -4
- package/dist/docs/reference/cli.html +8 -6
- package/dist/docs/reference/cli.md +4 -1
- package/dist/docs/reference/connections.html +4 -4
- package/dist/docs/reference/hooks.html +4 -4
- package/dist/docs/reference/http-api.html +4 -4
- 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 +4 -4
- package/dist/docs/reference/skills.html +7 -7
- package/dist/docs/reference/subagents.html +4 -4
- package/dist/docs/reference/tools.html +4 -4
- package/dist/docs/scaffolding-agents.html +4 -4
- package/dist/docs/storage.html +4 -4
- package/dist/docs/templates/agentic-owners.html +7 -7
- package/dist/docs/templates/agentic-owners.md +1 -1
- package/dist/docs/templates/code-wiki.html +28 -0
- package/dist/docs/templates/code-wiki.md +91 -0
- package/dist/docs/templates/demo.html +6 -6
- package/dist/docs/templates/demo.md +3 -2
- package/dist/docs/templates/pr-autofixer.html +6 -6
- package/dist/docs/templates/pr-autofixer.md +7 -13
- package/dist/docs/templates/security-help.html +30 -0
- package/dist/docs/templates/security-help.md +65 -0
- package/dist/docs/templates/security-reviewer.html +6 -6
- package/dist/docs/templates/security-reviewer.md +1 -2
- package/dist/docs/templates/triage.html +7 -7
- package/dist/docs/templates/triage.md +2 -6
- package/dist/docs/troubleshooting.html +4 -4
- package/dist/files-backends/cursor-hosted.d.ts +26 -0
- package/dist/files-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/files-backends/cursor-hosted.js +32 -4
- package/dist/files.d.ts +2 -0
- package/dist/files.d.ts.map +1 -1
- package/dist/files.js +5 -0
- 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 +15 -1
- 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/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +142 -7
- package/dist/internal/conversation-mirror.d.ts +85 -0
- package/dist/internal/conversation-mirror.d.ts.map +1 -0
- package/dist/internal/conversation-mirror.js +312 -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 +1 -0
- package/dist/internal/deferred-channel-session.d.ts +20 -0
- package/dist/internal/deferred-channel-session.d.ts.map +1 -0
- package/dist/internal/deferred-channel-session.js +62 -0
- package/dist/internal/deploy-client.d.ts +13 -1
- package/dist/internal/deploy-client.d.ts.map +1 -1
- package/dist/internal/deploy-client.js +11 -1
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +11 -5
- package/dist/internal/discovery.d.ts.map +1 -1
- package/dist/internal/discovery.js +22 -2
- 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 +204 -0
- package/dist/internal/framework-storage-selection.d.ts +38 -16
- package/dist/internal/framework-storage-selection.d.ts.map +1 -1
- package/dist/internal/framework-storage-selection.js +78 -17
- package/dist/internal/hosted-admission-context.d.ts +20 -0
- package/dist/internal/hosted-admission-context.d.ts.map +1 -0
- package/dist/internal/hosted-admission-context.js +31 -0
- package/dist/internal/hosted-delivery-protocol.d.ts +5 -0
- package/dist/internal/hosted-delivery-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-delivery-protocol.js +33 -1
- package/dist/internal/hosted-delivery.d.ts +11 -2
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +79 -35
- package/dist/internal/hosted-managed-automation.d.ts +30 -0
- package/dist/internal/hosted-managed-automation.d.ts.map +1 -0
- package/dist/internal/hosted-managed-automation.js +58 -0
- package/dist/internal/init-project.d.ts.map +1 -1
- package/dist/internal/init-project.js +2 -0
- package/dist/internal/install-cursor-skills.d.ts.map +1 -1
- package/dist/internal/install-cursor-skills.js +1 -3
- 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/review-comments.d.ts.map +1 -1
- package/dist/internal/review-comments.js +10 -98
- 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/scm/pr-url.d.ts +14 -0
- package/dist/internal/scm/pr-url.d.ts.map +1 -0
- package/dist/internal/scm/pr-url.js +65 -0
- package/dist/internal/sdk-runner.d.ts +25 -0
- package/dist/internal/sdk-runner.d.ts.map +1 -1
- package/dist/internal/sdk-runner.js +70 -0
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +11 -2
- package/dist/internal/session-engine.d.ts +13 -0
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +71 -3
- 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/playground/assets/index-B1DDvBeC.css +1 -0
- package/dist/playground/assets/{index-B3JCyigB.js → index-Cx9CclK_.js} +47 -47
- package/dist/playground/index.html +2 -2
- package/dist/storage-backends/cursor-hosted.d.ts +8 -0
- package/dist/storage-backends/cursor-hosted.d.ts.map +1 -1
- package/dist/storage-backends/cursor-hosted.js +4 -3
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/docs/README.md +5 -1
- package/docs/reference/cli.md +4 -1
- package/docs/templates/agentic-owners.md +1 -1
- package/docs/templates/code-wiki.md +96 -0
- package/docs/templates/demo.md +3 -2
- package/docs/templates/pr-autofixer.md +7 -13
- package/docs/templates/security-help.md +70 -0
- package/docs/templates/security-reviewer.md +1 -2
- package/docs/templates/triage.md +2 -6
- package/package.json +2 -2
- package/skills/ab/SKILL.md +13 -97
- package/skills/create-agent/SKILL.md +123 -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 +48 -107
- package/skills/otel/SKILL.md +22 -68
- package/skills/setup-slack/SKILL.md +77 -208
- package/src/channels/deployments/types.ts +1 -0
- package/src/channels/github/github-channel.ts +23 -8
- package/src/channels/github/types.ts +19 -2
- package/src/channels/origin/api.ts +242 -30
- package/src/channels/origin/binding.ts +2 -2
- package/src/channels/origin/checks.ts +6 -6
- package/src/channels/origin/cursor-account.ts +5 -3
- package/src/channels/origin/origin-channel.ts +13 -1
- package/src/channels/origin/origin-webhook.ts +27 -3
- package/src/channels/origin/types.ts +8 -0
- package/src/channels/slack/api.ts +41 -5
- package/src/channels/slack/defaults.ts +15 -49
- package/src/channels/slack/dispatch.ts +56 -22
- package/src/channels/slack/inbound.ts +43 -0
- package/src/channels/slack/live-delivery.ts +235 -114
- package/src/channels/slack/manifest.ts +5 -1
- package/src/channels/slack/nudge-carrier.ts +48 -1
- package/src/channels/slack/pr-ref.ts +56 -25
- package/src/channels/slack/slack-channel.ts +2 -0
- package/src/files-backends/cursor-hosted.ts +41 -2
- package/src/files.ts +11 -0
- package/src/internal/advertise-tools.ts +18 -2
- package/src/internal/bounded.ts +28 -0
- package/src/internal/cli-deploy.ts +183 -7
- package/src/internal/conversation-mirror.ts +406 -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 +1 -0
- package/src/internal/deferred-channel-session.ts +61 -0
- package/src/internal/deploy-client.ts +24 -1
- package/src/internal/deploy-manifest.ts +10 -5
- package/src/internal/discovery.ts +25 -2
- package/src/internal/framework-file-storage.ts +222 -0
- package/src/internal/framework-storage-selection.ts +101 -19
- package/src/internal/hosted-admission-context.ts +37 -0
- package/src/internal/hosted-delivery-protocol.ts +44 -1
- package/src/internal/hosted-delivery.ts +105 -40
- package/src/internal/hosted-managed-automation.ts +72 -0
- package/src/internal/init-project.ts +2 -0
- package/src/internal/install-cursor-skills.ts +1 -4
- package/src/internal/managed-delivery.ts +125 -0
- package/src/internal/review-comments.ts +10 -113
- package/src/internal/runtime-dispatch-runner.ts +10 -0
- package/src/internal/scm/pr-url.ts +95 -0
- package/src/internal/sdk-runner.ts +103 -0
- package/src/internal/server.ts +12 -0
- package/src/internal/session-engine.ts +76 -4
- package/src/internal/steering.ts +17 -0
- package/src/storage-backends/cursor-hosted.ts +10 -1
- package/src/types.ts +2 -1
- package/templates/agentic-owners/README.md +1 -1
- package/templates/agentic-owners/agent/agent.ts +0 -10
- package/templates/agentic-owners/agent/channels/github.ts +5 -14
- package/templates/agentic-owners/agent/lib/config.ts +0 -8
- package/templates/agentic-owners/agent/lib/review.ts +2 -15
- package/templates/agentic-owners/agent/tools/record_review.ts +2 -4
- 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/templates/demo/agent/agent.ts +0 -10
- package/templates/pr-autofixer/README.md +0 -2
- package/templates/pr-autofixer/agent/agent.ts +0 -11
- package/templates/pr-autofixer/agent/channels/slack.ts +0 -7
- package/templates/pr-autofixer/agent/lib/pr-state.ts +5 -17
- package/templates/pr-autofixer/agent/lib/repos.ts +0 -1
- package/templates/security-help/README.md +2 -2
- package/templates/security-help/agent/agent.ts +1 -2
- package/templates/security-help/agent/channels/slack.ts +0 -3
- package/templates/security-help/agent/instructions.md +9 -10
- package/templates/security-help/agent/skills/access-request.md +1 -1
- package/templates/security-help/agent/skills/faq.md +31 -0
- package/templates/security-help/agent/skills/security-playbooks.md +1 -1
- package/templates/security-help/package.json +1 -2
- package/templates/security-reviewer/agent/agent.ts +0 -10
- package/templates/triage/agent/agent.ts +0 -10
- package/templates/triage/agent/channels/queue.ts +1 -1
- package/templates/triage/agent/channels/webhook.ts +1 -3
- package/dist/docs/assets/chunks/@localSearchIndexroot.DU3U2Ij2.js +0 -1
- package/dist/docs/assets/index.md.DRakGHFe.js +0 -5
- 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-D9N7-q97.css +0 -1
- package/src/internal/deployment-scm-event-stream.ts +0 -593
- package/templates/security-help/agent/knowledge/faq/approvals.md +0 -5
- package/templates/security-help/agent/knowledge/faq/channels.md +0 -6
- package/templates/security-help/agent/knowledge/faq/phishing.md +0 -10
- package/templates/security-help/agent/skills/security-first-pass.md +0 -15
- /package/dist/docs/assets/{reference_skills.md.8son6Hjm.lean.js → reference_skills.md.BFW9retM.lean.js} +0 -0
- /package/dist/docs/assets/{templates_agentic-owners.md.DqtPdm6f.lean.js → templates_agentic-owners.md.BZSH4N9z.lean.js} +0 -0
- /package/dist/docs/assets/{templates_demo.md.DhFcWN6j.lean.js → templates_demo.md.BeQX9V3H.lean.js} +0 -0
|
@@ -12,12 +12,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
12
12
|
};
|
|
13
13
|
import { continuationSource, normalizeIdentity, } from "../../internal/continuation-identity.js";
|
|
14
14
|
import { routeLocalIngressContinuation } from "../../internal/local-ingress.js";
|
|
15
|
+
import { steeringEnabled } from "../../internal/steering.js";
|
|
15
16
|
import { buildSlackBinding, slackContinuationKey } from "./api.js";
|
|
16
|
-
import { firstLineTitle, maybeSetThreadTitle } from "./assistant.js";
|
|
17
|
+
import { firstLineTitle, maybeSetSuggestedPrompts, maybeSetThreadTitle, } from "./assistant.js";
|
|
17
18
|
import { appendSlackAttachmentAnnotations, prepareSlackAttachments, SLACK_ATTACHMENT_ONLY_PROMPT, } from "./attachments.js";
|
|
18
19
|
import { handleSlackEvalDirective, parseSlackEvalDirective, } from "./eval-directive.js";
|
|
19
20
|
import { isExternalSlackSender } from "./external-policy.js";
|
|
20
|
-
import { formatSlackContextBlock, parseAppMentionEvent, parseChannelMessageEvent, parseDirectMessageEvent, parseReactionAddedEvent, } from "./inbound.js";
|
|
21
|
+
import { formatSlackContextBlock, parseAppMentionEvent, parseAssistantThreadStarted, parseChannelMessageEvent, parseDirectMessageEvent, parseReactionAddedEvent, } from "./inbound.js";
|
|
21
22
|
import { defaultSlackLog } from "./log.js";
|
|
22
23
|
import { isWholeMessageStop } from "./stop.js";
|
|
23
24
|
import { loadSlackThreadContextBlock, loadSlackThreadDeltaBlock, } from "./thread-context.js";
|
|
@@ -311,22 +312,24 @@ export function dispatchInboundMessage(args) {
|
|
|
311
312
|
continuation,
|
|
312
313
|
event_id: args.eventId,
|
|
313
314
|
});
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
315
|
+
if (!steeringEnabled()) {
|
|
316
|
+
try {
|
|
317
|
+
yield (_r = args.host.slackNudges) === null || _r === void 0 ? void 0 : _r.append({
|
|
318
|
+
continuationKey: continuation,
|
|
319
|
+
sourceTs: message.ts,
|
|
320
|
+
text: media.userText,
|
|
321
|
+
author: (_s = message.author) === null || _s === void 0 ? void 0 : _s.userName,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
catch (nudgeError) {
|
|
325
|
+
log.warn("nudge append failed", {
|
|
326
|
+
error: nudgeError instanceof Error
|
|
327
|
+
? nudgeError.message
|
|
328
|
+
: String(nudgeError),
|
|
329
|
+
continuation,
|
|
330
|
+
event_id: args.eventId,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
330
333
|
}
|
|
331
334
|
try {
|
|
332
335
|
if (args.followUpStatus !== false) {
|
|
@@ -361,9 +364,9 @@ export function dispatchInboundMessage(args) {
|
|
|
361
364
|
* present. Returns true when a handler was scheduled.
|
|
362
365
|
*/
|
|
363
366
|
export function dispatchInboundFromEventBody(body, deps) {
|
|
364
|
-
var _a, _b;
|
|
365
|
-
var
|
|
366
|
-
const log = (
|
|
367
|
+
var _a, _b, _c;
|
|
368
|
+
var _d, _e, _f, _g;
|
|
369
|
+
const log = (_d = deps.log) !== null && _d !== void 0 ? _d : defaultSlackLog;
|
|
367
370
|
let eventId;
|
|
368
371
|
if (body !== null && typeof body === "object" && !Array.isArray(body)) {
|
|
369
372
|
const root = body;
|
|
@@ -386,7 +389,7 @@ export function dispatchInboundFromEventBody(body, deps) {
|
|
|
386
389
|
if (((_a = mention.author) === null || _a === void 0 ? void 0 : _a.isBot) === true) {
|
|
387
390
|
// Parse only admits bot-authored mentions when a gate exists, so the
|
|
388
391
|
// fallback is defensive.
|
|
389
|
-
const verdict = (
|
|
392
|
+
const verdict = (_e = (_b = deps.botMentionGate) === null || _b === void 0 ? void 0 : _b.evaluate(mention)) !== null && _e !== void 0 ? _e : {
|
|
390
393
|
allow: false,
|
|
391
394
|
reason: "bot mentions not enabled",
|
|
392
395
|
};
|
|
@@ -395,7 +398,7 @@ export function dispatchInboundFromEventBody(body, deps) {
|
|
|
395
398
|
event_id: eventId,
|
|
396
399
|
channel: mention.channelId,
|
|
397
400
|
thread_ts: mention.threadTs,
|
|
398
|
-
from_bot: (
|
|
401
|
+
from_bot: (_f = mention.author.botId) !== null && _f !== void 0 ? _f : mention.author.userId,
|
|
399
402
|
reason: verdict.reason,
|
|
400
403
|
});
|
|
401
404
|
return false;
|
|
@@ -450,6 +453,27 @@ export function dispatchInboundFromEventBody(body, deps) {
|
|
|
450
453
|
: { interruptContinuation: deps.interruptContinuation })), (eventId === undefined ? {} : { eventId }))));
|
|
451
454
|
return true;
|
|
452
455
|
}
|
|
456
|
+
const assistantThread = parseAssistantThreadStarted(body);
|
|
457
|
+
if (assistantThread !== null) {
|
|
458
|
+
const prompts = (_g = deps.suggestedPrompts) !== null && _g !== void 0 ? _g : [];
|
|
459
|
+
log.info("assistant thread started", {
|
|
460
|
+
channel: assistantThread.channelId,
|
|
461
|
+
thread_ts: assistantThread.threadTs,
|
|
462
|
+
user: assistantThread.userId,
|
|
463
|
+
event_id: eventId,
|
|
464
|
+
});
|
|
465
|
+
if (prompts.length > 0) {
|
|
466
|
+
deps.waitUntil(maybeSetSuggestedPrompts({
|
|
467
|
+
botToken: (_c = deps.credentials) === null || _c === void 0 ? void 0 : _c.botToken,
|
|
468
|
+
channelId: assistantThread.channelId,
|
|
469
|
+
threadTs: assistantThread.threadTs,
|
|
470
|
+
prompts,
|
|
471
|
+
title: deps.suggestedPromptsTitle,
|
|
472
|
+
log,
|
|
473
|
+
}));
|
|
474
|
+
}
|
|
475
|
+
return true;
|
|
476
|
+
}
|
|
453
477
|
if (deps.channelWatch !== undefined) {
|
|
454
478
|
// Parse keeps bot-authored posts; the watcher enforces the per-channel
|
|
455
479
|
// policy (includeBotPosts, own-post loop safety) with skip logging.
|
|
@@ -14,6 +14,14 @@ export interface ParseAppMentionOptions {
|
|
|
14
14
|
includeBotAuthored?: boolean;
|
|
15
15
|
}
|
|
16
16
|
export declare function parseAppMentionEvent(body: unknown, options?: ParseAppMentionOptions): SlackMessage | null;
|
|
17
|
+
export interface SlackAssistantThreadStarted {
|
|
18
|
+
channelId: string;
|
|
19
|
+
threadTs: string;
|
|
20
|
+
userId?: string;
|
|
21
|
+
teamId?: string;
|
|
22
|
+
}
|
|
23
|
+
/** Slack fires this when a user opens the assistant pane. No model turn. */
|
|
24
|
+
export declare function parseAssistantThreadStarted(body: unknown): SlackAssistantThreadStarted | null;
|
|
17
25
|
/**
|
|
18
26
|
* Parse DM / IM messages. More generous than a strict channel_type check:
|
|
19
27
|
* accepts `channel_type === "im"` or channel ids starting with `D`, and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbound.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/inbound.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAe5D,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASxD;AAsDD,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,sBAAsB,GAC/B,YAAY,GAAG,IAAI,CAsBrB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CA8B1E;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAkD1E;AAED,4EAA4E;AAC5E,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,MAAM,WAAW,0BAA0B;IACzC;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,0BAA0B,GACnC,wBAAwB,GAAG,IAAI,CA4DjC;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAYT"}
|
|
1
|
+
{"version":3,"file":"inbound.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/inbound.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAe5D,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASxD;AAsDD,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,sBAAsB,GAC/B,YAAY,GAAG,IAAI,CAsBrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,4EAA4E;AAC5E,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,OAAO,GACZ,2BAA2B,GAAG,IAAI,CA+BpC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CA8B1E;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAkD1E;AAED,4EAA4E;AAC5E,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,MAAM,WAAW,0BAA0B;IACzC;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,0BAA0B,GACnC,wBAAwB,GAAG,IAAI,CA4DjC;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAYT"}
|
|
@@ -79,6 +79,38 @@ export function parseAppMentionEvent(body, options) {
|
|
|
79
79
|
const delegation = parseDelegationMetadata(event);
|
|
80
80
|
return delegation === undefined ? message : Object.assign(Object.assign({}, message), { delegation });
|
|
81
81
|
}
|
|
82
|
+
/** Slack fires this when a user opens the assistant pane. No model turn. */
|
|
83
|
+
export function parseAssistantThreadStarted(body) {
|
|
84
|
+
var _a;
|
|
85
|
+
const root = asRecord(body);
|
|
86
|
+
if (root === null || root.type !== "event_callback") {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
const event = asRecord(root.event);
|
|
90
|
+
if (event === null || event.type !== "assistant_thread_started") {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
const thread = asRecord(event.assistant_thread);
|
|
94
|
+
if (thread === null) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
const channelId = asString(thread.channel_id);
|
|
98
|
+
const threadTs = asString(thread.thread_ts);
|
|
99
|
+
if (channelId === undefined ||
|
|
100
|
+
channelId === "" ||
|
|
101
|
+
threadTs === undefined ||
|
|
102
|
+
threadTs === "") {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
const userId = asString(thread.user_id);
|
|
106
|
+
const teamId = (_a = asString(root.team_id)) !== null && _a !== void 0 ? _a : asString(event.team_id);
|
|
107
|
+
return {
|
|
108
|
+
channelId,
|
|
109
|
+
threadTs,
|
|
110
|
+
userId: userId === undefined || userId === "" ? undefined : userId,
|
|
111
|
+
teamId: teamId === undefined || teamId === "" ? undefined : teamId,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
82
114
|
/**
|
|
83
115
|
* Parse DM / IM messages. More generous than a strict channel_type check:
|
|
84
116
|
* accepts `channel_type === "im"` or channel ids starting with `D`, and
|
|
@@ -4,68 +4,65 @@
|
|
|
4
4
|
* Cursor-account channels do not use this path — they reply with a single
|
|
5
5
|
* final `chat.postMessage` and put thinking on `assistant.threads.setStatus`
|
|
6
6
|
* (no message edits).
|
|
7
|
+
*
|
|
8
|
+
* Assistant-pane threads only render stream APIs. Start lazily with the
|
|
9
|
+
* first real markdown/chunks plus recipient ids — empty startStream is
|
|
10
|
+
* rejected or never attaches.
|
|
7
11
|
*/
|
|
8
12
|
import type { ChannelEventContext } from "../../types.js";
|
|
9
13
|
import type { SlackLog } from "./log.js";
|
|
14
|
+
import { type StreamTaskChunk } from "./stream.js";
|
|
10
15
|
import type { SlackBotToken, SlackChannelState } from "./types.js";
|
|
11
16
|
type SlackChannel = ChannelEventContext<SlackChannelState>;
|
|
12
17
|
export interface LiveDeliveryDeps {
|
|
13
18
|
botToken: SlackBotToken | undefined;
|
|
14
19
|
getLog: () => SlackLog;
|
|
15
20
|
}
|
|
21
|
+
type OpenArgs = {
|
|
22
|
+
channel: SlackChannel;
|
|
23
|
+
channelId: string;
|
|
24
|
+
threadTs: string;
|
|
25
|
+
sessionId: string;
|
|
26
|
+
markdown_text?: string;
|
|
27
|
+
chunks?: StreamTaskChunk[];
|
|
28
|
+
};
|
|
29
|
+
type StreamArgs = {
|
|
30
|
+
channel: SlackChannel;
|
|
31
|
+
channelId: string;
|
|
32
|
+
sessionId: string;
|
|
33
|
+
};
|
|
16
34
|
/**
|
|
17
35
|
* How the default handlers deliver an in-progress reply. Methods write live
|
|
18
36
|
* delivery state (`streamTs`, `streamChannelId`, `lastPostedText`,
|
|
19
37
|
* `streamingUnavailable`) on `channel.state` directly.
|
|
20
38
|
*/
|
|
21
39
|
export interface LiveDeliveryStrategy {
|
|
22
|
-
/** True when tool-call thinking steps can be appended to the live message. */
|
|
23
40
|
readonly inlineToolSteps: boolean;
|
|
24
|
-
/** Open the live message
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
channelId: string;
|
|
28
|
-
threadTs: string;
|
|
29
|
-
sessionId: string;
|
|
30
|
-
}): Promise<void>;
|
|
31
|
-
/** Push the latest cumulative text to the live message (throttled). */
|
|
32
|
-
append(args: {
|
|
33
|
-
channel: SlackChannel;
|
|
34
|
-
channelId: string;
|
|
35
|
-
streamTs: string;
|
|
41
|
+
/** Open the live message with the first real markdown or task chunks. */
|
|
42
|
+
open(args: OpenArgs): Promise<boolean>;
|
|
43
|
+
append(args: StreamArgs & {
|
|
36
44
|
text: string;
|
|
37
|
-
sessionId: string;
|
|
38
45
|
}): Promise<void>;
|
|
46
|
+
appendChunks(args: StreamArgs & {
|
|
47
|
+
chunks: StreamTaskChunk[];
|
|
48
|
+
}): Promise<boolean>;
|
|
39
49
|
/**
|
|
40
50
|
* Flush the final reply text. `delivered` is false only when the caller must
|
|
41
51
|
* post the full reply as a fresh message (finalize failed on partial text).
|
|
42
52
|
*/
|
|
43
|
-
finalize(args: {
|
|
44
|
-
channel: SlackChannel;
|
|
45
|
-
channelId: string;
|
|
46
|
-
streamTs: string;
|
|
53
|
+
finalize(args: StreamArgs & {
|
|
47
54
|
text: string;
|
|
48
|
-
sessionId: string;
|
|
49
55
|
}): Promise<{
|
|
50
56
|
delivered: boolean;
|
|
51
57
|
}>;
|
|
52
|
-
/** Close the live message when the turn produced no final text. */
|
|
53
58
|
finalizeEmpty(args: {
|
|
54
59
|
channel: SlackChannel;
|
|
55
|
-
channelId: string;
|
|
56
|
-
streamTs: string;
|
|
57
60
|
}): Promise<void>;
|
|
58
|
-
/** Best-effort remove a live message left open after the turn ended. */
|
|
59
61
|
cleanupOrphan(args: {
|
|
60
62
|
channel: SlackChannel;
|
|
61
63
|
}): Promise<void>;
|
|
62
|
-
|
|
63
|
-
fail(args: {
|
|
64
|
-
channel: SlackChannel;
|
|
65
|
-
channelId: string;
|
|
66
|
-
streamTs: string;
|
|
64
|
+
fail(args: StreamArgs & {
|
|
67
65
|
errorText: string;
|
|
68
|
-
sessionId: string;
|
|
69
66
|
}): Promise<{
|
|
70
67
|
delivered: boolean;
|
|
71
68
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-delivery.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/live-delivery.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"live-delivery.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/live-delivery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnE,KAAK,YAAY,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,MAAM,QAAQ,CAAC;CACxB;AAED,KAAK,QAAQ,GAAG;IACd,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;CAC5B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,yEAAyE;IACzE,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,YAAY,CACV,IAAI,EAAE,UAAU,GAAG;QAAE,MAAM,EAAE,eAAe,EAAE,CAAA;KAAE,GAC/C,OAAO,CAAC,OAAO,CAAC,CAAC;IACpB;;;OAGG;IACH,QAAQ,CACN,IAAI,EAAE,UAAU,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAClC,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACnC,aAAa,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,aAAa,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,YAAY,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,CACF,IAAI,EAAE,UAAU,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GACvC,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACpC;AAmBD,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,gBAAgB,GACrB,oBAAoB,CA0PtB"}
|
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
* Cursor-account channels do not use this path — they reply with a single
|
|
5
5
|
* final `chat.postMessage` and put thinking on `assistant.threads.setStatus`
|
|
6
6
|
* (no message edits).
|
|
7
|
+
*
|
|
8
|
+
* Assistant-pane threads only render stream APIs. Start lazily with the
|
|
9
|
+
* first real markdown/chunks plus recipient ids — empty startStream is
|
|
10
|
+
* rejected or never attaches.
|
|
7
11
|
*/
|
|
8
12
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
13
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
@@ -16,43 +20,115 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
16
20
|
};
|
|
17
21
|
import { appendChatStream, startChatStream, stopChatStream } from "./api.js";
|
|
18
22
|
import { computeStreamAppend } from "./stream.js";
|
|
23
|
+
function streamRecipients(channel) {
|
|
24
|
+
const user = channel.state.triggeringUserId;
|
|
25
|
+
const team = channel.state.teamId;
|
|
26
|
+
return {
|
|
27
|
+
recipient_user_id: user === null || user === "" ? undefined : user,
|
|
28
|
+
recipient_team_id: team === null || team === "" ? undefined : team,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function activeStreamTs(channel) {
|
|
32
|
+
const ts = channel.state.streamTs;
|
|
33
|
+
return ts === null || ts === "" ? null : ts;
|
|
34
|
+
}
|
|
19
35
|
export function createStreamDeliveryStrategy(deps) {
|
|
20
36
|
const { botToken, getLog } = deps;
|
|
37
|
+
const open = (_a) => __awaiter(this, [_a], void 0, function* ({ channel, channelId, threadTs, sessionId, markdown_text, chunks, }) {
|
|
38
|
+
if (activeStreamTs(channel) !== null) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
const hasMarkdown = markdown_text !== undefined && markdown_text !== "";
|
|
42
|
+
const hasChunks = chunks !== undefined && chunks.length > 0;
|
|
43
|
+
if (!hasMarkdown && !hasChunks) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
const log = getLog();
|
|
47
|
+
const started = yield startChatStream(Object.assign({ botToken, channel: channelId, thread_ts: threadTs, markdown_text: hasMarkdown ? markdown_text : undefined, chunks: hasChunks ? chunks : undefined }, streamRecipients(channel)));
|
|
48
|
+
if (!started.ok) {
|
|
49
|
+
log.warn("chat.startStream unavailable", {
|
|
50
|
+
error: started.error,
|
|
51
|
+
channel: channelId,
|
|
52
|
+
thread_ts: threadTs,
|
|
53
|
+
session: sessionId,
|
|
54
|
+
});
|
|
55
|
+
if (started.unsupported === true) {
|
|
56
|
+
channel.state.streamingUnavailable = true;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
channel.state.streamTs = started.ts;
|
|
61
|
+
channel.state.streamChannelId = started.channel;
|
|
62
|
+
channel.state.lastPostedText = hasMarkdown ? (markdown_text !== null && markdown_text !== void 0 ? markdown_text : "") : "";
|
|
63
|
+
log.info("chat.startStream ok", {
|
|
64
|
+
channel: started.channel,
|
|
65
|
+
stream_ts: started.ts,
|
|
66
|
+
session: sessionId,
|
|
67
|
+
});
|
|
68
|
+
return true;
|
|
69
|
+
});
|
|
70
|
+
const ensureOpen = (args) => __awaiter(this, void 0, void 0, function* () {
|
|
71
|
+
const existing = activeStreamTs(args.channel);
|
|
72
|
+
if (existing !== null) {
|
|
73
|
+
return existing;
|
|
74
|
+
}
|
|
75
|
+
const threadTs = args.channel.state.threadTs;
|
|
76
|
+
if (threadTs === null || threadTs === "") {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const opened = yield open({
|
|
80
|
+
channel: args.channel,
|
|
81
|
+
channelId: args.channelId,
|
|
82
|
+
threadTs,
|
|
83
|
+
sessionId: args.sessionId,
|
|
84
|
+
markdown_text: args.markdown_text,
|
|
85
|
+
chunks: args.chunks,
|
|
86
|
+
});
|
|
87
|
+
return opened ? activeStreamTs(args.channel) : null;
|
|
88
|
+
});
|
|
89
|
+
const stopWithSuffix = (args) => __awaiter(this, void 0, void 0, function* () {
|
|
90
|
+
const appendText = computeStreamAppend(args.channel.state.lastPostedText, args.text);
|
|
91
|
+
const stopped = yield stopChatStream({
|
|
92
|
+
botToken,
|
|
93
|
+
channel: args.channelId,
|
|
94
|
+
ts: args.ts,
|
|
95
|
+
markdown_text: appendText === "" ? undefined : appendText,
|
|
96
|
+
});
|
|
97
|
+
args.channel.state.streamTs = null;
|
|
98
|
+
if (stopped.ok) {
|
|
99
|
+
args.channel.state.lastPostedText = args.text;
|
|
100
|
+
args.channel.state.lastBotMessageTs = args.ts;
|
|
101
|
+
return { ok: true };
|
|
102
|
+
}
|
|
103
|
+
if (stopped.unsupported === true) {
|
|
104
|
+
args.channel.state.streamingUnavailable = true;
|
|
105
|
+
}
|
|
106
|
+
return { ok: false, error: stopped.error };
|
|
107
|
+
});
|
|
108
|
+
const closeOrphan = (channel) => __awaiter(this, void 0, void 0, function* () {
|
|
109
|
+
var _a;
|
|
110
|
+
const orphanTs = activeStreamTs(channel);
|
|
111
|
+
const channelId = (_a = channel.state.streamChannelId) !== null && _a !== void 0 ? _a : channel.state.channelId;
|
|
112
|
+
if (orphanTs === null || channelId === null || channelId === "") {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
yield stopChatStream({ botToken, channel: channelId, ts: orphanTs });
|
|
116
|
+
channel.state.streamTs = null;
|
|
117
|
+
});
|
|
21
118
|
return {
|
|
22
119
|
inlineToolSteps: true,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
markdown_text:
|
|
120
|
+
open,
|
|
121
|
+
append(_a) {
|
|
122
|
+
return __awaiter(this, arguments, void 0, function* ({ channel, channelId, text, sessionId }) {
|
|
123
|
+
const ts = yield ensureOpen({
|
|
124
|
+
channel,
|
|
125
|
+
channelId,
|
|
126
|
+
sessionId,
|
|
127
|
+
markdown_text: text,
|
|
31
128
|
});
|
|
32
|
-
if (
|
|
33
|
-
log.warn("chat.startStream unavailable", {
|
|
34
|
-
error: started.error,
|
|
35
|
-
channel: channelId,
|
|
36
|
-
thread_ts: threadTs,
|
|
37
|
-
session: sessionId,
|
|
38
|
-
});
|
|
39
|
-
if (started.unsupported === true) {
|
|
40
|
-
channel.state.streamingUnavailable = true;
|
|
41
|
-
}
|
|
129
|
+
if (ts === null) {
|
|
42
130
|
return;
|
|
43
131
|
}
|
|
44
|
-
channel.state.streamTs = started.ts;
|
|
45
|
-
channel.state.streamChannelId = started.channel;
|
|
46
|
-
channel.state.lastPostedText = "";
|
|
47
|
-
log.info("chat.startStream ok", {
|
|
48
|
-
channel: started.channel,
|
|
49
|
-
stream_ts: started.ts,
|
|
50
|
-
session: sessionId,
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
},
|
|
54
|
-
append(_a) {
|
|
55
|
-
return __awaiter(this, arguments, void 0, function* ({ channel, channelId, streamTs, text, sessionId }) {
|
|
56
132
|
const appendText = computeStreamAppend(channel.state.lastPostedText, text);
|
|
57
133
|
if (appendText === "") {
|
|
58
134
|
return;
|
|
@@ -60,14 +136,14 @@ export function createStreamDeliveryStrategy(deps) {
|
|
|
60
136
|
const result = yield appendChatStream({
|
|
61
137
|
botToken,
|
|
62
138
|
channel: channelId,
|
|
63
|
-
ts
|
|
139
|
+
ts,
|
|
64
140
|
markdown_text: appendText,
|
|
65
141
|
});
|
|
66
142
|
if (!result.ok) {
|
|
67
143
|
getLog().warn("appendStream failed", {
|
|
68
144
|
error: result.error,
|
|
69
145
|
channel: channelId,
|
|
70
|
-
stream_ts:
|
|
146
|
+
stream_ts: ts,
|
|
71
147
|
session: sessionId,
|
|
72
148
|
});
|
|
73
149
|
if (result.unsupported === true) {
|
|
@@ -78,24 +154,52 @@ export function createStreamDeliveryStrategy(deps) {
|
|
|
78
154
|
channel.state.lastPostedText = text;
|
|
79
155
|
});
|
|
80
156
|
},
|
|
81
|
-
|
|
82
|
-
return __awaiter(this, arguments, void 0, function* ({ channel, channelId,
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
157
|
+
appendChunks(_a) {
|
|
158
|
+
return __awaiter(this, arguments, void 0, function* ({ channel, channelId, chunks, sessionId }) {
|
|
159
|
+
const hadStream = activeStreamTs(channel) !== null;
|
|
160
|
+
const ts = yield ensureOpen({
|
|
161
|
+
channel,
|
|
162
|
+
channelId,
|
|
163
|
+
sessionId,
|
|
164
|
+
chunks,
|
|
165
|
+
});
|
|
166
|
+
if (ts === null) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
if (!hadStream) {
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
const result = yield appendChatStream({
|
|
87
173
|
botToken,
|
|
88
174
|
channel: channelId,
|
|
89
|
-
ts
|
|
90
|
-
|
|
175
|
+
ts,
|
|
176
|
+
chunks,
|
|
177
|
+
});
|
|
178
|
+
return result.ok;
|
|
179
|
+
});
|
|
180
|
+
},
|
|
181
|
+
finalize(_a) {
|
|
182
|
+
return __awaiter(this, arguments, void 0, function* ({ channel, channelId, text, sessionId }) {
|
|
183
|
+
const log = getLog();
|
|
184
|
+
const ts = yield ensureOpen({
|
|
185
|
+
channel,
|
|
186
|
+
channelId,
|
|
187
|
+
sessionId,
|
|
188
|
+
markdown_text: text,
|
|
189
|
+
});
|
|
190
|
+
if (ts === null) {
|
|
191
|
+
return { delivered: false };
|
|
192
|
+
}
|
|
193
|
+
const stopped = yield stopWithSuffix({
|
|
194
|
+
channel,
|
|
195
|
+
channelId,
|
|
196
|
+
ts,
|
|
197
|
+
text,
|
|
91
198
|
});
|
|
92
199
|
if (stopped.ok) {
|
|
93
|
-
channel.state.streamTs = null;
|
|
94
|
-
channel.state.lastPostedText = text;
|
|
95
|
-
channel.state.lastBotMessageTs = streamTs;
|
|
96
200
|
log.info("reply delivered via stream", {
|
|
97
201
|
channel: channelId,
|
|
98
|
-
stream_ts:
|
|
202
|
+
stream_ts: ts,
|
|
99
203
|
session: sessionId,
|
|
100
204
|
chars: text.length,
|
|
101
205
|
});
|
|
@@ -104,52 +208,47 @@ export function createStreamDeliveryStrategy(deps) {
|
|
|
104
208
|
log.warn("chat.stopStream failed; falling back to postMessage", {
|
|
105
209
|
error: stopped.error,
|
|
106
210
|
channel: channelId,
|
|
107
|
-
stream_ts:
|
|
211
|
+
stream_ts: ts,
|
|
108
212
|
session: sessionId,
|
|
109
213
|
});
|
|
110
|
-
if (stopped.unsupported === true) {
|
|
111
|
-
channel.state.streamingUnavailable = true;
|
|
112
|
-
}
|
|
113
|
-
channel.state.streamTs = null;
|
|
114
|
-
// If we already streamed content, do not post the full reply again.
|
|
115
214
|
const alreadyStreamed = typeof channel.state.lastPostedText === "string" &&
|
|
116
215
|
channel.state.lastPostedText.length > 0;
|
|
117
216
|
return { delivered: alreadyStreamed };
|
|
118
217
|
});
|
|
119
218
|
},
|
|
120
219
|
finalizeEmpty(_a) {
|
|
121
|
-
return __awaiter(this, arguments, void 0, function* ({
|
|
122
|
-
yield
|
|
220
|
+
return __awaiter(this, arguments, void 0, function* ({ channel }) {
|
|
221
|
+
yield closeOrphan(channel);
|
|
123
222
|
});
|
|
124
223
|
},
|
|
125
224
|
cleanupOrphan(_a) {
|
|
126
225
|
return __awaiter(this, arguments, void 0, function* ({ channel }) {
|
|
127
|
-
|
|
128
|
-
// message.completed / turn.failed already stop the stream. If the
|
|
129
|
-
// turn ended without a final assistant message, close it here so
|
|
130
|
-
// Slack does not leave the live reply in a streaming state.
|
|
131
|
-
const streamTs = channel.state.streamTs;
|
|
132
|
-
const channelId = (_b = channel.state.streamChannelId) !== null && _b !== void 0 ? _b : channel.state.channelId;
|
|
133
|
-
if (streamTs === null ||
|
|
134
|
-
streamTs === "" ||
|
|
135
|
-
channelId === null ||
|
|
136
|
-
channelId === "") {
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
yield stopChatStream({ botToken, channel: channelId, ts: streamTs });
|
|
140
|
-
channel.state.streamTs = null;
|
|
226
|
+
yield closeOrphan(channel);
|
|
141
227
|
});
|
|
142
228
|
},
|
|
143
229
|
fail(_a) {
|
|
144
|
-
return __awaiter(this, arguments, void 0, function* ({ channel, channelId,
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
230
|
+
return __awaiter(this, arguments, void 0, function* ({ channel, channelId, errorText, sessionId }) {
|
|
231
|
+
const ts = yield ensureOpen({
|
|
232
|
+
channel,
|
|
233
|
+
channelId,
|
|
234
|
+
sessionId,
|
|
149
235
|
markdown_text: errorText,
|
|
150
236
|
});
|
|
151
|
-
|
|
152
|
-
|
|
237
|
+
if (ts === null) {
|
|
238
|
+
return { delivered: false };
|
|
239
|
+
}
|
|
240
|
+
const stopped = yield stopWithSuffix({
|
|
241
|
+
channel,
|
|
242
|
+
channelId,
|
|
243
|
+
ts,
|
|
244
|
+
text: errorText,
|
|
245
|
+
});
|
|
246
|
+
if (stopped.ok) {
|
|
247
|
+
return { delivered: true };
|
|
248
|
+
}
|
|
249
|
+
const alreadyStreamed = typeof channel.state.lastPostedText === "string" &&
|
|
250
|
+
channel.state.lastPostedText.length > 0;
|
|
251
|
+
return { delivered: alreadyStreamed };
|
|
153
252
|
});
|
|
154
253
|
},
|
|
155
254
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,iCAAiC,iDACE,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,QAAQ,EAAE;QACR,QAAQ,EAAE;YACR,YAAY,EAAE,MAAM,CAAC;YACrB,aAAa,EAAE,OAAO,CAAC;SACxB,CAAC;QACF,UAAU,CAAC,EAAE;YACX,iBAAiB,EAAE,MAAM,CAAC;YAC1B,iBAAiB,EAAE,KAAK,CAAC;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SAC9D,CAAC;QACF,QAAQ,CAAC,EAAE;YACT,gBAAgB,EAAE,OAAO,CAAC;YAC1B,oBAAoB,EAAE,OAAO,CAAC;YAC9B,8BAA8B,EAAE,OAAO,CAAC;SACzC,CAAC;KACH,CAAC;IACF,YAAY,EAAE;QACZ,MAAM,EAAE;YACN,GAAG,EAAE,MAAM,EAAE,CAAC;SACf,CAAC;QACF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,QAAQ,EAAE;QACR,mBAAmB,EAAE;YACnB,UAAU,EAAE,MAAM,EAAE,CAAC;SACtB,CAAC;QACF,aAAa,EAAE;YACb,UAAU,EAAE,OAAO,CAAC;SACrB,CAAC;QACF,kBAAkB,EAAE,OAAO,CAAC;QAC5B,mBAAmB,EAAE,OAAO,CAAC;QAC7B,sBAAsB,EAAE,OAAO,CAAC;QAChC,cAAc,EAAE,OAAO,CAAC;QACxB,oBAAoB,CAAC,EAAE;YACrB,8BAA8B,EAAE,OAAO,CAAC;YACxC,2BAA2B,EAAE,MAAM,CAAC;SACrC,CAAC;KACH,CAAC;CACH;
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,iCAAiC,iDACE,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,QAAQ,EAAE;QACR,QAAQ,EAAE;YACR,YAAY,EAAE,MAAM,CAAC;YACrB,aAAa,EAAE,OAAO,CAAC;SACxB,CAAC;QACF,UAAU,CAAC,EAAE;YACX,iBAAiB,EAAE,MAAM,CAAC;YAC1B,iBAAiB,EAAE,KAAK,CAAC;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;SAC9D,CAAC;QACF,QAAQ,CAAC,EAAE;YACT,gBAAgB,EAAE,OAAO,CAAC;YAC1B,oBAAoB,EAAE,OAAO,CAAC;YAC9B,8BAA8B,EAAE,OAAO,CAAC;SACzC,CAAC;KACH,CAAC;IACF,YAAY,EAAE;QACZ,MAAM,EAAE;YACN,GAAG,EAAE,MAAM,EAAE,CAAC;SACf,CAAC;QACF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,QAAQ,EAAE;QACR,mBAAmB,EAAE;YACnB,UAAU,EAAE,MAAM,EAAE,CAAC;SACtB,CAAC;QACF,aAAa,EAAE;YACb,UAAU,EAAE,OAAO,CAAC;SACrB,CAAC;QACF,kBAAkB,EAAE,OAAO,CAAC;QAC5B,mBAAmB,EAAE,OAAO,CAAC;QAC7B,sBAAsB,EAAE,OAAO,CAAC;QAChC,cAAc,EAAE,OAAO,CAAC;QACxB,oBAAoB,CAAC,EAAE;YACrB,8BAA8B,EAAE,OAAO,CAAC;YACxC,2BAA2B,EAAE,MAAM,CAAC;SACrC,CAAC;KACH,CAAC;CACH;AA6DD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,oBAAoB,GAC5B,gBAAgB,CAiFlB;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,KAAK,CAAC,GACzC;IACD,GAAG,EAAE,gBAAgB,CAAC;IACtB,IAAI,EAAE,gBAAgB,CAAC;CACxB,CAKA;AAED,kDAAkD;AAClD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE;IAAE,GAAG,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE,EACvD,GAAG,GAAE,KAAK,GAAG,MAAM,GAAG,MAAe,GACpC,aAAa,CAAC;IACf,IAAI,EAAE,mBAAmB,GAAG,oBAAoB,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAkBD"}
|
|
@@ -31,7 +31,11 @@ const BOT_SCOPES = [
|
|
|
31
31
|
"reactions:write",
|
|
32
32
|
"users:read",
|
|
33
33
|
];
|
|
34
|
-
const BOT_EVENTS = [
|
|
34
|
+
const BOT_EVENTS = [
|
|
35
|
+
"app_mention",
|
|
36
|
+
"message.im",
|
|
37
|
+
"assistant_thread_started",
|
|
38
|
+
];
|
|
35
39
|
/** Slack's display_information.description bound. */
|
|
36
40
|
const MAX_DESCRIPTION_LENGTH = 140;
|
|
37
41
|
const DESCRIPTION_SUFFIX = " — an AI agent built with Cursor";
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
export declare const SLACK_NUDGE_ROOT_REL = ".agent-serve/slack-nudge-root";
|
|
6
6
|
export declare const SLACK_NUDGE_CONTINUATION_REL = ".agent-serve/slack-nudge-continuation";
|
|
7
7
|
export declare const SLACK_NUDGE_CARRIER_REL = ".agent-serve/slack-nudge-carrier.mjs";
|
|
8
|
+
/** Conversation allowed to claim nudges; subagents share the cwd and would otherwise take the parent's. */
|
|
9
|
+
export declare const SLACK_NUDGE_OWNER_REL = ".agent-serve/slack-nudge-owner";
|
|
8
10
|
/** Carrier script body — reads nudge-root + continuation, drains pending. */
|
|
9
11
|
export declare const SLACK_NUDGE_CARRIER_SCRIPT: string;
|
|
10
12
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nudge-carrier.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/nudge-carrier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,eAAO,MAAM,oBAAoB,kCAAkC,CAAC;AACpE,eAAO,MAAM,4BAA4B,0CACA,CAAC;AAC1C,eAAO,MAAM,uBAAuB,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"nudge-carrier.d.ts","sourceRoot":"","sources":["../../../src/channels/slack/nudge-carrier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,eAAO,MAAM,oBAAoB,kCAAkC,CAAC;AACpE,eAAO,MAAM,4BAA4B,0CACA,CAAC;AAC1C,eAAO,MAAM,uBAAuB,yCAAyC,CAAC;AAC9E,2GAA2G;AAC3G,eAAO,MAAM,qBAAqB,mCAAmC,CAAC;AAEtE,6EAA6E;AAC7E,eAAO,MAAM,0BAA0B,EAAE,MAyJxC,CAAC;AAOF;;;GAGG;AACH,wBAAsB,4BAA4B,CAAC,IAAI,EAAE;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4ChB"}
|