@polderlabs/bizar 6.2.4 → 6.3.0
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/.claude/CLAUDE.md +15 -0
- package/.claude/agents/_shared/AGENT_BASELINE.md +168 -0
- package/.claude/agents/_shared/CLAUDE_TOOLS.md +412 -0
- package/.claude/agents/_shared/SKILLS.md +109 -0
- package/.claude/agents/agent-browser.md +80 -0
- package/.claude/agents/baldr.md +49 -0
- package/.claude/agents/forseti.md +51 -0
- package/.claude/agents/frigg.md +42 -0
- package/.claude/agents/heimdall.md +33 -0
- package/.claude/agents/hermod.md +53 -0
- package/.claude/agents/mimir.md +49 -0
- package/.claude/agents/odin.md +287 -0
- package/.claude/agents/quick.md +34 -0
- package/.claude/agents/semble-search.md +50 -0
- package/.claude/agents/thor.md +53 -0
- package/.claude/agents/tyr.md +56 -0
- package/.claude/agents/vidarr.md +54 -0
- package/.claude/agents/vor.md +53 -0
- package/.claude/commands/audit.md +25 -0
- package/.claude/commands/bizar.md +22 -0
- package/.claude/commands/explain.md +17 -0
- package/.claude/commands/init.md +29 -0
- package/.claude/commands/learn.md +44 -0
- package/.claude/commands/plan.md +35 -0
- package/.claude/commands/plow-through.md +50 -0
- package/.claude/commands/pr-review.md +49 -0
- package/.claude/commands/setup-provider.md +96 -0
- package/.claude/commands/tailscale-serve.md +100 -0
- package/.claude/commands/team.md +132 -0
- package/.claude/commands/test.md +62 -0
- package/.claude/commands/validate.md +68 -0
- package/.claude/commands/visual-plan.md +24 -0
- package/.claude/hooks/README.md +92 -0
- package/.claude/hooks/posttooluse-editwrite.mjs +91 -0
- package/.claude/hooks/pretooluse-bash.mjs +81 -0
- package/.claude/hooks/pretooluse-editwrite.mjs +139 -0
- package/.claude/hooks/sessionend-recall.mjs +74 -0
- package/.claude/hooks/sessionstart-prime.mjs +80 -0
- package/.claude/hooks/userpromptsubmit-tag.mjs +80 -0
- package/.claude/settings.json +116 -0
- package/.claude/skills/9router/SKILL.md +80 -0
- package/.claude/skills/9router-chat/SKILL.md +73 -0
- package/.claude/skills/9router-embeddings/SKILL.md +69 -0
- package/.claude/skills/9router-image/SKILL.md +86 -0
- package/.claude/skills/9router-stt/SKILL.md +79 -0
- package/.claude/skills/9router-tts/SKILL.md +80 -0
- package/.claude/skills/9router-web-fetch/SKILL.md +99 -0
- package/.claude/skills/9router-web-search/SKILL.md +91 -0
- package/.claude/skills/bizar/README.md +9 -0
- package/.claude/skills/bizar/SKILL.md +450 -0
- package/.claude/skills/cpp-coding-standards/README.md +28 -0
- package/.claude/skills/cpp-coding-standards/SKILL.md +634 -0
- package/.claude/skills/cpp-coding-standards/references/concurrency.md +320 -0
- package/.claude/skills/cpp-coding-standards/references/error-handling.md +229 -0
- package/.claude/skills/cpp-coding-standards/references/memory-safety.md +216 -0
- package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +282 -0
- package/.claude/skills/cpp-coding-standards/references/review-checklist.md +96 -0
- package/.claude/skills/cpp-testing/README.md +28 -0
- package/.claude/skills/cpp-testing/SKILL.md +304 -0
- package/.claude/skills/cpp-testing/references/coverage.md +370 -0
- package/.claude/skills/cpp-testing/references/framework-compare.md +175 -0
- package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +499 -0
- package/.claude/skills/cpp-testing/references/mocking.md +364 -0
- package/.claude/skills/cpp-testing/references/tdd-workflow.md +308 -0
- package/.claude/skills/cubesandbox/SKILL.md +148 -0
- package/.claude/skills/embedded-esp-idf/README.md +41 -0
- package/.claude/skills/embedded-esp-idf/SKILL.md +439 -0
- package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +214 -0
- package/.claude/skills/embedded-esp-idf/references/host-tests.md +164 -0
- package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +157 -0
- package/.claude/skills/embedded-esp-idf/references/kconfig.md +159 -0
- package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +118 -0
- package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +137 -0
- package/.claude/skills/embedded-esp-idf/references/nvs.md +121 -0
- package/.claude/skills/embedded-esp-idf/references/packed-structs.md +192 -0
- package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +47 -0
- package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +77 -0
- package/.claude/skills/glyph/SKILL.md +163 -0
- package/.claude/skills/harness-engineering/SKILL.md +143 -0
- package/.claude/skills/lightrag/SKILL.md +81 -0
- package/.claude/skills/memory-protocol/SKILL.md +105 -0
- package/.claude/skills/obsidian/SKILL.md +306 -0
- package/.claude/skills/read-the-damn-docs/SKILL.md +113 -0
- package/.claude/skills/self-improvement/SKILL.md +64 -0
- package/README.md +87 -59
- package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js → EnvVarsSection-B58aiJiE.js} +1 -1
- package/bizar-dash/dist/assets/{EnvVarsSection-DXM8gRm_.js.map → EnvVarsSection-B58aiJiE.js.map} +1 -1
- package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js → MobileChat-BJrqwVDd.js} +1 -1
- package/bizar-dash/dist/assets/{MobileChat-BnKN_Ks_.js.map → MobileChat-BJrqwVDd.js.map} +1 -1
- package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js → MobileSettings-CEQNJNLJ.js} +1 -1
- package/bizar-dash/dist/assets/{MobileSettings-DjCPxC-Q.js.map → MobileSettings-CEQNJNLJ.js.map} +1 -1
- package/bizar-dash/dist/assets/{main-DYiZqMrn.js → main-IvfQAOfy.js} +1 -1
- package/bizar-dash/dist/assets/{main-DYiZqMrn.js.map → main-IvfQAOfy.js.map} +1 -1
- package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js → markdown-tOLaD6nm.js} +1 -1
- package/bizar-dash/dist/assets/{markdown-C6mXtQxD.js.map → markdown-tOLaD6nm.js.map} +1 -1
- package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js → mobile-DYCHcUpq.js} +1 -1
- package/bizar-dash/dist/assets/{mobile-CMHqtLV2.js.map → mobile-DYCHcUpq.js.map} +1 -1
- package/bizar-dash/dist/assets/{mobile-layout-3jIhHX_p.js → mobile-layout-CBHjpwsb.js} +2 -2
- package/bizar-dash/dist/assets/{mobile-layout-3jIhHX_p.js.map → mobile-layout-CBHjpwsb.js.map} +1 -1
- package/bizar-dash/dist/assets/{useSlashCommands-DtITw8Xv.js → useSlashCommands-Bd7_FA6U.js} +2 -2
- package/bizar-dash/dist/assets/{useSlashCommands-DtITw8Xv.js.map → useSlashCommands-Bd7_FA6U.js.map} +1 -1
- package/bizar-dash/dist/assets/{vendor-CeHGtduv.js → vendor-C843201K.js} +12 -12
- package/bizar-dash/dist/assets/vendor-C843201K.js.map +1 -0
- package/bizar-dash/dist/index.html +6 -6
- package/bizar-dash/dist/mobile.html +2 -2
- package/bizar-dash/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -1
- package/bizar-dash/src/server/api.mjs +4 -4
- package/bizar-dash/src/server/background-store.mjs +15 -16
- package/bizar-dash/src/server/bg-poller.mjs +25 -35
- package/bizar-dash/src/server/bg-retry.mjs +66 -194
- package/bizar-dash/src/server/claude-bg-spawner.mjs +390 -0
- package/bizar-dash/src/server/claude-info.mjs +412 -0
- package/bizar-dash/src/server/{cline-runner.mjs → claude-runner.mjs} +53 -48
- package/bizar-dash/src/server/claude-sdk.mjs +191 -0
- package/bizar-dash/src/server/providers-store.mjs +22 -49
- package/bizar-dash/src/server/routes/background.mjs +24 -20
- package/bizar-dash/src/server/routes/chat.mjs +223 -326
- package/bizar-dash/src/server/routes/claude-session-detail.mjs +329 -0
- package/bizar-dash/src/server/routes/claude-sessions.mjs +259 -0
- package/bizar-dash/src/server/routes/tasks.mjs +20 -28
- package/bizar-dash/src/server/task-delegator.mjs +76 -77
- package/bizar-dash/src/web/components/chat/useChat.ts +23 -27
- package/bizar-dash/src/web/views/Chat.tsx +8 -8
- package/cli/bin.mjs +31 -18
- package/cli/commands/claude-cmd.mjs +348 -0
- package/cli/commands/install.mjs +12 -11
- package/cli/commands/sandbox.mjs +220 -0
- package/cli/commands/validate.mjs +252 -288
- package/cli/dev-link.test.mjs +11 -11
- package/cli/doctor.mjs +131 -213
- package/cli/install.mjs +33 -37
- package/cli/install.test.mjs +9 -9
- package/cli/provision-claude.mjs +893 -0
- package/cli/provision.mjs +330 -226
- package/cli/provision.test.mjs +102 -0
- package/cli/utils.mjs +72 -58
- package/config/AGENTS.md +28 -28
- package/config/agents/_shared/AGENT_BASELINE.md +104 -684
- package/config/skills/bizar/SKILL.md +197 -0
- package/config/skills/cubesandbox/SKILL.md +148 -0
- package/config/skills/harness-engineering/SKILL.md +142 -0
- package/install.sh +66 -44
- package/package.json +19 -11
- package/packages/sdk/ARCHITECTURE.md +40 -36
- package/packages/sdk/package-lock.json +32 -0
- package/packages/sdk/package.json +15 -5
- package/{plugins/bizar → packages/sdk}/src/dangerous-patterns.ts +6 -28
- package/packages/sdk/src/fingerprint.ts +0 -0
- package/packages/sdk/src/index.ts +38 -73
- package/packages/sdk/src/mcp/bin.ts +51 -0
- package/packages/sdk/src/mcp/server.ts +498 -0
- package/{plugins/bizar/src/memory-vault.ts → packages/sdk/src/memory/index.ts} +18 -21
- package/packages/sdk/tests/sdk.test.mjs +148 -0
- package/packages/sdk/vitest.config.ts +1 -1
- package/scripts/bh-full-e2e.mjs +166 -363
- package/scripts/check-deps.mjs +28 -46
- package/scripts/mirror-claude-md.sh +78 -0
- package/scripts/test-in-container.sh +157 -0
- package/templates/clean-state-checklist.md +3 -3
- package/templates/sprint-contract.md +2 -2
- package/bizar-dash/.bizar/activity.log +0 -3
- package/bizar-dash/.omx/logs/omx-2026-07-07.jsonl +0 -1
- package/bizar-dash/.omx/state/session.json +0 -10
- package/bizar-dash/bizar-design/EXPLANATION.md +0 -307
- package/bizar-dash/bizar-design/INSTRUCTIONS.md +0 -149
- package/bizar-dash/bizar-design/canvas.html +0 -281
- package/bizar-dash/bizar-design/canvas.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/components.css +0 -1665
- package/bizar-dash/bizar-design/components.html +0 -557
- package/bizar-dash/bizar-design/components.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/agents.html +0 -74
- package/bizar-dash/bizar-design/desktop/agents.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/memory.html +0 -75
- package/bizar-dash/bizar-design/desktop/memory.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/metrics.html +0 -63
- package/bizar-dash/bizar-design/desktop/metrics.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/overview.html +0 -95
- package/bizar-dash/bizar-design/desktop/overview.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/desktop/settings.html +0 -70
- package/bizar-dash/bizar-design/desktop/settings.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/icons.svg +0 -44
- package/bizar-dash/bizar-design/index.html +0 -192
- package/bizar-dash/bizar-design/index.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/agents.html +0 -29
- package/bizar-dash/bizar-design/mobile/agents.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/memory.html +0 -28
- package/bizar-dash/bizar-design/mobile/memory.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/metrics.html +0 -29
- package/bizar-dash/bizar-design/mobile/metrics.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/overview.html +0 -33
- package/bizar-dash/bizar-design/mobile/overview.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/mobile/settings.html +0 -28
- package/bizar-dash/bizar-design/mobile/settings.html.artifact.json +0 -19
- package/bizar-dash/bizar-design/prototype.js +0 -114
- package/bizar-dash/bizar-design/tokens.css +0 -106
- package/bizar-dash/dist/assets/vendor-CeHGtduv.js.map +0 -1
- package/bizar-dash/node_modules/.package-lock.json +0 -6
- package/bizar-dash/package-lock.json +0 -6
- package/bizar-dash/src/server/cline-sdk.mjs +0 -132
- package/bizar-dash/src/server/routes/cline-session-detail.mjs +0 -559
- package/bizar-dash/src/server/routes/cline-sessions.mjs +0 -291
- package/cli/commands/cline-cmd.mjs +0 -289
- package/cli/commands/validate.test.mjs +0 -344
- package/cli/doctor.test.mjs +0 -350
- package/config/cline.json.template +0 -342
- package/packages/sdk/src/client.ts +0 -188
- package/packages/sdk/src/cline-events.ts +0 -134
- package/packages/sdk/src/cline-types.ts +0 -66
- package/packages/sdk/src/cline.ts +0 -339
- package/packages/sdk/src/errors.ts +0 -129
- package/packages/sdk/src/events.ts +0 -153
- package/packages/sdk/src/types.ts +0 -176
- package/packages/sdk/tests/client.test.ts +0 -217
- package/packages/sdk/tests/errors.test.ts +0 -108
- package/packages/sdk/tests/events.test.ts +0 -139
- package/packages/sdk/tests/fixtures/fetch-mock.ts +0 -152
- package/packages/sdk/tests/fixtures/sse-mock.ts +0 -30
- package/plugins/bizar/ARCHITECTURE.md +0 -142
- package/plugins/bizar/CONSTRAINTS.md +0 -67
- package/plugins/bizar/LICENSE +0 -21
- package/plugins/bizar/README.md +0 -448
- package/plugins/bizar/index.ts +0 -872
- package/plugins/bizar/package.json +0 -39
- package/plugins/bizar/scripts/check-forbidden-imports.sh +0 -33
- package/plugins/bizar/src/background-state.ts +0 -641
- package/plugins/bizar/src/background.ts +0 -1806
- package/plugins/bizar/src/cline-runner.ts +0 -203
- package/plugins/bizar/src/clineruntime.ts +0 -227
- package/plugins/bizar/src/commands-impl.ts +0 -151
- package/plugins/bizar/src/commands.ts +0 -1799
- package/plugins/bizar/src/compaction.d.mts +0 -48
- package/plugins/bizar/src/compaction.mjs +0 -192
- package/plugins/bizar/src/dashboard-client.ts +0 -233
- package/plugins/bizar/src/event-stream.ts +0 -606
- package/plugins/bizar/src/fingerprint.ts +0 -120
- package/plugins/bizar/src/handoff.ts +0 -79
- package/plugins/bizar/src/hooks/memory-flush-on-compact.ts +0 -123
- package/plugins/bizar/src/hooks/memory-inject.ts +0 -247
- package/plugins/bizar/src/hooks/memory-write-on-end.ts +0 -188
- package/plugins/bizar/src/hooks/skill-curator.ts +0 -180
- package/plugins/bizar/src/http-client.ts +0 -467
- package/plugins/bizar/src/key-rotation.ts +0 -218
- package/plugins/bizar/src/logger.ts +0 -144
- package/plugins/bizar/src/loop-engineering.ts +0 -241
- package/plugins/bizar/src/loop.ts +0 -176
- package/plugins/bizar/src/mistake-recovery.ts +0 -98
- package/plugins/bizar/src/odin.ts +0 -227
- package/plugins/bizar/src/options.ts +0 -470
- package/plugins/bizar/src/plan-fs.ts +0 -323
- package/plugins/bizar/src/reasoning-clean.ts +0 -454
- package/plugins/bizar/src/report.ts +0 -178
- package/plugins/bizar/src/research-prompt.ts +0 -35
- package/plugins/bizar/src/serve-info.ts +0 -228
- package/plugins/bizar/src/serve.ts +0 -496
- package/plugins/bizar/src/settings.ts +0 -349
- package/plugins/bizar/src/state.ts +0 -298
- package/plugins/bizar/src/tool-discipline.ts +0 -105
- package/plugins/bizar/src/tools/agent-browser.ts +0 -315
- package/plugins/bizar/src/tools/bg-collect.ts +0 -131
- package/plugins/bizar/src/tools/bg-get-comments.ts +0 -266
- package/plugins/bizar/src/tools/bg-kill.ts +0 -116
- package/plugins/bizar/src/tools/bg-pause.ts +0 -99
- package/plugins/bizar/src/tools/bg-report-progress.ts +0 -115
- package/plugins/bizar/src/tools/bg-resume.ts +0 -94
- package/plugins/bizar/src/tools/bg-send-message.ts +0 -223
- package/plugins/bizar/src/tools/bg-spawn.ts +0 -502
- package/plugins/bizar/src/tools/bg-status.ts +0 -130
- package/plugins/bizar/src/tools/graph-query.ts +0 -278
- package/plugins/bizar/src/tools/loop-engineering.ts +0 -193
- package/plugins/bizar/src/tools/memory-list.ts +0 -43
- package/plugins/bizar/src/tools/memory-read.ts +0 -69
- package/plugins/bizar/src/tools/memory-search.ts +0 -47
- package/plugins/bizar/src/tools/memory-write.ts +0 -54
- package/plugins/bizar/src/tools/open-kb.ts +0 -198
- package/plugins/bizar/src/tools/plan-action.ts +0 -785
- package/plugins/bizar/src/tools/read-glyph-feedback.ts +0 -191
- package/plugins/bizar/src/tools/team-spawn.ts +0 -73
- package/plugins/bizar/src/tools/team-status.ts +0 -76
- package/plugins/bizar/src/tools/wait-for-feedback.ts +0 -415
- package/plugins/bizar/src/trajectory.ts +0 -104
- package/plugins/bizar/tests/README.md +0 -99
- package/plugins/bizar/tests/attach-handler-bug.test.ts +0 -169
- package/plugins/bizar/tests/background-state.test.ts +0 -277
- package/plugins/bizar/tests/background.test.ts +0 -402
- package/plugins/bizar/tests/block.test.ts +0 -195
- package/plugins/bizar/tests/canonical-key-order.test.ts +0 -75
- package/plugins/bizar/tests/clineruntime-config.test.ts +0 -283
- package/plugins/bizar/tests/commands-impl.test.ts +0 -316
- package/plugins/bizar/tests/commands.test.ts +0 -584
- package/plugins/bizar/tests/compaction.test.ts +0 -264
- package/plugins/bizar/tests/config.test.ts +0 -128
- package/plugins/bizar/tests/dashboard-client.test.ts +0 -159
- package/plugins/bizar/tests/dispose.test.ts +0 -336
- package/plugins/bizar/tests/event-stream.test.ts +0 -409
- package/plugins/bizar/tests/event.test.ts +0 -262
- package/plugins/bizar/tests/fingerprint.test.ts +0 -162
- package/plugins/bizar/tests/http-client.test.ts +0 -404
- package/plugins/bizar/tests/init-helpers.test.ts +0 -203
- package/plugins/bizar/tests/integration/slash-command.test.ts +0 -349
- package/plugins/bizar/tests/integration/tool-routing.test.ts +0 -98
- package/plugins/bizar/tests/key-rotation.test.ts +0 -396
- package/plugins/bizar/tests/loop-engineering.test.ts +0 -168
- package/plugins/bizar/tests/loop.test.ts +0 -397
- package/plugins/bizar/tests/memory-write-on-end.test.ts +0 -92
- package/plugins/bizar/tests/mistake-recovery.test.ts +0 -116
- package/plugins/bizar/tests/odin.test.ts +0 -125
- package/plugins/bizar/tests/options.test.ts +0 -329
- package/plugins/bizar/tests/reasoning-clean.test.ts +0 -422
- package/plugins/bizar/tests/safety.test.ts +0 -256
- package/plugins/bizar/tests/serve.test.ts +0 -339
- package/plugins/bizar/tests/settings.test.ts +0 -351
- package/plugins/bizar/tests/stall-think.test.ts +0 -750
- package/plugins/bizar/tests/state.test.ts +0 -276
- package/plugins/bizar/tests/tool-discipline.test.ts +0 -77
- package/plugins/bizar/tests/tools/agent-browser.test.ts +0 -98
- package/plugins/bizar/tests/tools/bg-collect.test.ts +0 -337
- package/plugins/bizar/tests/tools/bg-get-comments.test.ts +0 -485
- package/plugins/bizar/tests/tools/bg-kill.test.ts +0 -235
- package/plugins/bizar/tests/tools/bg-pause.test.ts +0 -61
- package/plugins/bizar/tests/tools/bg-report-progress.test.ts +0 -79
- package/plugins/bizar/tests/tools/bg-resume.test.ts +0 -40
- package/plugins/bizar/tests/tools/bg-send-message.test.ts +0 -116
- package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +0 -147
- package/plugins/bizar/tests/tools/bg-spawn-http.test.ts +0 -233
- package/plugins/bizar/tests/tools/bg-spawn.test.ts +0 -311
- package/plugins/bizar/tests/tools/bg-status.test.ts +0 -217
- package/plugins/bizar/tests/tools/cline-runner.test.ts +0 -115
- package/plugins/bizar/tests/tools/plan-action.test.ts +0 -599
- package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +0 -253
- package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +0 -390
- package/plugins/bizar/tests/update-deadlock.test.ts +0 -151
- package/plugins/bizar/tsconfig.json +0 -29
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* plugins/bizar/src/cline-runner.ts
|
|
3
|
-
*
|
|
4
|
-
* v5.5.1 — DEAD CODE stub.
|
|
5
|
-
*
|
|
6
|
-
* Background agents no longer run as `cline run` subprocesses. They
|
|
7
|
-
* run as long-lived cline serve SDK sessions, managed by the
|
|
8
|
-
* Bizar dashboard (`bizar-dash/src/server/bg-spawner.mjs`). The plugin
|
|
9
|
-
* delegates to the dashboard via HTTP (`bg-spawn.ts`,
|
|
10
|
-
* `bg-send-message.ts`, …) instead of spawning anything directly.
|
|
11
|
-
*
|
|
12
|
-
* This module is kept as a stub for two reasons:
|
|
13
|
-
*
|
|
14
|
-
* 1. `buildClineRunArgs` and the `SpawnAgentOptions` type are
|
|
15
|
-
* still imported by `plugins/bizar/tests/tools/cline-runner.test.ts`
|
|
16
|
-
* and serve as a regression pin for the argv layout that USED to
|
|
17
|
-
* be passed to `Bun.spawn`. The test suite stays green because
|
|
18
|
-
* the pure helpers are unchanged.
|
|
19
|
-
*
|
|
20
|
-
* 2. A handful of function names (`isAlive`, `killAgent`, …) are
|
|
21
|
-
* imported elsewhere (`background.ts`) as a future-proofing hook.
|
|
22
|
-
* We replace the implementations with no-op / error stubs so any
|
|
23
|
-
* leftover call gets a clear, deliberate response instead of
|
|
24
|
-
* silently succeeding.
|
|
25
|
-
*
|
|
26
|
-
* If something imports `spawnAgent`, it now gets back `{ ok: false,
|
|
27
|
-
* error: "spawnAgent removed in v5.5.1" }`. This forces callers to the
|
|
28
|
-
* dashboard path; nothing in the plugin should be calling this anymore.
|
|
29
|
-
*/
|
|
30
|
-
import type { Subprocess } from "bun";
|
|
31
|
-
|
|
32
|
-
export type AgentState =
|
|
33
|
-
| "starting"
|
|
34
|
-
| "running"
|
|
35
|
-
| "paused"
|
|
36
|
-
| "done"
|
|
37
|
-
| "failed"
|
|
38
|
-
| "killed";
|
|
39
|
-
|
|
40
|
-
export interface AgentStatus {
|
|
41
|
-
state: AgentState;
|
|
42
|
-
sessionId?: string;
|
|
43
|
-
processId: number;
|
|
44
|
-
startedAt: number;
|
|
45
|
-
endedAt?: number;
|
|
46
|
-
exitCode?: number;
|
|
47
|
-
error?: string;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export interface SpawnAgentOptions {
|
|
51
|
-
/** The prompt to send. */
|
|
52
|
-
prompt: string;
|
|
53
|
-
/** Agent name (mimir, thor, …) — used as the session title prefix. */
|
|
54
|
-
agent: string;
|
|
55
|
-
/** Optional model override in "providerID/modelID" format. */
|
|
56
|
-
model?: { providerID: string; modelID: string };
|
|
57
|
-
/** Working directory for the cline run. */
|
|
58
|
-
worktree: string;
|
|
59
|
-
/** Absolute path to the log file (the LogWriter's output path). */
|
|
60
|
-
logPath: string;
|
|
61
|
-
/** Optional session title (defaults to `bgr:<agent>`). */
|
|
62
|
-
title?: string;
|
|
63
|
-
/** Extra env vars to pass through. */
|
|
64
|
-
env?: Record<string, string>;
|
|
65
|
-
/** How long to wait for the sessionId to appear in stderr (ms). */
|
|
66
|
-
sessionIdTimeoutMs?: number;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export interface SpawnAgentResult {
|
|
70
|
-
ok: boolean;
|
|
71
|
-
sessionId?: string;
|
|
72
|
-
processId?: number;
|
|
73
|
-
error?: string;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
type ExitCallback = (status: AgentStatus) => void;
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* v5.5.1 — Pure helper, UNCHANGED. Kept around so the regression test
|
|
80
|
-
* that pins the argv layout still passes. (The argv used to be passed
|
|
81
|
-
* to `Bun.spawn`; v5.5.1 no longer spawns anything, but the wire format
|
|
82
|
-
* is a useful reference and may be reused if we ever revive subprocess
|
|
83
|
-
* mode.)
|
|
84
|
-
*
|
|
85
|
-
* @param opts
|
|
86
|
-
* @returns argv that USED to be passed to `Bun.spawn(["cline", "run", …])`
|
|
87
|
-
*/
|
|
88
|
-
export function buildClineRunArgs(opts: SpawnAgentOptions): string[] {
|
|
89
|
-
if (!opts.agent) {
|
|
90
|
-
throw new Error("bizar_spawn_background: agent is required");
|
|
91
|
-
}
|
|
92
|
-
const args: string[] = [
|
|
93
|
-
"cline",
|
|
94
|
-
"run",
|
|
95
|
-
"--dir", opts.worktree,
|
|
96
|
-
"--print-logs",
|
|
97
|
-
"--log-level", "INFO",
|
|
98
|
-
"--title", opts.title || `bgr:${opts.agent}:${Date.now()}`,
|
|
99
|
-
"--agent", opts.agent,
|
|
100
|
-
];
|
|
101
|
-
if (opts.model) {
|
|
102
|
-
args.push("--model", `${opts.model.providerID}/${opts.model.modelID}`);
|
|
103
|
-
}
|
|
104
|
-
args.push("--", opts.prompt);
|
|
105
|
-
return args;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* v5.5.1 — STUB. Background agents run on the cline serve SDK,
|
|
110
|
-
* not as `cline run` subprocesses. Returns an error directing the
|
|
111
|
-
* caller to the dashboard HTTP API.
|
|
112
|
-
*
|
|
113
|
-
* The plugin's `bg-spawn.ts` no longer calls this; it's kept for any
|
|
114
|
-
* late caller we missed.
|
|
115
|
-
*/
|
|
116
|
-
export async function spawnAgent(_opts: SpawnAgentOptions): Promise<SpawnAgentResult> {
|
|
117
|
-
return {
|
|
118
|
-
ok: false,
|
|
119
|
-
error:
|
|
120
|
-
"spawnAgent removed in v5.5.1 — bg agents now run as cline serve sessions " +
|
|
121
|
-
"managed by the Bizar dashboard. POST /api/background instead. " +
|
|
122
|
-
"See plugins/bizar/src/tools/bg-spawn.ts.",
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* v5.5.1 — STUB. Returns null because there is no in-process subprocess
|
|
128
|
-
* registry to look up.
|
|
129
|
-
*/
|
|
130
|
-
export function getStatus(_processId: number): AgentStatus | null {
|
|
131
|
-
return null;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* v5.5.1 — STUB. The real exit subscription lives on the dashboard side.
|
|
136
|
-
* Returns a no-op unsubscribe.
|
|
137
|
-
*/
|
|
138
|
-
export function onExit(_processId: number, _cb: ExitCallback): () => void {
|
|
139
|
-
return () => undefined;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* v5.5.1 — STUB. Kill is now a dashboard-side operation
|
|
144
|
-
* (`sdk.sessions.abort`). The plugin's `bg-kill.ts` posts to the
|
|
145
|
-
* dashboard HTTP API; this function is here only as a fallback that
|
|
146
|
-
* always reports "no such process tracked" so the dashboard's view of
|
|
147
|
-
* the world is the source of truth.
|
|
148
|
-
*/
|
|
149
|
-
export function killAgent(
|
|
150
|
-
_processId: number,
|
|
151
|
-
_signal: "SIGTERM" | "SIGKILL" = "SIGTERM",
|
|
152
|
-
): { ok: boolean; error?: string } {
|
|
153
|
-
return { ok: true, error: "no_such_process_tracked_v5_5_1_use_dashboard_delete" };
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* v5.5.1 — STUB. Pause is an output-pause at the dashboard side now.
|
|
158
|
-
* The plugin's `bg-pause.ts` posts to the dashboard; this stub returns
|
|
159
|
-
* `unsupported` so a leftover caller gets a clear signal.
|
|
160
|
-
*/
|
|
161
|
-
export function pauseAgent(_processId: number): { ok: boolean; error?: string } {
|
|
162
|
-
return { ok: false, error: "pause_via_dashboard_v5_5_1" };
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* v5.5.1 — STUB. Same as `pauseAgent` — dashboard-side only.
|
|
167
|
-
*/
|
|
168
|
-
export function resumeAgent(_processId: number): { ok: boolean; error?: string } {
|
|
169
|
-
return { ok: false, error: "resume_via_dashboard_v5_5_1" };
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* v5.5.1 — STUB. Returns false because there is no in-process PID
|
|
174
|
-
* registry. Liveness is owned by the dashboard; the plugin's state
|
|
175
|
-
* reconciliation code already uses this as a probe and falls back to
|
|
176
|
-
* "fail closed" when the answer is false.
|
|
177
|
-
*/
|
|
178
|
-
export function isAlive(processId: number): boolean {
|
|
179
|
-
if (!Number.isFinite(processId) || processId <= 0) return false;
|
|
180
|
-
return false;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* v5.5.1 — STUB. Returns an empty list — the runner registry is gone.
|
|
185
|
-
*/
|
|
186
|
-
export function list(): AgentStatus[] {
|
|
187
|
-
return [];
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* v5.5.1 — STUB. Clears nothing (the registry is empty). Kept for the
|
|
192
|
-
* test suite that imports it.
|
|
193
|
-
*/
|
|
194
|
-
export function _resetForTests(): void {
|
|
195
|
-
// no-op — the in-memory registry was removed.
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* v5.5.1 — STUB. Returns an empty record because no agent is tracked
|
|
200
|
-
* here. Provided so the module typechecks in callers that still reach
|
|
201
|
-
* for a status record shape.
|
|
202
|
-
*/
|
|
203
|
-
export type { Subprocess };
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* clineruntime.ts
|
|
3
|
-
*
|
|
4
|
-
* v6.0.0 — In-process ClineCore wrapper. Replaces the old ServeLifecycle
|
|
5
|
-
* (subprocess spawn), HttpClient (HTTP), and EventStream (SSE) with a
|
|
6
|
-
* single object that talks to ClineCore via direct function calls.
|
|
7
|
-
*
|
|
8
|
-
* Cline runs in-process now: there is no `cline serve` child, no port,
|
|
9
|
-
* no password, no serve-info file. The plugin embeds ClineCore and uses
|
|
10
|
-
* it directly.
|
|
11
|
-
*
|
|
12
|
-
* v6.0.1 — `startSession` accepts `execution` (passed straight into
|
|
13
|
-
* Cline's `AgentExecutionConfig`) and an
|
|
14
|
-
* `onConsecutiveMistakeLimitReached` recovery callback. The harness
|
|
15
|
-
* also defaults `execution.maxConsecutiveMistakes` so the bundled CLI's
|
|
16
|
-
* tight 3-strike abort does not kill sessions on the first malformed
|
|
17
|
-
* tool call.
|
|
18
|
-
*
|
|
19
|
-
* Public surface:
|
|
20
|
-
* - start() — boot ClineCore (idempotent)
|
|
21
|
-
* - startSession(opts) — create a session; returns sessionId
|
|
22
|
-
* - send(opts) — mid-flight prompt
|
|
23
|
-
* - abort(opts) — abort a session
|
|
24
|
-
* - subscribe(opts, cb) — events for a session; returns unsubscribe
|
|
25
|
-
* - stop() — teardown
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
import type { ClineCore, CoreSessionEvent } from "@cline/core";
|
|
29
|
-
import type {
|
|
30
|
-
ConsecutiveMistakeLimitContext,
|
|
31
|
-
ConsecutiveMistakeLimitDecision,
|
|
32
|
-
} from "@cline/shared";
|
|
33
|
-
import type { Logger } from "./logger.js";
|
|
34
|
-
|
|
35
|
-
type ClineCoreLike = Pick<ClineCore, "start" | "send" | "abort" | "stop" | "subscribe" | "dispose">;
|
|
36
|
-
|
|
37
|
-
export interface ClineRuntimeOptions {
|
|
38
|
-
logger: Logger;
|
|
39
|
-
clientName?: string;
|
|
40
|
-
backendMode?: "auto" | "local" | "hub" | "remote";
|
|
41
|
-
/**
|
|
42
|
-
* Default `execution.maxConsecutiveMistakes` applied to every session
|
|
43
|
-
* started by this runtime. Picked up from the plugin's normalized
|
|
44
|
-
* options (see `options.ts`). Per-session overrides via
|
|
45
|
-
* `StartSessionOpts.execution.maxConsecutiveMistakes` win.
|
|
46
|
-
*/
|
|
47
|
-
defaultMaxConsecutiveMistakes?: number;
|
|
48
|
-
/**
|
|
49
|
-
* Recovery callback used for every session started by this runtime.
|
|
50
|
-
* Built once at construction time (it is stateless) and applied
|
|
51
|
-
* unless the caller overrides via
|
|
52
|
-
* `StartSessionOpts.onConsecutiveMistakeLimitReached`. The harness
|
|
53
|
-
* passes `buildMistakeRecovery({ onRecovery })` from
|
|
54
|
-
* `mistake-recovery.ts` here so a single malformed tool call does
|
|
55
|
-
* not abort the session.
|
|
56
|
-
*/
|
|
57
|
-
defaultOnConsecutiveMistakeLimitReached?: (
|
|
58
|
-
ctx: ConsecutiveMistakeLimitContext,
|
|
59
|
-
) => Promise<ConsecutiveMistakeLimitDecision> | ConsecutiveMistakeLimitDecision;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export interface StartSessionOpts {
|
|
63
|
-
sessionId?: string;
|
|
64
|
-
providerId: string;
|
|
65
|
-
modelId: string;
|
|
66
|
-
apiKey?: string;
|
|
67
|
-
baseUrl?: string;
|
|
68
|
-
workspaceRoot: string;
|
|
69
|
-
systemPrompt?: string;
|
|
70
|
-
prompt: string;
|
|
71
|
-
sessionMetadata?: Record<string, unknown>;
|
|
72
|
-
source?: string;
|
|
73
|
-
/**
|
|
74
|
-
* Forwarded to ClineCore as `config.execution`. If supplied, the
|
|
75
|
-
* runtime overrides `execution.maxConsecutiveMistakes` with
|
|
76
|
-
* `runtime.defaultMaxConsecutiveMistakes` *only* when the caller
|
|
77
|
-
* didn't set it explicitly. Other fields (`reminderAfterIterations`,
|
|
78
|
-
* `reminderText`, `loopDetection`) pass through as-is.
|
|
79
|
-
*/
|
|
80
|
-
execution?: {
|
|
81
|
-
maxConsecutiveMistakes?: number;
|
|
82
|
-
reminderAfterIterations?: number;
|
|
83
|
-
reminderText?: string;
|
|
84
|
-
loopDetection?:
|
|
85
|
-
| false
|
|
86
|
-
| { softThreshold?: number; hardThreshold?: number };
|
|
87
|
-
};
|
|
88
|
-
/**
|
|
89
|
-
* Forwarded to ClineCore as `config.onConsecutiveMistakeLimitReached`.
|
|
90
|
-
* Used by `mistake-recovery.ts` to keep the session alive on
|
|
91
|
-
* recoverable mistakes (`invalid_tool_call`, `tool_execution_failed`)
|
|
92
|
-
* and stop on infra failures (`api_error`).
|
|
93
|
-
*/
|
|
94
|
-
onConsecutiveMistakeLimitReached?: (
|
|
95
|
-
ctx: ConsecutiveMistakeLimitContext,
|
|
96
|
-
) => Promise<ConsecutiveMistakeLimitDecision> | ConsecutiveMistakeLimitDecision;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export interface SendOpts { sessionId: string; prompt: string; }
|
|
100
|
-
export interface AbortOpts { sessionId: string; reason?: string; }
|
|
101
|
-
export interface SubscribeOpts { sessionId: string; }
|
|
102
|
-
|
|
103
|
-
export type SessionEventHandler = (event: CoreSessionEvent) => void;
|
|
104
|
-
export type UnsubscribeFn = () => void;
|
|
105
|
-
|
|
106
|
-
export class ClineRuntime {
|
|
107
|
-
private readonly logger: Logger;
|
|
108
|
-
private readonly clientName: string;
|
|
109
|
-
private readonly backendMode: "auto" | "local" | "hub" | "remote";
|
|
110
|
-
private readonly defaultMaxConsecutiveMistakes?: number;
|
|
111
|
-
private readonly defaultOnConsecutiveMistakeLimitReached?: (
|
|
112
|
-
ctx: ConsecutiveMistakeLimitContext,
|
|
113
|
-
) => Promise<ConsecutiveMistakeLimitDecision> | ConsecutiveMistakeLimitDecision;
|
|
114
|
-
private core: ClineCoreLike | null = null;
|
|
115
|
-
private startingPromise: Promise<ClineCoreLike> | null = null;
|
|
116
|
-
|
|
117
|
-
constructor(opts: ClineRuntimeOptions) {
|
|
118
|
-
this.logger = opts.logger;
|
|
119
|
-
this.clientName = opts.clientName ?? "bizar-plugin";
|
|
120
|
-
this.backendMode = opts.backendMode ?? "local";
|
|
121
|
-
if (typeof opts.defaultMaxConsecutiveMistakes === "number" && Number.isFinite(opts.defaultMaxConsecutiveMistakes)) {
|
|
122
|
-
this.defaultMaxConsecutiveMistakes = Math.max(3, Math.floor(opts.defaultMaxConsecutiveMistakes));
|
|
123
|
-
}
|
|
124
|
-
if (typeof opts.defaultOnConsecutiveMistakeLimitReached === "function") {
|
|
125
|
-
this.defaultOnConsecutiveMistakeLimitReached = opts.defaultOnConsecutiveMistakeLimitReached;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
async start(): Promise<void> {
|
|
130
|
-
if (this.core) return;
|
|
131
|
-
if (this.startingPromise) { await this.startingPromise; return; }
|
|
132
|
-
this.startingPromise = (async () => {
|
|
133
|
-
const cline = await import("@cline/core");
|
|
134
|
-
const core = await cline.ClineCore.create({ clientName: this.clientName, backendMode: this.backendMode });
|
|
135
|
-
this.core = core;
|
|
136
|
-
this.logger.info(`bizar: ClineCore ready (clientName=${this.clientName}, backend=${this.backendMode})`);
|
|
137
|
-
return core;
|
|
138
|
-
})();
|
|
139
|
-
try { await this.startingPromise; } finally { this.startingPromise = null; }
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
private async ensure(): Promise<ClineCoreLike> {
|
|
143
|
-
if (this.core) return this.core;
|
|
144
|
-
await this.start();
|
|
145
|
-
if (!this.core) throw new Error("clineruntime: ClineCore failed to start");
|
|
146
|
-
return this.core;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
async startSession(opts: StartSessionOpts): Promise<string> {
|
|
150
|
-
const core = await this.ensure();
|
|
151
|
-
const execution = this.buildExecution(opts.execution);
|
|
152
|
-
const recovery = opts.onConsecutiveMistakeLimitReached
|
|
153
|
-
?? this.defaultOnConsecutiveMistakeLimitReached;
|
|
154
|
-
const config: Parameters<ClineCore["start"]>[0]["config"] = {
|
|
155
|
-
providerId: opts.providerId,
|
|
156
|
-
modelId: opts.modelId,
|
|
157
|
-
apiKey: opts.apiKey,
|
|
158
|
-
baseUrl: opts.baseUrl,
|
|
159
|
-
systemPrompt: opts.systemPrompt ?? "",
|
|
160
|
-
workspaceRoot: opts.workspaceRoot,
|
|
161
|
-
cwd: opts.workspaceRoot,
|
|
162
|
-
enableTools: true,
|
|
163
|
-
enableSpawnAgent: true,
|
|
164
|
-
enableAgentTeams: true,
|
|
165
|
-
...(execution ? { execution } : {}),
|
|
166
|
-
...(recovery ? { onConsecutiveMistakeLimitReached: recovery } : {}),
|
|
167
|
-
};
|
|
168
|
-
const started = await core.start({
|
|
169
|
-
config: config as Parameters<ClineCore["start"]>[0]["config"],
|
|
170
|
-
prompt: opts.prompt,
|
|
171
|
-
source: opts.source,
|
|
172
|
-
sessionMetadata: opts.sessionMetadata,
|
|
173
|
-
...(opts.sessionId ? { sessionId: opts.sessionId } : {}),
|
|
174
|
-
});
|
|
175
|
-
return started.sessionId;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Merge caller's `execution` block with the runtime default
|
|
180
|
-
* (`defaultMaxConsecutiveMistakes`).
|
|
181
|
-
*
|
|
182
|
-
* v6.2.4 — Plugin's defaultMaxConsecutiveMistakes is now a FLOOR,
|
|
183
|
-
* not a default. The Cline CLI's `--retries` flag defaults to 3
|
|
184
|
-
* and previously silently overrode our 6 (or higher) — leading
|
|
185
|
-
* to premature session aborts after just 3 tool errors. Now we
|
|
186
|
-
* use Math.max(plugin_default, caller_value) so the user can
|
|
187
|
-
* still raise the limit with `--retries 15`, but the plugin's
|
|
188
|
-
* higher default is honored on plain `cline` invocations.
|
|
189
|
-
*
|
|
190
|
-
* Returns `undefined` when neither is set, so the optional field
|
|
191
|
-
* stays out of the config payload.
|
|
192
|
-
*/
|
|
193
|
-
private buildExecution(
|
|
194
|
-
callerExecution: StartSessionOpts["execution"],
|
|
195
|
-
): StartSessionOpts["execution"] | undefined {
|
|
196
|
-
if (!callerExecution && this.defaultMaxConsecutiveMistakes === undefined) return undefined;
|
|
197
|
-
const callerMax = callerExecution?.maxConsecutiveMistakes;
|
|
198
|
-
const pluginMax = this.defaultMaxConsecutiveMistakes;
|
|
199
|
-
const max =
|
|
200
|
-
callerMax !== undefined && pluginMax !== undefined
|
|
201
|
-
? Math.max(callerMax, pluginMax)
|
|
202
|
-
: callerMax ?? pluginMax;
|
|
203
|
-
return { ...callerExecution, ...(max !== undefined ? { maxConsecutiveMistakes: max } : {}) };
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
async send(opts: SendOpts): Promise<void> {
|
|
207
|
-
const core = await this.ensure();
|
|
208
|
-
await (core.send as unknown as (input: { sessionId: string; prompt: string }) => Promise<unknown>)({ sessionId: opts.sessionId, prompt: opts.prompt });
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
async abort(opts: AbortOpts): Promise<void> {
|
|
212
|
-
const core = await this.ensure();
|
|
213
|
-
await core.abort(opts.sessionId, opts.reason);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
subscribe(opts: SubscribeOpts, handler: SessionEventHandler): UnsubscribeFn {
|
|
217
|
-
if (!this.core) throw new Error("clineruntime: subscribe() called before start()");
|
|
218
|
-
return (this.core.subscribe as (l: SessionEventHandler, o?: SubscribeOpts) => UnsubscribeFn)(handler, opts);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
async stop(): Promise<void> {
|
|
222
|
-
if (!this.core) return;
|
|
223
|
-
try { await this.core.dispose(); }
|
|
224
|
-
catch (err) { this.logger.warn(`bizar: ClineCore.dispose failed: ${err instanceof Error ? err.message : String(err)}`); }
|
|
225
|
-
this.core = null;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* commands-impl.ts
|
|
3
|
-
*
|
|
4
|
-
* v0.5.0 — Side-effect executor for slash commands.
|
|
5
|
-
*
|
|
6
|
-
* Phase 2 (Cline SDK port) — replaces OpenCode's ToolContext and
|
|
7
|
-
* ToolDefinition with Cline's AgentToolContext and AgentTool.
|
|
8
|
-
*
|
|
9
|
-
* The `commands.ts` module is a pure parser: given a user message, it
|
|
10
|
-
* returns a `SlashCommandResult` describing what the chat hook should
|
|
11
|
-
* do. This module implements the "do" half:
|
|
12
|
-
*
|
|
13
|
-
* - `executeSideEffect` — dispatches `create_plan`,
|
|
14
|
-
* `list_plans`, `open_plan_url`, and `tool_invocation` to the
|
|
15
|
-
* right handler.
|
|
16
|
-
* - `executeToolInvocation` — builds a synthetic `AgentToolContext`,
|
|
17
|
-
* pre-validates args against the tool's Zod schema, and invokes
|
|
18
|
-
* the tool's `execute()` directly.
|
|
19
|
-
* - `buildSyntheticToolContext` — constructs the `AgentToolContext`
|
|
20
|
-
* shape Cline's tool framework requires.
|
|
21
|
-
* - `validateToolArgs` — wraps the tool's inputSchema into
|
|
22
|
-
* a `z.object(...)` and runs `safeParse`.
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
import { z } from "zod";
|
|
26
|
-
import type { AgentTool, AgentToolContext } from "@cline/sdk";
|
|
27
|
-
|
|
28
|
-
import type { Logger } from "./logger.js";
|
|
29
|
-
import type { DefaultTemplate } from "./settings.js";
|
|
30
|
-
import type { SideEffect } from "./commands.js";
|
|
31
|
-
import { createPlan as fsCreatePlan, listPlans as fsListPlans } from "./plan-fs.js";
|
|
32
|
-
|
|
33
|
-
export interface ExecutorContext {
|
|
34
|
-
worktree: string;
|
|
35
|
-
directory: string;
|
|
36
|
-
logger: Logger;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface ExecuteOptions {
|
|
40
|
-
tools: Record<string, AgentTool>;
|
|
41
|
-
defaultTemplate: DefaultTemplate;
|
|
42
|
-
defaultPort: number;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export interface ExecuteResult {
|
|
46
|
-
responseOverride?: string;
|
|
47
|
-
responseSuffix?: string;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export async function executeSideEffect(sideEffect: SideEffect, ctx: ExecutorContext, opts: ExecuteOptions): Promise<ExecuteResult> {
|
|
51
|
-
try {
|
|
52
|
-
switch (sideEffect.kind) {
|
|
53
|
-
case "create_plan": return await executeCreatePlan(sideEffect, ctx, opts);
|
|
54
|
-
case "list_plans": return await executeListPlans(sideEffect, ctx, opts);
|
|
55
|
-
case "open_plan_url": return await executeOpenPlanUrl(sideEffect, ctx, opts);
|
|
56
|
-
case "launch_dashboard": return await executeLaunchDashboard(sideEffect, ctx, opts);
|
|
57
|
-
case "tool_invocation": return await executeToolInvocation(sideEffect, ctx, opts);
|
|
58
|
-
default: {
|
|
59
|
-
const _exhaustive: never = sideEffect;
|
|
60
|
-
return { responseOverride: `Unknown side-effect: ${String(_exhaustive)}` };
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
} catch (err: unknown) {
|
|
64
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
65
|
-
ctx.logger.warn(`bizar: executeSideEffect crashed: ${msg}`);
|
|
66
|
-
return { responseOverride: `Command failed: ${msg}` };
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
async function executeCreatePlan(sideEffect: Extract<SideEffect, { kind: "create_plan" }>, ctx: ExecutorContext, opts: ExecuteOptions): Promise<ExecuteResult> {
|
|
71
|
-
const template = sideEffect.template ?? opts.defaultTemplate;
|
|
72
|
-
try {
|
|
73
|
-
const result = await fsCreatePlan(ctx.worktree, sideEffect.slug, { template, logger: ctx.logger });
|
|
74
|
-
if (!result.ok) return { responseOverride: `Failed to create plan: ${result.error}` };
|
|
75
|
-
return { responseOverride: `Created plan "${sideEffect.slug}" using the "${template}" template.` };
|
|
76
|
-
} catch (err: unknown) {
|
|
77
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
78
|
-
return { responseOverride: `Failed to create plan: ${msg}` };
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
async function executeListPlans(_sideEffect: Extract<SideEffect, { kind: "list_plans" }>, ctx: ExecutorContext, _opts: ExecuteOptions): Promise<ExecuteResult> {
|
|
83
|
-
try {
|
|
84
|
-
const plans = await fsListPlans(ctx.worktree, ctx.logger);
|
|
85
|
-
if (plans.length === 0) return { responseOverride: "No plans found. Use /plan create <slug> to start one." };
|
|
86
|
-
const lines = plans.map((p) => `- ${p.slug} [${p.status ?? "draft"}] — ${p.slug}`);
|
|
87
|
-
return { responseOverride: `Plans (${plans.length}):\n${lines.join("\n")}` };
|
|
88
|
-
} catch (err: unknown) {
|
|
89
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
90
|
-
return { responseOverride: `Failed to list plans: ${msg}` };
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
async function executeLaunchDashboard(sideEffect: Extract<SideEffect, { kind: "launch_dashboard" }>, _ctx: ExecutorContext, _opts: ExecuteOptions): Promise<ExecuteResult> {
|
|
95
|
-
return { responseOverride: `Launch dashboard at http://127.0.0.1:${sideEffect.defaultPort}/` };
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
async function executeOpenPlanUrl(sideEffect: Extract<SideEffect, { kind: "open_plan_url" }>, _ctx: ExecutorContext, opts: ExecuteOptions): Promise<ExecuteResult> {
|
|
99
|
-
return { responseOverride: `Open plan: http://127.0.0.1:${opts.defaultPort}/plans/${sideEffect.slug}` };
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export async function executeToolInvocation(sideEffect: Extract<SideEffect, { kind: "tool_invocation" }>, ctx: ExecutorContext, opts: ExecuteOptions): Promise<ExecuteResult> {
|
|
103
|
-
const { toolName, args } = sideEffect;
|
|
104
|
-
const tool = opts.tools[toolName];
|
|
105
|
-
if (tool === undefined) {
|
|
106
|
-
const known = Object.keys(opts.tools).sort().join(", ");
|
|
107
|
-
return { responseOverride: `Tool "${toolName}" is not registered in this plugin. Available tools: ${known || "(none)"}.` };
|
|
108
|
-
}
|
|
109
|
-
const validation = validateToolArgs(tool, args);
|
|
110
|
-
if (!validation.ok) return { responseOverride: `Invalid arguments for ${toolName}: ${validation.error}` };
|
|
111
|
-
const syntheticCtx = buildSyntheticToolContext(ctx);
|
|
112
|
-
try {
|
|
113
|
-
const result = await tool.execute(validation.args, syntheticCtx);
|
|
114
|
-
return { responseOverride: stringifyToolResult(result) };
|
|
115
|
-
} catch (err: unknown) {
|
|
116
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
117
|
-
ctx.logger.warn(`bizar: tool ${toolName} crashed: ${msg}`);
|
|
118
|
-
return { responseOverride: `Tool ${toolName} failed: ${msg}` };
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export function buildSyntheticToolContext(ctx: ExecutorContext): AgentToolContext {
|
|
123
|
-
return { agentId: "slash-command", sessionId: "slash-command", runId: `slash-command-${Date.now()}`, iteration: 0, signal: new AbortController().signal, metadata: { worktree: ctx.worktree, directory: ctx.directory, parentAgent: "" } } as unknown as AgentToolContext;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export function validateToolArgs(tool: AgentTool, args: unknown): { ok: true; args: Record<string, unknown> } | { ok: false; error: string } {
|
|
127
|
-
try {
|
|
128
|
-
const rawShape = (tool.inputSchema ?? {}) as z.ZodRawShape;
|
|
129
|
-
const schema = z.object(rawShape);
|
|
130
|
-
const result = schema.safeParse(args);
|
|
131
|
-
if (result.success) return { ok: true, args: result.data as Record<string, unknown> };
|
|
132
|
-
const first = result.error.issues[0];
|
|
133
|
-
const where = first?.path && first.path.length > 0 ? first.path.join(".") : "(root)";
|
|
134
|
-
return { ok: false, error: `${where}: ${first?.message ?? "validation failed"}` };
|
|
135
|
-
} catch (err: unknown) {
|
|
136
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
137
|
-
return { ok: false, error: `schema error: ${msg}` };
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
function stringifyToolResult(result: unknown): string {
|
|
142
|
-
if (typeof result === "string") return result;
|
|
143
|
-
if (result === null || result === undefined) return "";
|
|
144
|
-
const r = result as { output?: unknown };
|
|
145
|
-
if (r && typeof r === "object" && "output" in r) {
|
|
146
|
-
if (typeof r.output === "string") return r.output;
|
|
147
|
-
try { return JSON.stringify(r.output, null, 2); } catch { return String(r.output); }
|
|
148
|
-
}
|
|
149
|
-
if (typeof result === "object") { try { return JSON.stringify(result, null, 2); } catch { return String(result); } }
|
|
150
|
-
return String(result);
|
|
151
|
-
}
|