@cursor/bdk 0.2.8 → 0.2.10
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/dist/artifacts.js +3 -5
- package/dist/bin/agent-serve.d.ts +1 -0
- package/dist/bin/agent-serve.d.ts.map +1 -1
- package/dist/bin/agent-serve.js +820 -807
- package/dist/channels/bitbucket/api.js +305 -321
- package/dist/channels/bitbucket/binding.js +97 -61
- package/dist/channels/bitbucket/bitbucket-channel.d.ts +15 -1
- package/dist/channels/bitbucket/bitbucket-channel.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-channel.js +95 -42
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts +11 -0
- package/dist/channels/bitbucket/bitbucket-webhook.d.ts.map +1 -1
- package/dist/channels/bitbucket/bitbucket-webhook.js +214 -204
- package/dist/channels/bitbucket/checks.js +9 -21
- package/dist/channels/bitbucket/cursor-account.js +1 -1
- package/dist/channels/bitbucket/defaults.js +14 -4
- package/dist/channels/bitbucket/events.js +1 -2
- package/dist/channels/bitbucket/index.d.ts +6 -2
- package/dist/channels/bitbucket/index.d.ts.map +1 -1
- package/dist/channels/bitbucket/index.js +6 -2
- package/dist/channels/bitbucket/replay.js +80 -56
- package/dist/channels/bitbucket/state.js +16 -7
- package/dist/channels/bitbucket/types.d.ts +11 -2
- package/dist/channels/bitbucket/types.d.ts.map +1 -1
- package/dist/channels/checks.js +18 -28
- package/dist/channels/deployments/deployments-channel.js +26 -34
- package/dist/channels/github/api.js +216 -210
- package/dist/channels/github/auth.d.ts +5 -1
- package/dist/channels/github/auth.d.ts.map +1 -1
- package/dist/channels/github/auth.js +157 -174
- package/dist/channels/github/binding.js +48 -39
- package/dist/channels/github/checks.js +9 -14
- package/dist/channels/github/cursor-account.js +6 -11
- package/dist/channels/github/defaults.js +105 -130
- package/dist/channels/github/forward.js +13 -17
- package/dist/channels/github/github-channel.d.ts +43 -2
- package/dist/channels/github/github-channel.d.ts.map +1 -1
- package/dist/channels/github/github-channel.js +1228 -958
- package/dist/channels/github/progress.js +145 -146
- package/dist/channels/github/replay.js +30 -39
- package/dist/channels/github/state.js +40 -16
- package/dist/channels/github/types.d.ts +30 -6
- package/dist/channels/github/types.d.ts.map +1 -1
- package/dist/channels/gitlab/api.js +100 -114
- package/dist/channels/gitlab/binding.js +52 -33
- package/dist/channels/gitlab/checks.js +28 -29
- package/dist/channels/gitlab/cursor-account.js +1 -1
- package/dist/channels/gitlab/defaults.js +9 -3
- package/dist/channels/gitlab/gitlab-channel.d.ts +16 -1
- package/dist/channels/gitlab/gitlab-channel.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-channel.js +95 -42
- package/dist/channels/gitlab/gitlab-webhook.d.ts +10 -1
- package/dist/channels/gitlab/gitlab-webhook.d.ts.map +1 -1
- package/dist/channels/gitlab/gitlab-webhook.js +282 -249
- package/dist/channels/gitlab/index.d.ts +6 -2
- package/dist/channels/gitlab/index.d.ts.map +1 -1
- package/dist/channels/gitlab/index.js +6 -2
- package/dist/channels/gitlab/replay.js +50 -27
- package/dist/channels/gitlab/state.js +14 -6
- package/dist/channels/gitlab/types.d.ts +13 -2
- package/dist/channels/gitlab/types.d.ts.map +1 -1
- package/dist/channels/origin/api.js +100 -116
- package/dist/channels/origin/binding.js +15 -16
- package/dist/channels/origin/checks.js +30 -28
- package/dist/channels/origin/defaults.js +50 -65
- package/dist/channels/origin/origin-channel.js +266 -272
- package/dist/channels/origin/origin-webhook.js +70 -88
- package/dist/channels/origin/reactions.js +9 -21
- package/dist/channels/origin/state.js +13 -5
- package/dist/channels/slack/agentic-delivery.js +426 -478
- package/dist/channels/slack/agentic-posted.js +9 -10
- package/dist/channels/slack/agentic-signals.js +2 -3
- package/dist/channels/slack/api.js +417 -427
- package/dist/channels/slack/approvals.js +1 -1
- package/dist/channels/slack/assistant.js +37 -47
- package/dist/channels/slack/attachments.js +188 -206
- package/dist/channels/slack/auth.js +8 -6
- package/dist/channels/slack/bot-mentions.js +31 -45
- package/dist/channels/slack/channel-watch.js +42 -48
- package/dist/channels/slack/cli-project.js +112 -137
- package/dist/channels/slack/code-fences.js +3 -5
- package/dist/channels/slack/constants.js +2 -2
- package/dist/channels/slack/credentials.js +23 -38
- package/dist/channels/slack/defaults.js +292 -331
- package/dist/channels/slack/dispatch.d.ts.map +1 -1
- package/dist/channels/slack/dispatch.js +533 -460
- package/dist/channels/slack/doctor.js +200 -214
- package/dist/channels/slack/eval-directive.js +79 -96
- package/dist/channels/slack/event-id-dedupe.js +1 -1
- package/dist/channels/slack/external-policy.js +26 -39
- package/dist/channels/slack/footer.js +28 -41
- package/dist/channels/slack/inbound.d.ts +1 -0
- package/dist/channels/slack/inbound.d.ts.map +1 -1
- package/dist/channels/slack/inbound.js +50 -31
- package/dist/channels/slack/init.d.ts +1 -5
- package/dist/channels/slack/init.d.ts.map +1 -1
- package/dist/channels/slack/init.js +42 -59
- package/dist/channels/slack/interactive.d.ts +9 -3
- package/dist/channels/slack/interactive.d.ts.map +1 -1
- package/dist/channels/slack/interactive.js +160 -162
- package/dist/channels/slack/links.js +1 -2
- package/dist/channels/slack/live-delivery.js +172 -190
- package/dist/channels/slack/manifest.d.ts.map +1 -1
- package/dist/channels/slack/manifest.js +44 -23
- package/dist/channels/slack/message-body.js +2 -2
- package/dist/channels/slack/nudge-carrier.js +30 -42
- package/dist/channels/slack/nudge-store.js +164 -191
- package/dist/channels/slack/paint-start.js +66 -81
- package/dist/channels/slack/placeholder.js +123 -152
- package/dist/channels/slack/pr-ref.js +1 -1
- package/dist/channels/slack/progress-delivery.js +65 -78
- package/dist/channels/slack/reasoning-card.js +36 -49
- package/dist/channels/slack/recording-sink.js +12 -24
- package/dist/channels/slack/reply-options.js +7 -12
- package/dist/channels/slack/self-identity.js +27 -35
- package/dist/channels/slack/sender-name.d.ts +12 -3
- package/dist/channels/slack/sender-name.d.ts.map +1 -1
- package/dist/channels/slack/sender-name.js +57 -61
- package/dist/channels/slack/setup.js +2 -4
- package/dist/channels/slack/slack-channel.d.ts +6 -4
- package/dist/channels/slack/slack-channel.d.ts.map +1 -1
- package/dist/channels/slack/slack-channel.js +441 -308
- package/dist/channels/slack/socket-mode.js +38 -52
- package/dist/channels/slack/thread-context.js +143 -160
- package/dist/channels/slack/tool-approval-events.js +149 -166
- package/dist/channels/slack/tool-cards.js +6 -11
- package/dist/channels/slack/tool-chip.js +1 -2
- package/dist/channels/slack/types.d.ts +15 -17
- package/dist/channels/slack/types.d.ts.map +1 -1
- package/dist/channels/slack/upload.js +84 -97
- package/dist/channels/slack/user-info.js +27 -41
- package/dist/channels.js +9 -20
- package/dist/dashboard-session-url.js +3 -4
- package/dist/docs/404.html +2 -2
- package/dist/docs/assets/{app.oyjtOr3W.js → app.DXI7bwox.js} +4 -4
- package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.js → building-with-agents.md.Df87rAe1.js} +1 -1
- package/dist/docs/assets/chunks/@localSearchIndexroot.CtLtpWcx.js +1 -0
- package/dist/docs/assets/chunks/{VPLocalSearchBox.D0P6J_UJ.js → VPLocalSearchBox.BrbO5mEe.js} +1 -1
- package/dist/docs/assets/chunks/{arc.B0LY1J1h.js → arc.BOG1yms8.js} +1 -1
- package/dist/docs/assets/chunks/{architectureDiagram-Q4EWVU46.dPduLUxY.js → architectureDiagram-Q4EWVU46.C0hsMZnZ.js} +1 -1
- package/dist/docs/assets/chunks/{baseUniq.B_Ohm21h.js → baseUniq.H044KjKs.js} +1 -1
- package/dist/docs/assets/chunks/{blockDiagram-DXYQGD6D.B4zcanaJ.js → blockDiagram-DXYQGD6D.BsRW6GoB.js} +1 -1
- package/dist/docs/assets/chunks/{c4Diagram-AHTNJAMY.D9Iw21nx.js → c4Diagram-AHTNJAMY.B9HV5PFR.js} +1 -1
- package/dist/docs/assets/chunks/channel.CBwrU9rP.js +1 -0
- package/dist/docs/assets/chunks/{chunk-4BX2VUAB.DDVwRShI.js → chunk-4BX2VUAB.CPoT_ajl.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-4TB4RGXK.DsYcdn1i.js → chunk-4TB4RGXK.DZBwWuCL.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-55IACEB6.BzzQvcYp.js → chunk-55IACEB6.CZ3yTiyq.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-EDXVE4YY.BMiXZ7FX.js → chunk-EDXVE4YY.6DfvHSd8.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-FMBD7UC4.D_mBcLoc.js → chunk-FMBD7UC4.CpBj8HfK.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-OYMX7WX6.CMVjWVMx.js → chunk-OYMX7WX6.BdKo8YqS.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-QZHKN3VN.BG-FrPv9.js → chunk-QZHKN3VN.BnXNyxJx.js} +1 -1
- package/dist/docs/assets/chunks/{chunk-YZCP3GAM.CkFE1ap3.js → chunk-YZCP3GAM.Cg1OcF8G.js} +1 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CbC_mrvB.js +1 -0
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CbC_mrvB.js +1 -0
- package/dist/docs/assets/chunks/clone.BTvFyY1a.js +1 -0
- package/dist/docs/assets/chunks/{cose-bilkent-S5V4N54A.BVNnCTvY.js → cose-bilkent-S5V4N54A.1SP8al9c.js} +1 -1
- package/dist/docs/assets/chunks/{dagre-KV5264BT.CDN5PR9l.js → dagre-KV5264BT.DS1L6hJt.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-5BDNPKRD.DQRUlT-i.js → diagram-5BDNPKRD.ChsausbG.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-G4DWMVQ6.CoeblYQT.js → diagram-G4DWMVQ6.3XsptNWj.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-MMDJMWI5.DW3ymjl0.js → diagram-MMDJMWI5.DPA9Dk_P.js} +1 -1
- package/dist/docs/assets/chunks/{diagram-TYMM5635.BP0uN4Jw.js → diagram-TYMM5635.BVswXWrB.js} +1 -1
- package/dist/docs/assets/chunks/{erDiagram-SMLLAGMA.DVFUWEn4.js → erDiagram-SMLLAGMA.BSak5OSP.js} +1 -1
- package/dist/docs/assets/chunks/{flowDiagram-DWJPFMVM.HU-eHspv.js → flowDiagram-DWJPFMVM.CQgN4TTz.js} +1 -1
- package/dist/docs/assets/chunks/{ganttDiagram-T4ZO3ILL.DHNhXijY.js → ganttDiagram-T4ZO3ILL.GrT0kA4a.js} +1 -1
- package/dist/docs/assets/chunks/{gitGraphDiagram-UUTBAWPF.DkISXcO3.js → gitGraphDiagram-UUTBAWPF.CdS7Ucll.js} +1 -1
- package/dist/docs/assets/chunks/{graph.CCV0fuRR.js → graph.BVqKRmRo.js} +1 -1
- package/dist/docs/assets/chunks/{infoDiagram-42DDH7IO.bgILzOoc.js → infoDiagram-42DDH7IO.C3C9FRto.js} +1 -1
- package/dist/docs/assets/chunks/{ishikawaDiagram-UXIWVN3A.CuryXC0F.js → ishikawaDiagram-UXIWVN3A.2FuAh_Zj.js} +1 -1
- package/dist/docs/assets/chunks/{journeyDiagram-VCZTEJTY.BL1Pr-wu.js → journeyDiagram-VCZTEJTY.CaHMfK4b.js} +1 -1
- package/dist/docs/assets/chunks/{kanban-definition-6JOO6SKY.BbGjvk4l.js → kanban-definition-6JOO6SKY.CjhIUwcA.js} +1 -1
- package/dist/docs/assets/chunks/{layout.C4PfdldS.js → layout.CGU3gfSf.js} +1 -1
- package/dist/docs/assets/chunks/{linear.C3xD1T6X.js → linear.DaihpW_n.js} +1 -1
- package/dist/docs/assets/chunks/{min.CzgRAQ9c.js → min.BS-j8kHQ.js} +1 -1
- package/dist/docs/assets/chunks/{mindmap-definition-QFDTVHPH.CA9rSWum.js → mindmap-definition-QFDTVHPH.BVJ1Bbnk.js} +1 -1
- package/dist/docs/assets/chunks/{pieDiagram-DEJITSTG.B8MprgJu.js → pieDiagram-DEJITSTG.Cz1WIv9r.js} +1 -1
- package/dist/docs/assets/chunks/{quadrantDiagram-34T5L4WZ.DndDwbKT.js → quadrantDiagram-34T5L4WZ.DKLFxcjy.js} +1 -1
- package/dist/docs/assets/chunks/{requirementDiagram-MS252O5E.Zhfgwlnn.js → requirementDiagram-MS252O5E.BHegiK7x.js} +1 -1
- package/dist/docs/assets/chunks/{sankeyDiagram-XADWPNL6.B6RRm6N5.js → sankeyDiagram-XADWPNL6.DYkY6yPc.js} +1 -1
- package/dist/docs/assets/chunks/{sequenceDiagram-FGHM5R23.Bfmz-1PN.js → sequenceDiagram-FGHM5R23.DYQ1QUrI.js} +1 -1
- package/dist/docs/assets/chunks/{stateDiagram-FHFEXIEX.gbrdNqgj.js → stateDiagram-FHFEXIEX.Iru8BsFo.js} +1 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.BYXl4LW6.js +1 -0
- package/dist/docs/assets/chunks/{theme.gpWjytMh.js → theme.DaplWQhQ.js} +2 -2
- package/dist/docs/assets/chunks/{timeline-definition-GMOUNBTQ.Bl1l7M1f.js → timeline-definition-GMOUNBTQ.BwFA8hiX.js} +1 -1
- package/dist/docs/assets/chunks/{vennDiagram-DHZGUBPP.Dfle4U0d.js → vennDiagram-DHZGUBPP.CZ60W1C_.js} +1 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.iXazD3Z7.js +162 -0
- package/dist/docs/assets/chunks/{wardleyDiagram-NUSXRM2D.CM_4lmvZ.js → wardleyDiagram-NUSXRM2D.B69D2r8-.js} +1 -1
- package/dist/docs/assets/chunks/{xychartDiagram-5P7HB3ND.CHT5X28R.js → xychartDiagram-5P7HB3ND.CLPZEIU9.js} +1 -1
- package/dist/docs/assets/{deployment.md.BdqTiGdc.js → deployment.md.BYuEcDBv.js} +2 -2
- package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.js → guides_bitbucket.md.CKUayYtD.js} +3 -3
- package/dist/docs/assets/{guides_bitbucket.md.BB6fqD-M.lean.js → guides_bitbucket.md.CKUayYtD.lean.js} +1 -1
- package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.js → guides_github.md.TuNiZAOQ.js} +4 -4
- package/dist/docs/assets/{guides_github.md.Cr1Xlf-m.lean.js → guides_github.md.TuNiZAOQ.lean.js} +1 -1
- package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.js → guides_gitlab.md.CtNI4fSH.js} +4 -4
- package/dist/docs/assets/{guides_gitlab.md.CMpmFi4M.lean.js → guides_gitlab.md.CtNI4fSH.lean.js} +1 -1
- package/dist/docs/assets/guides_migrate.md.sCAvvlC6.js +7 -0
- package/dist/docs/assets/guides_migrate.md.sCAvvlC6.lean.js +1 -0
- package/dist/docs/assets/{reference_cli.md.GwugN3n-.js → reference_cli.md.dYCAL2lB.js} +4 -3
- package/dist/docs/assets/reference_cli.md.dYCAL2lB.lean.js +1 -0
- package/dist/docs/assets/{reference_skills.md.ClkMoQsV.js → reference_skills.md.C0guGcH0.js} +3 -3
- package/dist/docs/assets/troubleshooting.md.x-GBa7wN.js +1 -0
- package/dist/docs/assets/{troubleshooting.md.Bscj6ODe.lean.js → troubleshooting.md.x-GBa7wN.lean.js} +1 -1
- package/dist/docs/building-with-agents.html +37 -37
- package/dist/docs/building-with-agents.md +2 -0
- package/dist/docs/deployment.html +38 -38
- package/dist/docs/deployment.md +7 -0
- package/dist/docs/evals.html +36 -36
- package/dist/docs/guides/agent-to-agent.html +35 -35
- package/dist/docs/guides/bitbucket.html +38 -38
- package/dist/docs/guides/bitbucket.md +9 -1
- package/dist/docs/guides/cloud-agents.html +35 -35
- package/dist/docs/guides/convert-automation.html +35 -35
- package/dist/docs/guides/github.html +39 -39
- package/dist/docs/guides/github.md +20 -4
- package/dist/docs/guides/gitlab.html +38 -38
- package/dist/docs/guides/gitlab.md +9 -1
- package/dist/docs/guides/grokbot-agents.html +35 -35
- package/dist/docs/guides/hooks.html +35 -35
- package/dist/docs/guides/improve.html +35 -35
- package/dist/docs/guides/jev.html +35 -35
- package/dist/docs/guides/mcp-oauth.html +35 -35
- package/dist/docs/guides/migrate.html +66 -0
- package/dist/docs/guides/migrate.md +122 -0
- package/dist/docs/guides/opentelemetry.html +35 -35
- package/dist/docs/guides/slack.html +35 -35
- package/dist/docs/guides/webhooks.html +35 -35
- package/dist/docs/hashmap.json +1 -1
- package/dist/docs/hillclimbing.html +35 -35
- package/dist/docs/index.html +35 -35
- package/dist/docs/llms-full.txt +214 -6
- package/dist/docs/llms.txt +1 -0
- package/dist/docs/quickstart.html +35 -35
- package/dist/docs/reference/agent-config.html +35 -35
- package/dist/docs/reference/artifacts.html +35 -35
- package/dist/docs/reference/channels.html +35 -35
- package/dist/docs/reference/cli.html +39 -38
- package/dist/docs/reference/cli.md +39 -0
- package/dist/docs/reference/connections.html +35 -35
- package/dist/docs/reference/evals.html +35 -35
- package/dist/docs/reference/extensions.html +35 -35
- package/dist/docs/reference/hooks.html +35 -35
- package/dist/docs/reference/http-api.html +35 -35
- package/dist/docs/reference/instructions.html +35 -35
- package/dist/docs/reference/playground.html +35 -35
- package/dist/docs/reference/project-layout.html +35 -35
- package/dist/docs/reference/prompt.html +35 -35
- package/dist/docs/reference/schedules.html +35 -35
- package/dist/docs/reference/sessions.html +35 -35
- package/dist/docs/reference/skills.html +38 -38
- package/dist/docs/reference/subagents.html +35 -35
- package/dist/docs/reference/tools.html +35 -35
- package/dist/docs/templates/agentic-owners.html +35 -35
- package/dist/docs/templates/grokbot-agents.html +35 -35
- package/dist/docs/templates/security-reviewer.html +35 -35
- package/dist/docs/templates/thermo-quality-review.html +35 -35
- package/dist/docs/templates/thermo-review.html +35 -35
- package/dist/docs/templates/triage.html +35 -35
- package/dist/docs/troubleshooting.html +36 -36
- package/dist/docs/troubleshooting.md +1 -0
- package/dist/evals/assertions.js +20 -34
- package/dist/evals/expect.js +3 -6
- package/dist/evals/judge.js +5 -8
- package/dist/evals/loaders.js +45 -62
- package/dist/evals/matchers.js +2 -3
- package/dist/evals/reporters.js +43 -67
- package/dist/evals/results.js +1 -1
- package/dist/evals/run-facts.js +5 -6
- package/dist/evals.js +27 -15
- package/dist/extensions/cursor-cloud-agents/extension.js +4 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts +0 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/lib/backend.js +101 -130
- package/dist/extensions/cursor-cloud-agents/lib/fleet.js +22 -38
- package/dist/extensions/cursor-cloud-agents/lib/repos.js +8 -10
- package/dist/extensions/cursor-cloud-agents/lib/transcript.js +2 -3
- package/dist/extensions/cursor-cloud-agents/lib/watch.js +52 -66
- package/dist/extensions/cursor-cloud-agents/reminders/cloud-agent-stop-watch.js +29 -40
- package/dist/extensions/cursor-cloud-agents/tools/cancel.js +6 -17
- package/dist/extensions/cursor-cloud-agents/tools/dump.js +25 -36
- package/dist/extensions/cursor-cloud-agents/tools/get.js +3 -14
- package/dist/extensions/cursor-cloud-agents/tools/launch.js +13 -21
- package/dist/extensions/cursor-cloud-agents/tools/list.d.ts.map +1 -1
- package/dist/extensions/cursor-cloud-agents/tools/list.js +9 -20
- package/dist/extensions/cursor-cloud-agents/tools/reply.js +5 -16
- package/dist/extensions/cursor-grokbot-agents/extension.js +4 -1
- package/dist/extensions/cursor-grokbot-agents/lib/agents.js +3 -3
- package/dist/extensions/cursor-grokbot-agents/lib/backend.js +53 -73
- package/dist/extensions/cursor-grokbot-agents/lib/contacts.js +10 -23
- package/dist/extensions/cursor-grokbot-agents/lib/conversation.js +112 -132
- package/dist/extensions/cursor-grokbot-agents/lib/lock.js +1 -2
- package/dist/extensions/cursor-grokbot-agents/tools/ask.js +5 -16
- package/dist/extensions/cursor-grokbot-agents/tools/check.js +4 -15
- package/dist/extensions/cursor-grokbot-agents/tools/interrupt.js +2 -13
- package/dist/extensions/cursor-grokbot-agents/tools/list.js +11 -23
- package/dist/extensions/jev/extension.js +3 -3
- package/dist/extensions/jev/lib/evaluate.js +43 -60
- package/dist/extensions/jev/tools/evaluate.js +6 -17
- package/dist/extensions/slack-communication/tools/post-file.js +1 -1
- package/dist/extensions.js +3 -5
- package/dist/files-backends/cursor-hosted.js +504 -523
- package/dist/files-backends/local-fs.js +72 -134
- package/dist/files.js +3 -3
- package/dist/filesystem.js +562 -861
- package/dist/index.js +16 -35
- package/dist/internal/advertise-tools.js +74 -86
- package/dist/internal/artifacts-store.js +298 -361
- package/dist/internal/as-of.js +2 -4
- package/dist/internal/authored-alias-hooks.js +6 -4
- package/dist/internal/authored-loaders.js +37 -52
- package/dist/internal/bounded-int.js +1 -2
- package/dist/internal/bounded.js +13 -24
- package/dist/internal/brand.js +1 -1
- package/dist/internal/browser-origin-guard.js +4 -4
- package/dist/internal/builtin-tools/artifacts.js +15 -27
- package/dist/internal/builtin-tools/index.js +2 -3
- package/dist/internal/builtin-tools/reminders.js +33 -52
- package/dist/internal/channel-architecture.d.ts +21 -0
- package/dist/internal/channel-architecture.d.ts.map +1 -0
- package/dist/internal/channel-architecture.js +41 -0
- package/dist/internal/channel-dispatch.js +3 -4
- package/dist/internal/channel-route-dispatch.js +40 -51
- package/dist/internal/channel-state.js +1 -1
- package/dist/internal/chat-client.js +319 -340
- package/dist/internal/cli-ax.js +1262 -1294
- package/dist/internal/cli-bitbucket.js +244 -272
- package/dist/internal/cli-convert-automation.js +137 -151
- package/dist/internal/cli-cursor.js +126 -147
- package/dist/internal/cli-deploy.d.ts.map +1 -1
- package/dist/internal/cli-deploy.js +1457 -1507
- package/dist/internal/cli-docs.js +130 -147
- package/dist/internal/cli-github.js +437 -476
- package/dist/internal/cli-gitlab.js +259 -288
- package/dist/internal/cli-images.js +266 -334
- package/dist/internal/cli-manifest.js +25 -37
- package/dist/internal/cli-mcp-oauth.js +228 -247
- package/dist/internal/cli-mcp.js +358 -383
- package/dist/internal/cli-migrate.d.ts +18 -0
- package/dist/internal/cli-migrate.d.ts.map +1 -0
- package/dist/internal/cli-migrate.js +136 -0
- package/dist/internal/cli-skills.js +35 -47
- package/dist/internal/cli-slack-manual.d.ts +0 -1
- package/dist/internal/cli-slack-manual.d.ts.map +1 -1
- package/dist/internal/cli-slack-manual.js +175 -204
- package/dist/internal/cli-slack.d.ts +1 -1
- package/dist/internal/cli-slack.d.ts.map +1 -1
- package/dist/internal/cli-slack.js +416 -456
- package/dist/internal/cloud-merge.js +7 -3
- package/dist/internal/cloud-turn-cost.js +8 -1
- package/dist/internal/connection-env.js +5 -6
- package/dist/internal/continuation-channel.js +10 -7
- package/dist/internal/continuation-identity.js +85 -67
- package/dist/internal/conversation-mirror.js +112 -131
- package/dist/internal/convert-automation/convert-workflow.js +21 -31
- package/dist/internal/cron.js +3 -3
- package/dist/internal/cursor/account-mcp.js +147 -146
- package/dist/internal/cursor/backend-client.js +290 -320
- package/dist/internal/cursor/bound-secret-file.js +3 -3
- package/dist/internal/cursor/credentials.d.ts +1 -0
- package/dist/internal/cursor/credentials.d.ts.map +1 -1
- package/dist/internal/cursor/credentials.js +130 -142
- package/dist/internal/cursor/cursor-api-transport.js +4 -8
- package/dist/internal/cursor/github-credentials.js +91 -108
- package/dist/internal/cursor/hosted-bound-secrets.js +3 -4
- package/dist/internal/cursor/hosted-deployment-secrets.js +1 -1
- package/dist/internal/cursor/hosted-store-secrets.js +5 -9
- package/dist/internal/cursor/session-token.js +36 -48
- package/dist/internal/cursor/store-api-client.js +77 -92
- package/dist/internal/cursor-account-mcp-auth.js +132 -149
- package/dist/internal/cursor-agent-template.js +1 -1
- package/dist/internal/cursor-deployment-relay.js +33 -54
- package/dist/internal/cursor-event-relay.js +65 -59
- package/dist/internal/cursor-relay-core.js +258 -286
- package/dist/internal/deferred-channel-session.js +3 -12
- package/dist/internal/deploy-client.js +410 -475
- package/dist/internal/deploy-manifest.d.ts +17 -0
- package/dist/internal/deploy-manifest.d.ts.map +1 -1
- package/dist/internal/deploy-manifest.js +71 -21
- package/dist/internal/deploy-source.js +31 -43
- package/dist/internal/discovery/agent-config.js +45 -59
- package/dist/internal/discovery/agent.js +276 -280
- package/dist/internal/discovery/channels.js +67 -80
- package/dist/internal/discovery/connections.js +286 -296
- package/dist/internal/discovery/context.js +2 -13
- package/dist/internal/discovery/cursor-plugin.js +223 -259
- package/dist/internal/discovery/extension-overlay.js +104 -131
- package/dist/internal/discovery/extensions.js +276 -281
- package/dist/internal/discovery/fs.js +56 -79
- package/dist/internal/discovery/hooks.js +39 -50
- package/dist/internal/discovery/info.js +17 -19
- package/dist/internal/discovery/instructions.js +58 -71
- package/dist/internal/discovery/modules.js +45 -58
- package/dist/internal/discovery/project.d.ts.map +1 -1
- package/dist/internal/discovery/project.js +192 -215
- package/dist/internal/discovery/reminders.js +41 -52
- package/dist/internal/discovery/runtime.js +1 -1
- package/dist/internal/discovery/schedules.js +71 -82
- package/dist/internal/discovery/seed-files.js +21 -32
- package/dist/internal/discovery/services.js +74 -96
- package/dist/internal/discovery/skills.js +77 -94
- package/dist/internal/discovery/subagent.js +79 -95
- package/dist/internal/discovery/tools.js +12 -23
- package/dist/internal/distribution.js +2 -2
- package/dist/internal/docs-site.js +30 -45
- package/dist/internal/duration.js +1 -1
- package/dist/internal/env-file.js +48 -64
- package/dist/internal/eval-judge-model.js +17 -28
- package/dist/internal/eval-run-store.js +265 -254
- package/dist/internal/eval-runner.d.ts +8 -0
- package/dist/internal/eval-runner.d.ts.map +1 -1
- package/dist/internal/eval-runner.js +406 -408
- package/dist/internal/eval-transport.d.ts +24 -0
- package/dist/internal/eval-transport.d.ts.map +1 -0
- package/dist/internal/eval-transport.js +22 -0
- package/dist/internal/evals-client.js +242 -246
- package/dist/internal/event-log.js +72 -120
- package/dist/internal/event-mapper.js +30 -31
- package/dist/internal/factory-resource-channel.js +16 -30
- package/dist/internal/filesystem/errors.js +6 -6
- package/dist/internal/filesystem/format.js +10 -13
- package/dist/internal/filesystem/merge.js +52 -94
- package/dist/internal/filesystem/nearest.js +15 -27
- package/dist/internal/filesystem/scratch.js +65 -85
- package/dist/internal/filesystem/tools.js +221 -241
- package/dist/internal/filesystem/walk.js +76 -143
- package/dist/internal/framework-file-storage.js +118 -139
- package/dist/internal/framework-storage-selection.js +21 -13
- package/dist/internal/frontmatter.js +4 -6
- package/dist/internal/github-fanout.js +50 -64
- package/dist/internal/guest-network.js +96 -109
- package/dist/internal/handleAgentServeTrigger.js +121 -126
- package/dist/internal/host-files.js +73 -88
- package/dist/internal/host-kv.js +21 -36
- package/dist/internal/host-otel.js +22 -19
- package/dist/internal/host-platforms.js +49 -63
- package/dist/internal/hosted-catch-protocol.d.ts +1 -0
- package/dist/internal/hosted-catch-protocol.d.ts.map +1 -1
- package/dist/internal/hosted-catch-protocol.js +1 -0
- package/dist/internal/hosted-catch.d.ts +5 -3
- package/dist/internal/hosted-catch.d.ts.map +1 -1
- package/dist/internal/hosted-catch.js +84 -93
- package/dist/internal/hosted-delivery-protocol.js +32 -8
- package/dist/internal/hosted-delivery.d.ts +13 -1
- package/dist/internal/hosted-delivery.d.ts.map +1 -1
- package/dist/internal/hosted-delivery.js +614 -584
- package/dist/internal/hosted-eval-cases.d.ts +21 -0
- package/dist/internal/hosted-eval-cases.d.ts.map +1 -0
- package/dist/internal/hosted-eval-cases.js +162 -0
- package/dist/internal/hosted-execution-diag.js +38 -30
- package/dist/internal/hosted-execution-flush.js +75 -66
- package/dist/internal/hosted-execution-latency.js +16 -8
- package/dist/internal/hosted-managed-automation.js +2 -2
- package/dist/internal/hosting.js +2 -3
- package/dist/internal/http-channel-define.js +4 -1
- package/dist/internal/http-channel.js +101 -112
- package/dist/internal/http-control-plane-session.d.ts +18 -1
- package/dist/internal/http-control-plane-session.d.ts.map +1 -1
- package/dist/internal/http-control-plane-session.js +66 -32
- package/dist/internal/incoming-headers-to-fetch.js +1 -2
- package/dist/internal/init-interview.js +73 -93
- package/dist/internal/init-project.js +182 -214
- package/dist/internal/init-scaffold.js +10 -21
- package/dist/internal/inline-stdio-mcp.js +80 -86
- package/dist/internal/install-cursor-skills.d.ts.map +1 -1
- package/dist/internal/install-cursor-skills.js +238 -274
- package/dist/internal/legacy-command-guard.js +18 -31
- package/dist/internal/listen-port.js +34 -45
- package/dist/internal/local-control-plane.js +293 -307
- package/dist/internal/local-env.js +1 -1
- package/dist/internal/local-ingress.js +15 -9
- package/dist/internal/log-ring.js +1 -2
- package/dist/internal/logs-client.js +207 -227
- package/dist/internal/map-pool.js +24 -38
- package/dist/internal/mcp-endpoint.js +204 -180
- package/dist/internal/mcp-host.js +165 -168
- package/dist/internal/mcp-oauth-on-demand.js +170 -207
- package/dist/internal/mcp-oauth-persist.js +15 -29
- package/dist/internal/mcp-oauth.js +209 -266
- package/dist/internal/named-webhook-secret.d.ts +39 -0
- package/dist/internal/named-webhook-secret.d.ts.map +1 -0
- package/dist/internal/named-webhook-secret.js +47 -0
- package/dist/internal/open-browser.js +2 -3
- package/dist/internal/otel/collector.js +104 -68
- package/dist/internal/otel/config.js +24 -37
- package/dist/internal/otel/http.js +5 -7
- package/dist/internal/otel/mcp.js +3 -12
- package/dist/internal/otel/runtime.js +69 -83
- package/dist/internal/package-inline-stdio.js +57 -65
- package/dist/internal/peer-connections.js +9 -5
- package/dist/internal/platform-schedule-sync.js +39 -54
- package/dist/internal/platform-timers.js +176 -210
- package/dist/internal/playground/static.js +1 -2
- package/dist/internal/playground/toolchain.js +37 -53
- package/dist/internal/playground-proxy.js +230 -270
- package/dist/internal/process-memory-telemetry.js +33 -51
- package/dist/internal/prompt-context.js +3 -6
- package/dist/internal/reminder-control-plane-protocol.js +46 -13
- package/dist/internal/reminder-runner.js +770 -785
- package/dist/internal/reminder-schedule.js +1 -1
- package/dist/internal/reminder-store.js +57 -78
- package/dist/internal/request-error-status.js +1 -3
- package/dist/internal/request-headers.js +2 -2
- package/dist/internal/resolve-prod-target.js +119 -135
- package/dist/internal/resolved-connections.js +16 -6
- package/dist/internal/run-client.js +221 -229
- package/dist/internal/runtime-dispatch-runner.js +18 -43
- package/dist/internal/schedule-runner.js +49 -58
- package/dist/internal/scm/pr-url.js +7 -6
- package/dist/internal/sdk-runner.js +388 -363
- package/dist/internal/serve-restart.js +26 -39
- package/dist/internal/server.d.ts.map +1 -1
- package/dist/internal/server.js +1283 -1244
- package/dist/internal/session-cost.js +7 -9
- package/dist/internal/session-engine.d.ts +3 -1
- package/dist/internal/session-engine.d.ts.map +1 -1
- package/dist/internal/session-engine.js +2801 -2777
- package/dist/internal/session-links.js +12 -16
- package/dist/internal/session-run-log.js +134 -82
- package/dist/internal/session-store.js +133 -164
- package/dist/internal/sessions-client.js +97 -118
- package/dist/internal/skill-catalog.js +18 -23
- package/dist/internal/skills-sync.js +16 -30
- package/dist/internal/slack-provision-client.js +90 -116
- package/dist/internal/start-log-store.js +48 -67
- package/dist/internal/steering.js +1 -2
- package/dist/internal/storage-coordinator.js +160 -196
- package/dist/internal/store-mirror.js +16 -30
- package/dist/internal/stream-progress.js +6 -8
- package/dist/internal/terminal-style.js +3 -4
- package/dist/internal/testing/scm-continuation-fixtures.js +6 -2
- package/dist/internal/testing/slack-continuation-fixtures.d.ts +26 -0
- package/dist/internal/testing/slack-continuation-fixtures.d.ts.map +1 -0
- package/dist/internal/testing/slack-continuation-fixtures.js +136 -0
- package/dist/internal/tool-catalog.js +11 -5
- package/dist/internal/tool-result.js +1 -1
- package/dist/internal/trajectory.js +19 -22
- package/dist/internal/turn-cost.js +52 -62
- package/dist/internal/turn-governor.js +5 -8
- package/dist/internal/turn-lease-store.js +85 -105
- package/dist/internal/turn-outbox.js +28 -43
- package/dist/internal/update-check.js +231 -259
- package/dist/internal/v2-hosting.js +1 -2
- package/dist/internal/workspace-sync.js +25 -41
- package/dist/internal/workspace.js +111 -139
- package/dist/kv/memory-kv.js +27 -51
- package/dist/memory.js +106 -148
- package/dist/otel.js +5 -8
- package/dist/playground/assets/index-DXm_VXAQ.css +1 -0
- package/dist/playground/assets/{index-MijLHTbB.js → index-JekUQERK.js} +45 -45
- package/dist/playground/index.html +2 -2
- package/dist/prompt.js +2 -4
- package/dist/storage-backends/cursor-hosted-v2.js +53 -83
- package/dist/storage-backends/cursor-hosted.js +105 -145
- package/dist/storage-backends/file-kv.js +100 -128
- package/dist/storage-protocol.js +3 -5
- package/dist/storage.js +17 -26
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +20 -18
- package/docs/building-with-agents.md +2 -0
- package/docs/deployment.md +7 -0
- package/docs/guides/bitbucket.md +9 -1
- package/docs/guides/github.md +20 -4
- package/docs/guides/gitlab.md +9 -1
- package/docs/guides/migrate.md +127 -0
- package/docs/reference/cli.md +39 -0
- package/docs/troubleshooting.md +1 -0
- package/package.json +1 -1
- package/skills/debug/SKILL.md +1 -0
- package/skills/github/SKILL.md +23 -0
- package/skills/migrate-v2/SKILL.md +264 -0
- package/dist/docs/assets/chunks/@localSearchIndexroot.C25zYVuc.js +0 -1
- package/dist/docs/assets/chunks/channel.CRUyWDV-.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-6PBFFD2Q.CG_UObcQ.js +0 -1
- package/dist/docs/assets/chunks/classDiagram-v2-HSJHXN6E.CG_UObcQ.js +0 -1
- package/dist/docs/assets/chunks/clone.NYSZ9qZN.js +0 -1
- package/dist/docs/assets/chunks/stateDiagram-v2-QKLJ7IA2.DOOmulfQ.js +0 -1
- package/dist/docs/assets/chunks/wardley-RL74JXVD.BJrCW6xc.js +0 -162
- package/dist/docs/assets/reference_cli.md.GwugN3n-.lean.js +0 -1
- package/dist/docs/assets/troubleshooting.md.Bscj6ODe.js +0 -1
- package/dist/playground/assets/index-DPKLl4C_.css +0 -1
- /package/dist/docs/assets/{building-with-agents.md.BPjPFxFg.lean.js → building-with-agents.md.Df87rAe1.lean.js} +0 -0
- /package/dist/docs/assets/{deployment.md.BdqTiGdc.lean.js → deployment.md.BYuEcDBv.lean.js} +0 -0
- /package/dist/docs/assets/{reference_skills.md.ClkMoQsV.lean.js → reference_skills.md.C0guGcH0.lean.js} +0 -0
|
@@ -1,26 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Default inbound handlers and stream-event sinks for the Slack channel.
|
|
3
3
|
*/
|
|
4
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
5
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
6
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
7
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
8
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
9
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
10
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
11
|
-
});
|
|
12
|
-
};
|
|
13
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
14
|
-
var t = {};
|
|
15
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
16
|
-
t[p] = s[p];
|
|
17
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
18
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
19
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
20
|
-
t[p[i]] = s[p[i]];
|
|
21
|
-
}
|
|
22
|
-
return t;
|
|
23
|
-
};
|
|
24
4
|
import { markHostedFirstVisibleReply, noteHostedVisibleReplyError, } from "../../internal/hosted-execution-latency.js";
|
|
25
5
|
import { buildAgenticEvents } from "./agentic-delivery.js";
|
|
26
6
|
import { postMessage, setThreadStatus } from "./api.js";
|
|
@@ -40,16 +20,15 @@ import { rememberPendingToolCall, takeToolChipLine } from "./tool-chip.js";
|
|
|
40
20
|
const SLACK_TURN_FAILURE_FALLBACK = "I hit an error while handling your request. Please try again or rephrase.";
|
|
41
21
|
const SLACK_TURN_FAILURE_MAX_CHARS = 400;
|
|
42
22
|
export function resolveSlackRespondTo(policy) {
|
|
43
|
-
return
|
|
23
|
+
return policy?.respondTo === "author" ? "author" : "thread";
|
|
44
24
|
}
|
|
45
25
|
/** Defaults to true when omitted. */
|
|
46
26
|
export function resolveSlackBlockExternals(policy) {
|
|
47
|
-
return
|
|
27
|
+
return policy?.blockExternals !== false;
|
|
48
28
|
}
|
|
49
29
|
/** Scrubbed turn.failed body for Slack (secrets / paths / URLs stripped). */
|
|
50
30
|
export function formatSlackTurnFailureMessage(raw) {
|
|
51
|
-
|
|
52
|
-
const scrubbed = scrubSlackErrorDetail((_a = raw === null || raw === void 0 ? void 0 : raw.trim()) !== null && _a !== void 0 ? _a : "");
|
|
31
|
+
const scrubbed = scrubSlackErrorDetail(raw?.trim() ?? "");
|
|
53
32
|
if (scrubbed === "") {
|
|
54
33
|
return SLACK_TURN_FAILURE_FALLBACK;
|
|
55
34
|
}
|
|
@@ -88,11 +67,11 @@ function resolveLoadingMessages(loadingMessages) {
|
|
|
88
67
|
export function createDefaultOnInbound(loadingMessages, policy) {
|
|
89
68
|
const rotating = resolveLoadingMessages(loadingMessages);
|
|
90
69
|
const respondTo = resolveSlackRespondTo(policy);
|
|
91
|
-
return (ctx, message) =>
|
|
92
|
-
|
|
70
|
+
return async (ctx, message) => {
|
|
71
|
+
await ctx.thread.startTyping("Thinking…", rotating);
|
|
93
72
|
const auth = defaultSlackAuth(message, ctx, { respondTo });
|
|
94
73
|
return auth === null ? null : { auth };
|
|
95
|
-
}
|
|
74
|
+
};
|
|
96
75
|
}
|
|
97
76
|
/**
|
|
98
77
|
* Default watched-channel-post handler (optional custom loading rotation).
|
|
@@ -102,14 +81,14 @@ export function createDefaultOnInbound(loadingMessages, policy) {
|
|
|
102
81
|
export function createDefaultOnChannelPost(loadingMessages, policy) {
|
|
103
82
|
const rotating = resolveLoadingMessages(loadingMessages);
|
|
104
83
|
const respondTo = resolveSlackRespondTo(policy);
|
|
105
|
-
return (ctx, message) =>
|
|
106
|
-
|
|
84
|
+
return async (ctx, message) => {
|
|
85
|
+
await ctx.thread.startTyping("Thinking…", rotating);
|
|
107
86
|
const auth = defaultSlackAuth(message, ctx, {
|
|
108
87
|
engagement: "channel_post",
|
|
109
88
|
respondTo,
|
|
110
89
|
});
|
|
111
90
|
return auth === null ? null : { auth };
|
|
112
|
-
}
|
|
91
|
+
};
|
|
113
92
|
}
|
|
114
93
|
export const defaultOnAppMention = createDefaultOnInbound();
|
|
115
94
|
export const defaultOnDirectMessage = createDefaultOnInbound();
|
|
@@ -124,7 +103,6 @@ export const defaultOnChannelPost = createDefaultOnChannelPost();
|
|
|
124
103
|
* `buildToolApprovalEvents` or set `toolApprovals: true` on `slackChannel`.
|
|
125
104
|
*/
|
|
126
105
|
export function buildDefaultEvents(options = {}) {
|
|
127
|
-
var _a, _b;
|
|
128
106
|
const credentials = options.credentials;
|
|
129
107
|
const reply = resolveSlackReply({
|
|
130
108
|
reply: options.reply,
|
|
@@ -144,23 +122,22 @@ export function buildDefaultEvents(options = {}) {
|
|
|
144
122
|
});
|
|
145
123
|
}
|
|
146
124
|
const streaming = reply.mode === "stream";
|
|
147
|
-
const suggestedPrompts =
|
|
125
|
+
const suggestedPrompts = options.suggestedPrompts ?? [];
|
|
148
126
|
const suggestedPromptsTitle = options.suggestedPromptsTitle;
|
|
149
127
|
const loadingMessages = reply.status.idle;
|
|
150
|
-
const botToken = credentials
|
|
151
|
-
const getLog =
|
|
128
|
+
const botToken = credentials?.botToken;
|
|
129
|
+
const getLog = options.getLog ?? (() => defaultSlackLog);
|
|
152
130
|
const strategy = createStreamDeliveryStrategy({ botToken, getLog });
|
|
153
131
|
const progress = createProgressDelivery({ botToken, getLog });
|
|
154
132
|
const streamLive = (state) => streaming && !state.streamingUnavailable;
|
|
155
133
|
const streamTarget = (channel) => {
|
|
156
|
-
|
|
157
|
-
const channelId = (_a = channel.state.streamChannelId) !== null && _a !== void 0 ? _a : channel.state.channelId;
|
|
134
|
+
const channelId = channel.state.streamChannelId ?? channel.state.channelId;
|
|
158
135
|
if (channelId === null || channelId === "" || channel.state.threadTs === null) {
|
|
159
136
|
return null;
|
|
160
137
|
}
|
|
161
138
|
return channelId;
|
|
162
139
|
};
|
|
163
|
-
const sendCards = (args) =>
|
|
140
|
+
const sendCards = async (args) => {
|
|
164
141
|
if (!streamLive(args.channel.state)) {
|
|
165
142
|
return false;
|
|
166
143
|
}
|
|
@@ -168,24 +145,21 @@ export function buildDefaultEvents(options = {}) {
|
|
|
168
145
|
if (channelId === null) {
|
|
169
146
|
return false;
|
|
170
147
|
}
|
|
171
|
-
return strategy.appendChunks(
|
|
172
|
-
}
|
|
148
|
+
return strategy.appendChunks({ ...args, channelId });
|
|
149
|
+
};
|
|
173
150
|
const reasoning = reply.reasoningCard === false
|
|
174
151
|
? null
|
|
175
|
-
: createReasoningCard(reply.reasoningCard, (
|
|
176
|
-
var { chunk } = _a, rest = __rest(_a, ["chunk"]);
|
|
177
|
-
return sendCards(Object.assign(Object.assign({}, rest), { chunks: [chunk] }));
|
|
178
|
-
});
|
|
152
|
+
: createReasoningCard(reply.reasoningCard, ({ chunk, ...rest }) => sendCards({ ...rest, chunks: [chunk] }));
|
|
179
153
|
const toolCards = reply.toolCards === false ? null : createToolCards(reply.toolCards, reply.toolLabel);
|
|
180
|
-
const completeReasoning = (channel, sessionId) =>
|
|
181
|
-
if (reasoning
|
|
182
|
-
|
|
154
|
+
const completeReasoning = async (channel, sessionId) => {
|
|
155
|
+
if (reasoning?.inProgress(channel)) {
|
|
156
|
+
await reasoning.flush({ channel, sessionId, status: "complete" });
|
|
183
157
|
}
|
|
184
|
-
}
|
|
158
|
+
};
|
|
185
159
|
/** Subagent events carry `parentCallId`; cards and the reply are the parent's. */
|
|
186
160
|
const nested = (event) => event.data.parentCallId !== undefined;
|
|
187
|
-
const clearWorkingStatus = (channelId, threadTs) =>
|
|
188
|
-
const result =
|
|
161
|
+
const clearWorkingStatus = async (channelId, threadTs) => {
|
|
162
|
+
const result = await setThreadStatus({
|
|
189
163
|
botToken,
|
|
190
164
|
channelId,
|
|
191
165
|
threadTs,
|
|
@@ -198,14 +172,14 @@ export function buildDefaultEvents(options = {}) {
|
|
|
198
172
|
thread_ts: threadTs,
|
|
199
173
|
});
|
|
200
174
|
}
|
|
201
|
-
}
|
|
202
|
-
const finishProgress = (args) =>
|
|
175
|
+
};
|
|
176
|
+
const finishProgress = async (args) => {
|
|
203
177
|
const log = getLog();
|
|
204
178
|
const state = args.channel.state;
|
|
205
179
|
if (state.channelId === null || state.threadTs === null || args.text === "") {
|
|
206
180
|
return false;
|
|
207
181
|
}
|
|
208
|
-
if (
|
|
182
|
+
if (await progress.replace({ channel: args.channel, text: args.text })) {
|
|
209
183
|
log.info("reply delivered via progress update", {
|
|
210
184
|
channel: state.channelId,
|
|
211
185
|
thread_ts: state.threadTs,
|
|
@@ -218,9 +192,9 @@ export function buildDefaultEvents(options = {}) {
|
|
|
218
192
|
});
|
|
219
193
|
return true;
|
|
220
194
|
}
|
|
221
|
-
|
|
195
|
+
await progress.clear({ channel: args.channel });
|
|
222
196
|
try {
|
|
223
|
-
const posted =
|
|
197
|
+
const posted = await postMessage({
|
|
224
198
|
botToken,
|
|
225
199
|
channel: state.channelId,
|
|
226
200
|
text: args.text,
|
|
@@ -250,15 +224,14 @@ export function buildDefaultEvents(options = {}) {
|
|
|
250
224
|
noteHostedVisibleReplyError({ deliverySurface: "slack" });
|
|
251
225
|
return false;
|
|
252
226
|
}
|
|
253
|
-
}
|
|
227
|
+
};
|
|
254
228
|
/**
|
|
255
229
|
* Deliver assistant text to the bound Slack thread. Used by a stop-reason
|
|
256
230
|
* `message.completed` and by `turn.completed` when the last assistant
|
|
257
231
|
* block was `finishReason: "tool_call"` (answer then `tag_artifact`,
|
|
258
232
|
* etc.) so the playground result still reaches Slack.
|
|
259
233
|
*/
|
|
260
|
-
const deliverReplyText = (args) =>
|
|
261
|
-
var _a, _b;
|
|
234
|
+
const deliverReplyText = async (args) => {
|
|
262
235
|
const state = args.channel.state;
|
|
263
236
|
if (state.channelId === null || state.threadTs === null || args.text === "") {
|
|
264
237
|
return false;
|
|
@@ -269,23 +242,23 @@ export function buildDefaultEvents(options = {}) {
|
|
|
269
242
|
const streamTs = state.streamTs;
|
|
270
243
|
if (streamTs !== null && streamTs !== "") {
|
|
271
244
|
if (streamLive(state)) {
|
|
272
|
-
|
|
245
|
+
await strategy.finalize({
|
|
273
246
|
channel: args.channel,
|
|
274
|
-
channelId:
|
|
247
|
+
channelId: state.streamChannelId ?? state.channelId,
|
|
275
248
|
text: args.text,
|
|
276
249
|
sessionId: args.sessionId,
|
|
277
250
|
});
|
|
278
251
|
}
|
|
279
252
|
else {
|
|
280
|
-
|
|
253
|
+
await strategy.cleanupOrphan({ channel: args.channel });
|
|
281
254
|
}
|
|
282
255
|
}
|
|
283
256
|
return true;
|
|
284
257
|
}
|
|
285
258
|
if (streamLive(state)) {
|
|
286
|
-
const { delivered } =
|
|
259
|
+
const { delivered } = await strategy.finalize({
|
|
287
260
|
channel: args.channel,
|
|
288
|
-
channelId:
|
|
261
|
+
channelId: state.streamChannelId ?? state.channelId,
|
|
289
262
|
text: args.text,
|
|
290
263
|
sessionId: args.sessionId,
|
|
291
264
|
});
|
|
@@ -294,8 +267,8 @@ export function buildDefaultEvents(options = {}) {
|
|
|
294
267
|
}
|
|
295
268
|
}
|
|
296
269
|
return finishProgress(args);
|
|
297
|
-
}
|
|
298
|
-
const paintReplyFooter = (args) =>
|
|
270
|
+
};
|
|
271
|
+
const paintReplyFooter = async (args) => {
|
|
299
272
|
const state = args.channel.state;
|
|
300
273
|
const ts = state.lastBotMessageTs;
|
|
301
274
|
const text = state.lastPostedText;
|
|
@@ -308,7 +281,7 @@ export function buildDefaultEvents(options = {}) {
|
|
|
308
281
|
streamHasCards(state)) {
|
|
309
282
|
return;
|
|
310
283
|
}
|
|
311
|
-
const result =
|
|
284
|
+
const result = await paintSlackFooter({
|
|
312
285
|
footer: reply.footer,
|
|
313
286
|
ctx: {
|
|
314
287
|
sessionId: args.sessionId,
|
|
@@ -328,303 +301,291 @@ export function buildDefaultEvents(options = {}) {
|
|
|
328
301
|
ts,
|
|
329
302
|
});
|
|
330
303
|
}
|
|
331
|
-
}
|
|
304
|
+
};
|
|
332
305
|
return {
|
|
333
|
-
"turn.started"(event, channel) {
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
loadingMessages,
|
|
369
|
-
});
|
|
306
|
+
async "turn.started"(event, channel) {
|
|
307
|
+
const log = getLog();
|
|
308
|
+
await progress.clear({ channel });
|
|
309
|
+
channel.state.pendingToolCallMessage = null;
|
|
310
|
+
channel.state.lastReasoningTypingAtMs = null;
|
|
311
|
+
channel.state.lastReasoningTypingStatus = null;
|
|
312
|
+
channel.state.streamTs = null;
|
|
313
|
+
channel.state.streamChannelId = null;
|
|
314
|
+
channel.state.streamFull = false;
|
|
315
|
+
// A stream failure downgrades the rest of its own turn, not the thread.
|
|
316
|
+
channel.state.streamingUnavailable = false;
|
|
317
|
+
channel.state.streamAppendedChunks = 0;
|
|
318
|
+
channel.state.lastPostedText = null;
|
|
319
|
+
channel.state.streamBlockText = null;
|
|
320
|
+
channel.state.turnStartedAtMs = Date.now();
|
|
321
|
+
channel.state.reasoningCard = undefined;
|
|
322
|
+
channel.state.toolCardCounts = {};
|
|
323
|
+
// Keep lastBotMessageTs across turns — warm delta watermark.
|
|
324
|
+
channel.state.approvalMessageByCallId = {};
|
|
325
|
+
const state = channel.state;
|
|
326
|
+
if (state.channelId === null || state.threadTs === null) {
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
log.info("turn.started", {
|
|
330
|
+
session: event.sessionId,
|
|
331
|
+
turn: event.turnId,
|
|
332
|
+
channel: state.channelId,
|
|
333
|
+
thread_ts: state.threadTs,
|
|
334
|
+
});
|
|
335
|
+
await setThreadStatus({
|
|
336
|
+
botToken,
|
|
337
|
+
channelId: state.channelId,
|
|
338
|
+
threadTs: state.threadTs,
|
|
339
|
+
status: "Working…",
|
|
340
|
+
loadingMessages,
|
|
370
341
|
});
|
|
371
342
|
},
|
|
372
|
-
"message.appended"(event, channel) {
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
343
|
+
async "message.appended"(event, channel) {
|
|
344
|
+
// Nested (subagent) text is not the reply.
|
|
345
|
+
if (nested(event) || !streamLive(channel.state)) {
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
const channelId = streamTarget(channel);
|
|
349
|
+
if (channelId === null) {
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
await completeReasoning(channel, event.sessionId);
|
|
353
|
+
await strategy.append({
|
|
354
|
+
channel,
|
|
355
|
+
channelId,
|
|
356
|
+
text: event.data.text,
|
|
357
|
+
sessionId: event.sessionId,
|
|
358
|
+
});
|
|
359
|
+
},
|
|
360
|
+
async "reasoning.appended"(event, channel) {
|
|
361
|
+
if (!nested(event)) {
|
|
362
|
+
await reasoning?.append({
|
|
384
363
|
channel,
|
|
385
|
-
channelId,
|
|
386
|
-
text: event.data.text,
|
|
387
364
|
sessionId: event.sessionId,
|
|
365
|
+
text: event.data.text,
|
|
388
366
|
});
|
|
367
|
+
}
|
|
368
|
+
// The chip is hidden while a stream is open.
|
|
369
|
+
if (!reply.status.reasoning || channel.state.streamTs !== null) {
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
const now = Date.now();
|
|
373
|
+
const status = nextReasoningChip(channel.state, event.data.text, now);
|
|
374
|
+
if (status === undefined) {
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
if (channel.state.channelId === null || channel.state.threadTs === null) {
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
// One entry: Slack cycles `loading_messages` every couple of seconds,
|
|
381
|
+
// so padding an informative line with the rotation makes the chip
|
|
382
|
+
// flip between the reasoning and filler until the next update.
|
|
383
|
+
const painted = await setThreadStatus({
|
|
384
|
+
botToken,
|
|
385
|
+
channelId: channel.state.channelId,
|
|
386
|
+
threadTs: channel.state.threadTs,
|
|
387
|
+
status,
|
|
388
|
+
loadingMessages: [status],
|
|
389
389
|
});
|
|
390
|
+
if (painted.ok) {
|
|
391
|
+
commitReasoningChip(channel.state, status, now);
|
|
392
|
+
}
|
|
390
393
|
},
|
|
391
|
-
"reasoning.
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
// The chip is hidden while a stream is open.
|
|
401
|
-
if (!reply.status.reasoning || channel.state.streamTs !== null) {
|
|
402
|
-
return;
|
|
403
|
-
}
|
|
404
|
-
const now = Date.now();
|
|
405
|
-
const status = nextReasoningChip(channel.state, event.data.text, now);
|
|
406
|
-
if (status === undefined) {
|
|
407
|
-
return;
|
|
408
|
-
}
|
|
409
|
-
if (channel.state.channelId === null || channel.state.threadTs === null) {
|
|
410
|
-
return;
|
|
411
|
-
}
|
|
412
|
-
// One entry: Slack cycles `loading_messages` every couple of seconds,
|
|
413
|
-
// so padding an informative line with the rotation makes the chip
|
|
414
|
-
// flip between the reasoning and filler until the next update.
|
|
415
|
-
const painted = yield setThreadStatus({
|
|
416
|
-
botToken,
|
|
417
|
-
channelId: channel.state.channelId,
|
|
418
|
-
threadTs: channel.state.threadTs,
|
|
419
|
-
status,
|
|
420
|
-
loadingMessages: [status],
|
|
421
|
-
});
|
|
422
|
-
if (painted.ok) {
|
|
423
|
-
commitReasoningChip(channel.state, status, now);
|
|
424
|
-
}
|
|
394
|
+
async "reasoning.completed"(event, channel) {
|
|
395
|
+
if (reasoning === null || nested(event)) {
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
reasoning.endBlock(channel);
|
|
399
|
+
await reasoning.flush({
|
|
400
|
+
channel,
|
|
401
|
+
sessionId: event.sessionId,
|
|
402
|
+
status: "in_progress",
|
|
425
403
|
});
|
|
426
404
|
},
|
|
427
|
-
"
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
reasoning
|
|
433
|
-
yield reasoning.flush({
|
|
405
|
+
async "actions.requested"(event, channel) {
|
|
406
|
+
const calls = event.data.calls;
|
|
407
|
+
const statusText = takeToolChipLine(channel.state, reply.status.tools, calls);
|
|
408
|
+
if (toolCards !== null && strategy.inlineToolSteps && !nested(event)) {
|
|
409
|
+
// Card order: the thinking that led to these tools goes first.
|
|
410
|
+
await reasoning?.flush({
|
|
434
411
|
channel,
|
|
435
412
|
sessionId: event.sessionId,
|
|
436
413
|
status: "in_progress",
|
|
437
414
|
});
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
const calls = event.data.calls;
|
|
443
|
-
const statusText = takeToolChipLine(channel.state, reply.status.tools, calls);
|
|
444
|
-
if (toolCards !== null && strategy.inlineToolSteps && !nested(event)) {
|
|
445
|
-
// Card order: the thinking that led to these tools goes first.
|
|
446
|
-
yield reasoning === null || reasoning === void 0 ? void 0 : reasoning.flush({
|
|
447
|
-
channel,
|
|
448
|
-
sessionId: event.sessionId,
|
|
449
|
-
status: "in_progress",
|
|
450
|
-
});
|
|
451
|
-
const streamed = yield sendCards({
|
|
452
|
-
channel,
|
|
453
|
-
sessionId: event.sessionId,
|
|
454
|
-
chunks: toolCards.forCalls(channel.state, calls),
|
|
455
|
-
});
|
|
456
|
-
// An open stream hides the chip; skip the status write.
|
|
457
|
-
if (streamed) {
|
|
458
|
-
return;
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
if (statusText === undefined) {
|
|
462
|
-
return;
|
|
463
|
-
}
|
|
464
|
-
if (channel.state.channelId === null || channel.state.threadTs === null) {
|
|
465
|
-
return;
|
|
466
|
-
}
|
|
467
|
-
// Hold the tool line steady; see reasoning.appended.
|
|
468
|
-
yield setThreadStatus({
|
|
469
|
-
botToken,
|
|
470
|
-
channelId: channel.state.channelId,
|
|
471
|
-
threadTs: channel.state.threadTs,
|
|
472
|
-
status: statusText,
|
|
473
|
-
loadingMessages: [statusText],
|
|
415
|
+
const streamed = await sendCards({
|
|
416
|
+
channel,
|
|
417
|
+
sessionId: event.sessionId,
|
|
418
|
+
chunks: toolCards.forCalls(channel.state, calls),
|
|
474
419
|
});
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
yield progress.upsert({ channel, text: statusText });
|
|
420
|
+
// An open stream hides the chip; skip the status write.
|
|
421
|
+
if (streamed) {
|
|
422
|
+
return;
|
|
479
423
|
}
|
|
424
|
+
}
|
|
425
|
+
if (statusText === undefined) {
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
if (channel.state.channelId === null || channel.state.threadTs === null) {
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
// Hold the tool line steady; see reasoning.appended.
|
|
432
|
+
await setThreadStatus({
|
|
433
|
+
botToken,
|
|
434
|
+
channelId: channel.state.channelId,
|
|
435
|
+
threadTs: channel.state.threadTs,
|
|
436
|
+
status: statusText,
|
|
437
|
+
loadingMessages: [statusText],
|
|
480
438
|
});
|
|
439
|
+
if (toolCards !== null &&
|
|
440
|
+
channel.state.streamingUnavailable === true &&
|
|
441
|
+
(channel.state.streamTs === null || channel.state.streamTs === "")) {
|
|
442
|
+
await progress.upsert({ channel, text: statusText });
|
|
443
|
+
}
|
|
481
444
|
},
|
|
482
|
-
"action.result"(event, channel) {
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
],
|
|
503
|
-
});
|
|
445
|
+
async "action.result"(event, channel) {
|
|
446
|
+
const streamTs = channel.state.streamTs;
|
|
447
|
+
if (toolCards === null ||
|
|
448
|
+
!strategy.inlineToolSteps ||
|
|
449
|
+
nested(event) ||
|
|
450
|
+
streamTs === null ||
|
|
451
|
+
streamTs === "") {
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
await sendCards({
|
|
455
|
+
channel,
|
|
456
|
+
sessionId: event.sessionId,
|
|
457
|
+
chunks: [
|
|
458
|
+
toolCards.forResult(channel.state, {
|
|
459
|
+
callId: event.data.callId,
|
|
460
|
+
toolName: event.data.toolName,
|
|
461
|
+
output: event.data.output,
|
|
462
|
+
isError: event.data.isError,
|
|
463
|
+
}),
|
|
464
|
+
],
|
|
504
465
|
});
|
|
505
466
|
},
|
|
506
|
-
"message.completed"(event, channel) {
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
sessionId: event.sessionId,
|
|
535
|
-
});
|
|
536
|
-
yield clearWorkingStatus(state.channelId, state.threadTs);
|
|
467
|
+
async "message.completed"(event, channel) {
|
|
468
|
+
if (nested(event)) {
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
rememberPendingToolCall(channel.state, event.data.finishReason, event.data.text);
|
|
472
|
+
if (event.data.finishReason === "tool_call") {
|
|
473
|
+
// The harness restarts its cumulative text after a tool call, so the
|
|
474
|
+
// next block appends in full instead of diffing against this one.
|
|
475
|
+
channel.state.streamBlockText = null;
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
const state = channel.state;
|
|
479
|
+
if (state.channelId === null || state.threadTs === null) {
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
await completeReasoning(channel, event.sessionId);
|
|
483
|
+
// Empty final text: still close any open stream / clear the skeleton
|
|
484
|
+
// and clear typing.
|
|
485
|
+
if (event.data.text === "") {
|
|
486
|
+
await strategy.finalizeEmpty({ channel });
|
|
487
|
+
await progress.clear({ channel });
|
|
488
|
+
await clearWorkingStatus(state.channelId, state.threadTs);
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
await deliverReplyText({
|
|
492
|
+
channel,
|
|
493
|
+
text: event.data.text,
|
|
494
|
+
sessionId: event.sessionId,
|
|
537
495
|
});
|
|
496
|
+
await clearWorkingStatus(state.channelId, state.threadTs);
|
|
538
497
|
},
|
|
539
|
-
"turn.completed"(event, channel, ctx) {
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
yield deliverReplyText({
|
|
557
|
-
channel,
|
|
558
|
-
text: result,
|
|
559
|
-
sessionId: event.sessionId,
|
|
560
|
-
});
|
|
561
|
-
}
|
|
562
|
-
// Always close leftovers. deliverReplyText may fall through to
|
|
563
|
-
// postMessage when streaming is unavailable and leave streamTs open.
|
|
564
|
-
yield strategy.cleanupOrphan({ channel });
|
|
565
|
-
yield progress.clear({ channel });
|
|
566
|
-
yield paintReplyFooter({
|
|
498
|
+
async "turn.completed"(event, channel, ctx) {
|
|
499
|
+
const log = getLog();
|
|
500
|
+
log.info("turn.completed", {
|
|
501
|
+
session: event.sessionId,
|
|
502
|
+
turn: event.turnId,
|
|
503
|
+
channel: channel.state.channelId,
|
|
504
|
+
thread_ts: channel.state.threadTs,
|
|
505
|
+
});
|
|
506
|
+
// Mid-turn `tool_call` text is held as status, not posted. If the
|
|
507
|
+
// turn ends without a later `finishReason: "stop"` block, the
|
|
508
|
+
// playground still has `result` (last assistant text) and Slack
|
|
509
|
+
// would otherwise stay silent.
|
|
510
|
+
const result = event.data.result;
|
|
511
|
+
const unpublished = typeof result === "string" && result !== "" && result !== channel.state.lastPostedText;
|
|
512
|
+
await completeReasoning(channel, event.sessionId);
|
|
513
|
+
if (unpublished) {
|
|
514
|
+
await deliverReplyText({
|
|
567
515
|
channel,
|
|
516
|
+
text: result,
|
|
568
517
|
sessionId: event.sessionId,
|
|
569
|
-
status: "completed",
|
|
570
|
-
host: ctx.host,
|
|
571
518
|
});
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
519
|
+
}
|
|
520
|
+
// Always close leftovers. deliverReplyText may fall through to
|
|
521
|
+
// postMessage when streaming is unavailable and leave streamTs open.
|
|
522
|
+
await strategy.cleanupOrphan({ channel });
|
|
523
|
+
await progress.clear({ channel });
|
|
524
|
+
await paintReplyFooter({
|
|
525
|
+
channel,
|
|
526
|
+
sessionId: event.sessionId,
|
|
527
|
+
status: "completed",
|
|
528
|
+
host: ctx.host,
|
|
529
|
+
});
|
|
530
|
+
// Always drop the assistant chip. message.completed already clears
|
|
531
|
+
// after a normal reply, but a tool-call-only finish (or a missed
|
|
532
|
+
// final assistant message) never hits that path — leaving
|
|
533
|
+
// "Working…" stuck until Slack expires it.
|
|
534
|
+
if (channel.state.channelId !== null && channel.state.threadTs !== null) {
|
|
535
|
+
await clearWorkingStatus(channel.state.channelId, channel.state.threadTs);
|
|
536
|
+
}
|
|
537
|
+
if (suggestedPrompts.length === 0 ||
|
|
538
|
+
channel.state.channelId === null ||
|
|
539
|
+
channel.state.threadTs === null) {
|
|
540
|
+
return;
|
|
541
|
+
}
|
|
542
|
+
await maybeSetSuggestedPrompts({
|
|
543
|
+
botToken,
|
|
544
|
+
channelId: channel.state.channelId,
|
|
545
|
+
threadTs: channel.state.threadTs,
|
|
546
|
+
prompts: suggestedPrompts,
|
|
547
|
+
...(suggestedPromptsTitle === undefined ? {} : { title: suggestedPromptsTitle }),
|
|
548
|
+
log,
|
|
585
549
|
});
|
|
586
550
|
},
|
|
587
|
-
"turn.failed"(event, channel, ctx) {
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
yield completeReasoning(channel, event.sessionId);
|
|
606
|
-
({ delivered } = yield strategy.fail({
|
|
607
|
-
channel,
|
|
608
|
-
channelId: (_a = state.streamChannelId) !== null && _a !== void 0 ? _a : state.channelId,
|
|
609
|
-
errorText,
|
|
610
|
-
sessionId: event.sessionId,
|
|
611
|
-
}));
|
|
612
|
-
}
|
|
613
|
-
if (!delivered) {
|
|
614
|
-
yield finishProgress({
|
|
615
|
-
channel,
|
|
616
|
-
text: errorText,
|
|
617
|
-
sessionId: event.sessionId,
|
|
618
|
-
});
|
|
619
|
-
}
|
|
620
|
-
yield paintReplyFooter({
|
|
551
|
+
async "turn.failed"(event, channel, ctx) {
|
|
552
|
+
const log = getLog();
|
|
553
|
+
const state = channel.state;
|
|
554
|
+
log.error("turn.failed", {
|
|
555
|
+
session: event.sessionId,
|
|
556
|
+
turn: event.turnId,
|
|
557
|
+
error: event.data.message,
|
|
558
|
+
channel: state.channelId,
|
|
559
|
+
thread_ts: state.threadTs,
|
|
560
|
+
});
|
|
561
|
+
if (state.channelId === null || state.threadTs === null) {
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
const errorText = formatSlackTurnFailureMessage(event.data.message);
|
|
565
|
+
let delivered = false;
|
|
566
|
+
if (streamLive(state)) {
|
|
567
|
+
await completeReasoning(channel, event.sessionId);
|
|
568
|
+
({ delivered } = await strategy.fail({
|
|
621
569
|
channel,
|
|
570
|
+
channelId: state.streamChannelId ?? state.channelId,
|
|
571
|
+
errorText,
|
|
572
|
+
sessionId: event.sessionId,
|
|
573
|
+
}));
|
|
574
|
+
}
|
|
575
|
+
if (!delivered) {
|
|
576
|
+
await finishProgress({
|
|
577
|
+
channel,
|
|
578
|
+
text: errorText,
|
|
622
579
|
sessionId: event.sessionId,
|
|
623
|
-
status: "failed",
|
|
624
|
-
host: ctx.host,
|
|
625
580
|
});
|
|
626
|
-
|
|
581
|
+
}
|
|
582
|
+
await paintReplyFooter({
|
|
583
|
+
channel,
|
|
584
|
+
sessionId: event.sessionId,
|
|
585
|
+
status: "failed",
|
|
586
|
+
host: ctx.host,
|
|
627
587
|
});
|
|
588
|
+
await clearWorkingStatus(state.channelId, state.threadTs);
|
|
628
589
|
},
|
|
629
590
|
};
|
|
630
591
|
}
|