@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
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/server/claude-sdk.mjs
|
|
3
|
+
*
|
|
4
|
+
* v6.3.0 — Dashboard-side wrapper around the Claude Code Agent SDK
|
|
5
|
+
* (`@anthropic-ai/claude-agent-sdk`).
|
|
6
|
+
*
|
|
7
|
+
* Replaces cline-sdk.mjs (the legacy wrapper around
|
|
8
|
+
* `@polderlabs/bizar-sdk/cline`). Claude Code's SDK is an in-process
|
|
9
|
+
* library: it exposes `query()` for one-shot prompts and
|
|
10
|
+
* `ClaudeSDKClient` for streaming sessions. There is no equivalent
|
|
11
|
+
* of cline's `serve` subprocess — Claude Code runs in-process by
|
|
12
|
+
* default.
|
|
13
|
+
*
|
|
14
|
+
* Public surface:
|
|
15
|
+
* - `getClaudeSdk()` — returns the SDK module or `null`
|
|
16
|
+
* if not installed (so callers can
|
|
17
|
+
* degrade gracefully).
|
|
18
|
+
* - `getClaudeSdkOrThrow()` — same, but throws when missing.
|
|
19
|
+
* - `subscribeToSession(id)` — wraps `ClaudeSDKClient.subscribe()`
|
|
20
|
+
* for streaming a session's events.
|
|
21
|
+
* - `pingClaudeSdk()` — quick health probe; uses a short
|
|
22
|
+
* `query()` against `--model haiku`
|
|
23
|
+
* to verify the SDK is reachable.
|
|
24
|
+
*
|
|
25
|
+
* Storage location for Claude Code sessions:
|
|
26
|
+
* - Sessions live at `~/.claude/sessions/<sessionId>/` with the
|
|
27
|
+
* conversation as `messages.jsonl`. This module does not own
|
|
28
|
+
* that directory — Claude Code writes it directly. We read it
|
|
29
|
+
* when callers ask for `listClaudeSessions` / `listClaudeMessages`.
|
|
30
|
+
*
|
|
31
|
+
* Environment:
|
|
32
|
+
* - Claude Code reads API keys from the environment
|
|
33
|
+
* (`ANTHROPIC_API_KEY` or the OAuth flow). We do NOT need to
|
|
34
|
+
* build an `Authorization: Basic base64("cline:<password>")`
|
|
35
|
+
* header — Claude Code handles authentication itself.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
import { homedir } from 'node:os';
|
|
39
|
+
import { join } from 'node:path';
|
|
40
|
+
import { existsSync } from 'node:fs';
|
|
41
|
+
|
|
42
|
+
let _sdk = null;
|
|
43
|
+
/** @type {Promise<any> | null} */
|
|
44
|
+
let _sdkPromise = null;
|
|
45
|
+
|
|
46
|
+
const HOME = homedir();
|
|
47
|
+
const CLAUDE_SESSIONS_DIR = join(HOME, '.claude', 'sessions');
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Lazily import the Claude Code Agent SDK. Returns the module on
|
|
51
|
+
* success and `null` if the package is not installed (so callers can
|
|
52
|
+
* fall back to subprocess execution via claude-runner.mjs).
|
|
53
|
+
*
|
|
54
|
+
* The result is cached so subsequent calls are synchronous.
|
|
55
|
+
*
|
|
56
|
+
* @returns {Promise<any | null>}
|
|
57
|
+
*/
|
|
58
|
+
export async function getClaudeSdk() {
|
|
59
|
+
if (_sdk) return _sdk;
|
|
60
|
+
if (_sdkPromise) return _sdkPromise;
|
|
61
|
+
_sdkPromise = (async () => {
|
|
62
|
+
try {
|
|
63
|
+
const mod = await import('@anthropic-ai/claude-agent-sdk');
|
|
64
|
+
_sdk = mod;
|
|
65
|
+
return mod;
|
|
66
|
+
} catch {
|
|
67
|
+
// SDK package not installed — caller should use the
|
|
68
|
+
// subprocess fallback in claude-runner.mjs.
|
|
69
|
+
_sdk = null;
|
|
70
|
+
return null;
|
|
71
|
+
} finally {
|
|
72
|
+
_sdkPromise = null;
|
|
73
|
+
}
|
|
74
|
+
})();
|
|
75
|
+
return _sdkPromise;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Same as {@link getClaudeSdk} but throws when the SDK isn't
|
|
80
|
+
* available. Use this from code paths that REQUIRE the in-process
|
|
81
|
+
* SDK (e.g. callers that want typed event streams rather than the
|
|
82
|
+
* JSONL subprocess path).
|
|
83
|
+
*
|
|
84
|
+
* @returns {Promise<any>}
|
|
85
|
+
*/
|
|
86
|
+
export async function getClaudeSdkOrThrow() {
|
|
87
|
+
const sdk = await getClaudeSdk();
|
|
88
|
+
if (!sdk) {
|
|
89
|
+
throw new Error(
|
|
90
|
+
'claude_sdk_unavailable: @anthropic-ai/claude-agent-sdk is not installed. ' +
|
|
91
|
+
'Run `npm install @anthropic-ai/claude-agent-sdk` at the repo root, ' +
|
|
92
|
+
'or use the subprocess path (claude-runner.mjs).',
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
return sdk;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Subscribe to a Claude Code session's event stream. Thin wrapper
|
|
100
|
+
* around `ClaudeSDKClient.subscribe({ sessionId })`.
|
|
101
|
+
*
|
|
102
|
+
* Returns `{ stream, close }` — `stream` is an `AsyncIterable` of
|
|
103
|
+
* typed event envelopes; `close()` aborts the underlying subscription.
|
|
104
|
+
*
|
|
105
|
+
* Returns `null` when the SDK is unavailable or the session id is
|
|
106
|
+
* missing — callers should fall back to the JSONL tailing path in
|
|
107
|
+
* `claude-sessions.mjs`.
|
|
108
|
+
*
|
|
109
|
+
* @param {string} sessionId
|
|
110
|
+
* @returns {Promise<AsyncIterable<unknown> & { close: () => void } | null>}
|
|
111
|
+
*/
|
|
112
|
+
export async function subscribeToSession(sessionId) {
|
|
113
|
+
if (!sessionId) return null;
|
|
114
|
+
const sdk = await getClaudeSdk();
|
|
115
|
+
if (!sdk || typeof sdk.subscribe !== 'function') return null;
|
|
116
|
+
try {
|
|
117
|
+
const sub = await sdk.subscribe({ sessionId });
|
|
118
|
+
return sub;
|
|
119
|
+
} catch {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Quick liveness probe for the Claude Code SDK. Performs a tiny
|
|
126
|
+
* `query()` call against `haiku` and waits up to 1.5s for the
|
|
127
|
+
* response. Returns `true` on any successful response, `false`
|
|
128
|
+
* otherwise.
|
|
129
|
+
*
|
|
130
|
+
* Used by the dashboard's /api/health endpoint and by callers that
|
|
131
|
+
* want to decide between the in-process SDK and the subprocess
|
|
132
|
+
* fallback.
|
|
133
|
+
*
|
|
134
|
+
* @returns {Promise<boolean>}
|
|
135
|
+
*/
|
|
136
|
+
export async function pingClaudeSdk() {
|
|
137
|
+
const sdk = await getClaudeSdk();
|
|
138
|
+
if (!sdk || typeof sdk.query !== 'function') return false;
|
|
139
|
+
try {
|
|
140
|
+
const ac = new AbortController();
|
|
141
|
+
const timer = setTimeout(() => ac.abort(), 1500);
|
|
142
|
+
try {
|
|
143
|
+
const stream = sdk.query({
|
|
144
|
+
prompt: 'ping',
|
|
145
|
+
options: { model: 'haiku', maxTurns: 1, permissionMode: 'plan' },
|
|
146
|
+
});
|
|
147
|
+
// Drain the first event or the abort signal — either proves
|
|
148
|
+
// the SDK is reachable.
|
|
149
|
+
const result = await Promise.race([
|
|
150
|
+
stream[Symbol.asyncIterator]().next().then(() => true),
|
|
151
|
+
new Promise((resolve) => {
|
|
152
|
+
ac.signal.addEventListener('abort', () => resolve(false));
|
|
153
|
+
}),
|
|
154
|
+
]);
|
|
155
|
+
// Best-effort close of the stream.
|
|
156
|
+
try { await stream.close?.(); } catch { /* ignore */ }
|
|
157
|
+
return Boolean(result);
|
|
158
|
+
} finally {
|
|
159
|
+
clearTimeout(timer);
|
|
160
|
+
ac.abort();
|
|
161
|
+
}
|
|
162
|
+
} catch {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Return the canonical on-disk directory for Claude Code sessions.
|
|
169
|
+
* Useful for callers that need to enumerate `messages.jsonl` files
|
|
170
|
+
* directly (e.g. listing historical messages for a session).
|
|
171
|
+
*
|
|
172
|
+
* @returns {string}
|
|
173
|
+
*/
|
|
174
|
+
export function claudeSessionsDir() {
|
|
175
|
+
return CLAUDE_SESSIONS_DIR;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Best-effort check that the Claude Code session directory exists
|
|
180
|
+
* (or its parent does). Lets callers fall back to "no sessions yet"
|
|
181
|
+
* rather than throwing when the user has never run `claude`.
|
|
182
|
+
*
|
|
183
|
+
* @returns {boolean}
|
|
184
|
+
*/
|
|
185
|
+
export function claudeSessionsDirExists() {
|
|
186
|
+
try {
|
|
187
|
+
return existsSync(CLAUDE_SESSIONS_DIR) || existsSync(join(HOME, '.claude'));
|
|
188
|
+
} catch {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
@@ -1074,58 +1074,31 @@ export const providersStore = {
|
|
|
1074
1074
|
/* best-effort */
|
|
1075
1075
|
}
|
|
1076
1076
|
|
|
1077
|
-
// Source 3:
|
|
1077
|
+
// Source 3: claude CLI probe. v6.3.0 — Claude Code has no
|
|
1078
|
+
// equivalent of the old cline serve HTTP API. Instead we
|
|
1079
|
+
// ping `claude -v` to confirm the runtime is reachable and,
|
|
1080
|
+
// if so, surface it as a "claude-cli" provider entry with the
|
|
1081
|
+
// models Claude Code natively supports.
|
|
1078
1082
|
try {
|
|
1079
|
-
const {
|
|
1080
|
-
const
|
|
1081
|
-
if (
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
? body.data
|
|
1096
|
-
: Array.isArray(body)
|
|
1097
|
-
? body
|
|
1098
|
-
: [];
|
|
1099
|
-
for (const p of list) {
|
|
1100
|
-
if (!p || typeof p !== 'object') continue;
|
|
1101
|
-
const id = p.id || p.name;
|
|
1102
|
-
if (!id) continue;
|
|
1103
|
-
const models = (Array.isArray(p.models) ? p.models : []).map((m) => {
|
|
1104
|
-
if (typeof m === 'string') return { id: m, name: m };
|
|
1105
|
-
return {
|
|
1106
|
-
id: m.id || m.name || String(m),
|
|
1107
|
-
name: m.name || m.id || String(m),
|
|
1108
|
-
};
|
|
1109
|
-
});
|
|
1110
|
-
upsert(
|
|
1111
|
-
id,
|
|
1112
|
-
{
|
|
1113
|
-
name: p.name || id,
|
|
1114
|
-
baseURL: p.baseURL || '',
|
|
1115
|
-
models,
|
|
1116
|
-
},
|
|
1117
|
-
'serve',
|
|
1118
|
-
);
|
|
1119
|
-
}
|
|
1120
|
-
}
|
|
1121
|
-
} catch {
|
|
1122
|
-
/* serve unreachable — fall through */
|
|
1123
|
-
} finally {
|
|
1124
|
-
clearTimeout(timer);
|
|
1125
|
-
}
|
|
1083
|
+
const { spawnSync } = await import('node:child_process');
|
|
1084
|
+
const probe = spawnSync('claude', ['-v'], { stdio: 'ignore', timeout: 1500 });
|
|
1085
|
+
if (probe.status === 0) {
|
|
1086
|
+
upsert(
|
|
1087
|
+
'claude-cli',
|
|
1088
|
+
{
|
|
1089
|
+
name: 'Claude Code CLI',
|
|
1090
|
+
baseURL: '',
|
|
1091
|
+
models: [
|
|
1092
|
+
{ id: 'claude-opus-4', name: 'Claude Opus 4' },
|
|
1093
|
+
{ id: 'claude-sonnet-4', name: 'Claude Sonnet 4' },
|
|
1094
|
+
{ id: 'claude-haiku-4', name: 'Claude Haiku 4' },
|
|
1095
|
+
],
|
|
1096
|
+
},
|
|
1097
|
+
'cli',
|
|
1098
|
+
);
|
|
1126
1099
|
}
|
|
1127
1100
|
} catch {
|
|
1128
|
-
/*
|
|
1101
|
+
/* claude CLI unreachable — fall through */
|
|
1129
1102
|
}
|
|
1130
1103
|
|
|
1131
1104
|
return Array.from(byId.values()).sort((a, b) => a.id.localeCompare(b.id));
|
|
@@ -14,10 +14,12 @@
|
|
|
14
14
|
* /api/background/:id/retry (POST) — manual unstick (v3.11.0)
|
|
15
15
|
* /api/background/:id (DELETE) — kill
|
|
16
16
|
*
|
|
17
|
-
* Backed by the
|
|
18
|
-
* store lazily so this module loads even when the
|
|
17
|
+
* Backed by the bg instance store at `~/.cache/bizar/bg/<id>.json`.
|
|
18
|
+
* Imports the store lazily so this module loads even when the Claude
|
|
19
|
+
* Code CLI is offline.
|
|
19
20
|
*
|
|
20
|
-
*
|
|
21
|
+
* v6.3.0: the spawner is now Claude-Code-based (see
|
|
22
|
+
* ../claude-bg-spawner.mjs).
|
|
21
23
|
* `POST /api/background/:id/steer` performs a true mid-flight prompt
|
|
22
24
|
* (no kill+respawn); the response shape stays backwards compatible with
|
|
23
25
|
* the v5.5.0 contract except `newInstanceId` is `null` (same instance
|
|
@@ -34,9 +36,10 @@ import { wrap } from './_shared.mjs';
|
|
|
34
36
|
export function createBackgroundRouter({ broadcast }) {
|
|
35
37
|
const router = Router();
|
|
36
38
|
|
|
37
|
-
// Wire bg-spawner's broadcast so spawned agents broadcast
|
|
38
|
-
// existing WS bus (mirroring the way `bg-poller.mjs` does
|
|
39
|
-
|
|
39
|
+
// Wire claude-bg-spawner's broadcast so spawned agents broadcast
|
|
40
|
+
// on the existing WS bus (mirroring the way `bg-poller.mjs` does
|
|
41
|
+
// it).
|
|
42
|
+
import('../claude-bg-spawner.mjs').then((m) => {
|
|
40
43
|
if (m && typeof m.configureSpawner === 'function') {
|
|
41
44
|
m.configureSpawner({ broadcast });
|
|
42
45
|
}
|
|
@@ -71,7 +74,7 @@ export function createBackgroundRouter({ broadcast }) {
|
|
|
71
74
|
const tags = Array.isArray(body.tags)
|
|
72
75
|
? body.tags.filter((t) => typeof t === 'string').slice(0, 10)
|
|
73
76
|
: undefined;
|
|
74
|
-
const { spawnBgAgent } = await import('../bg-spawner.mjs');
|
|
77
|
+
const { spawnBgAgent } = await import('../claude-bg-spawner.mjs');
|
|
75
78
|
const result = await spawnBgAgent({
|
|
76
79
|
agent,
|
|
77
80
|
prompt,
|
|
@@ -114,9 +117,9 @@ export function createBackgroundRouter({ broadcast }) {
|
|
|
114
117
|
}));
|
|
115
118
|
|
|
116
119
|
// v5.x — Tool-call history. The state file carries a `toolCalls`
|
|
117
|
-
// array populated by
|
|
118
|
-
//
|
|
119
|
-
// shape.
|
|
120
|
+
// array populated by claude-bg-spawner.mjs as it observes
|
|
121
|
+
// Claude Code events. This endpoint is read-only; the spawner
|
|
122
|
+
// owns the shape.
|
|
120
123
|
router.get('/background/:id/tool-calls', wrap(async (req, res) => {
|
|
121
124
|
const { backgroundStore } = await import('../background-store.mjs');
|
|
122
125
|
const inst = backgroundStore.get(req.params.id);
|
|
@@ -130,7 +133,7 @@ export function createBackgroundRouter({ broadcast }) {
|
|
|
130
133
|
|
|
131
134
|
// v5.x — Pause. SIGSTOP the subprocess.
|
|
132
135
|
router.post('/background/:id/pause', wrap(async (req, res) => {
|
|
133
|
-
const { pauseBgAgent } = await import('../bg-spawner.mjs');
|
|
136
|
+
const { pauseBgAgent } = await import('../claude-bg-spawner.mjs');
|
|
134
137
|
const result = pauseBgAgent(req.params.id);
|
|
135
138
|
if (!result.ok) {
|
|
136
139
|
res.status(result.error === 'unsupported_on_win32' ? 501 : 400).json({ ok: false, error: result.error });
|
|
@@ -142,7 +145,7 @@ export function createBackgroundRouter({ broadcast }) {
|
|
|
142
145
|
|
|
143
146
|
// v5.x — Resume. SIGCONT the subprocess.
|
|
144
147
|
router.post('/background/:id/resume', wrap(async (req, res) => {
|
|
145
|
-
const { resumeBgAgent } = await import('../bg-spawner.mjs');
|
|
148
|
+
const { resumeBgAgent } = await import('../claude-bg-spawner.mjs');
|
|
146
149
|
const result = resumeBgAgent(req.params.id);
|
|
147
150
|
if (!result.ok) {
|
|
148
151
|
res.status(result.error === 'unsupported_on_win32' ? 501 : 400).json({ ok: false, error: result.error });
|
|
@@ -152,8 +155,9 @@ export function createBackgroundRouter({ broadcast }) {
|
|
|
152
155
|
res.json({ ok: true, status: 'running' });
|
|
153
156
|
}));
|
|
154
157
|
|
|
155
|
-
//
|
|
156
|
-
//
|
|
158
|
+
// v6.3.0 — Steer is TRUE mid-flight: the dashboard calls
|
|
159
|
+
// claude-bg-spawner.mjs's `steerBgAgent()` on the live Claude Code
|
|
160
|
+
// session. No kill+respawn.
|
|
157
161
|
// The response shape is the same `{ ok, newInstanceId?, processId? }` —
|
|
158
162
|
// `newInstanceId` is omitted (the same instance is reused); the
|
|
159
163
|
// `mode` field tells the dashboard this was a true mid-flight steer.
|
|
@@ -168,7 +172,7 @@ export function createBackgroundRouter({ broadcast }) {
|
|
|
168
172
|
res.status(400).json({ ok: false, error: 'message_empty' });
|
|
169
173
|
return;
|
|
170
174
|
}
|
|
171
|
-
const { steerBgAgent } = await import('../bg-spawner.mjs');
|
|
175
|
+
const { steerBgAgent } = await import('../claude-bg-spawner.mjs');
|
|
172
176
|
const result = await steerBgAgent(req.params.id, message);
|
|
173
177
|
if (!result.ok) {
|
|
174
178
|
res.status(400).json({ ok: false, error: result.error });
|
|
@@ -276,7 +280,7 @@ export function createBackgroundRouter({ broadcast }) {
|
|
|
276
280
|
// that we own (spawned via POST /background). Falls back to the
|
|
277
281
|
// plugin's tmux/abort path for instances spawned by the plugin.
|
|
278
282
|
try {
|
|
279
|
-
const { isAlive: spawnerAlive, killBgAgent } = await import('../bg-spawner.mjs');
|
|
283
|
+
const { isAlive: spawnerAlive, killBgAgent } = await import('../claude-bg-spawner.mjs');
|
|
280
284
|
if (spawnerAlive(req.params.id)) {
|
|
281
285
|
const r = await killBgAgent(req.params.id, { signal: 'SIGTERM' });
|
|
282
286
|
if (r.ok) {
|
|
@@ -288,10 +292,10 @@ export function createBackgroundRouter({ broadcast }) {
|
|
|
288
292
|
} catch { /* ignore — fall through to legacy */ }
|
|
289
293
|
|
|
290
294
|
const { backgroundStore } = await import('../background-store.mjs');
|
|
291
|
-
//
|
|
292
|
-
//
|
|
293
|
-
// best-effort tmux). The result includes a `steps[]` array so
|
|
294
|
-
// can report exactly what happened.
|
|
295
|
+
// v6.3.0 — `kill()` is async (it awaits the kill on the
|
|
296
|
+
// claude-bg-spawner, then deletes the state file, then
|
|
297
|
+
// best-effort tmux). The result includes a `steps[]` array so
|
|
298
|
+
// the UI can report exactly what happened.
|
|
295
299
|
//
|
|
296
300
|
// We always return 200 — the result body's `ok` distinguishes
|
|
297
301
|
// success from partial failure (e.g. abort succeeded but tmux kill
|