@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,32 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* src/server/bg-retry.mjs
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* v6.3.0 — Periodic recovery for background-agent instances stuck
|
|
5
5
|
* in `dispatchPending: true` with `toolCallCount === 0`.
|
|
6
6
|
*
|
|
7
7
|
* Why this exists:
|
|
8
|
-
* Before
|
|
9
|
-
* `
|
|
10
|
-
* `
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* dashboard). The user's "home folder project" got stuck this way
|
|
15
|
-
* with 7 instances in `dispatchPending: true` — 6 from a Jun 19
|
|
16
|
-
* E2E test fixture and 1 active (`bgr_738FFSKMAT5SP58SVF5HQW`,
|
|
17
|
-
* "Install vLLM as a Python package").
|
|
8
|
+
* Before v6.3.0, the task delegator's `dispatchToBackground` would
|
|
9
|
+
* short-circuit when `pingClaudeSdk()` returned false and the
|
|
10
|
+
* `claude` binary wasn't on PATH. The bg state file was written
|
|
11
|
+
* with `dispatchPending: true` and the actual spawn never happened.
|
|
12
|
+
* The only recovery path was the user manually hitting
|
|
13
|
+
* `POST /api/tasks/:id/start` (or restarting the dashboard).
|
|
18
14
|
*
|
|
19
15
|
* What this module does:
|
|
20
16
|
* - On a 30s timer, walk every bg state file under BG_DIRS.
|
|
21
17
|
* - For any instance whose `dispatchPending === true` AND
|
|
22
18
|
* `toolCallCount === 0` AND `startedAt` is older than the
|
|
23
|
-
* 30-second grace window, attempt to re-dispatch by
|
|
24
|
-
*
|
|
25
|
-
* 2. POSTing `/api/session` to the cline serve child.
|
|
26
|
-
* 3. POSTing `/api/session/{id}/prompt` with the recorded
|
|
27
|
-
* prompt.
|
|
28
|
-
* 4. Wrapping the agent run in a tmux session via
|
|
29
|
-
* `backgroundStore.spawnTmuxFor`.
|
|
19
|
+
* 30-second grace window, attempt to re-dispatch by spawning
|
|
20
|
+
* `claude -p "<prompt>"` via `claude-runner.mjs`.
|
|
30
21
|
* - On success, clear `dispatchPending`, persist the real
|
|
31
22
|
* `sessionId`, bump `lastActivityAt`, and write the file back
|
|
32
23
|
* atomically.
|
|
@@ -49,9 +40,6 @@
|
|
|
49
40
|
* non-existent) tmux session — `spawnTmuxFor` already handles
|
|
50
41
|
* pre-existing sessions via its `note: 'session already existed'`
|
|
51
42
|
* return path.
|
|
52
|
-
* - The cline plugin's own bg state. The retry only writes the
|
|
53
|
-
* dashboard's view of the bg instance. The plugin will pick up
|
|
54
|
-
* the new dispatch on its next `GET /api/session` poll.
|
|
55
43
|
*/
|
|
56
44
|
|
|
57
45
|
import {
|
|
@@ -66,18 +54,13 @@ import { join } from 'node:path';
|
|
|
66
54
|
import { homedir } from 'node:os';
|
|
67
55
|
|
|
68
56
|
import { backgroundStore } from './background-store.mjs';
|
|
69
|
-
import {
|
|
70
|
-
readServeInfo,
|
|
71
|
-
pingClineServe,
|
|
72
|
-
createClineSession,
|
|
73
|
-
sendClinePrompt,
|
|
74
|
-
} from './serve-info.mjs';
|
|
75
57
|
import { tasksStore } from './tasks-store.mjs';
|
|
76
58
|
import {
|
|
77
59
|
deriveAbsoluteBgLogPath,
|
|
78
60
|
isBrokenBgLogPath,
|
|
79
61
|
getActualBgLogPath,
|
|
80
62
|
} from './lib/path-safe.mjs';
|
|
63
|
+
import { spawnAgent } from './claude-runner.mjs';
|
|
81
64
|
|
|
82
65
|
const HOME = homedir();
|
|
83
66
|
|
|
@@ -144,15 +127,7 @@ function findBgFile(instanceId) {
|
|
|
144
127
|
* - `retryCount < MAX_DISPATCH_RETRIES` (we don't retry past cap)
|
|
145
128
|
* - The instance is "stuck": either `dispatchPending === true`,
|
|
146
129
|
* OR `sessionId` is missing/empty (a sentinel for "spawn never
|
|
147
|
-
* returned
|
|
148
|
-
* `bgr_738FFSKMAT5SP58SVF5HQW.json` does NOT have a
|
|
149
|
-
* `dispatchPending` field — it was written by the cline
|
|
150
|
-
* plugin itself, not by the dashboard's task-delegator, so
|
|
151
|
-
* its stuckness is encoded as `sessionId: ""` instead.
|
|
152
|
-
*
|
|
153
|
-
* @param {object} inst
|
|
154
|
-
* @param {number} now
|
|
155
|
-
* @returns {boolean}
|
|
130
|
+
* returned a Claude Code session").
|
|
156
131
|
*/
|
|
157
132
|
export function shouldRetryDispatch(inst, now = Date.now()) {
|
|
158
133
|
if (!inst || typeof inst !== 'object') return false;
|
|
@@ -165,9 +140,6 @@ export function shouldRetryDispatch(inst, now = Date.now()) {
|
|
|
165
140
|
const startedAt = typeof inst.startedAt === 'number' ? inst.startedAt : 0;
|
|
166
141
|
if (startedAt <= 0) return false;
|
|
167
142
|
if (now - startedAt < DISPATCH_GRACE_MS) return false;
|
|
168
|
-
// Stuckness detector — either the dashboard marked this as
|
|
169
|
-
// dispatchPending, OR the plugin wrote an empty sessionId
|
|
170
|
-
// (meaning the cline session was never created).
|
|
171
143
|
const sessionId = inst.sessionId;
|
|
172
144
|
const emptySession = sessionId === null || sessionId === undefined || sessionId === '';
|
|
173
145
|
if (inst.dispatchPending !== true && !emptySession) return false;
|
|
@@ -175,16 +147,7 @@ export function shouldRetryDispatch(inst, now = Date.now()) {
|
|
|
175
147
|
}
|
|
176
148
|
|
|
177
149
|
/**
|
|
178
|
-
* Repair a bg instance's `logPath` if it is missing or broken
|
|
179
|
-
* (empty / not absolute / contains `//`). The plugin writes the
|
|
180
|
-
* logPath as `${worktree}/.cline/log/<id>.log` — when worktree
|
|
181
|
-
* was missing, the resulting path becomes `//.cline/log/<id>.log`
|
|
182
|
-
* and is unusable. We rebuild from a sane source: serve.json's
|
|
183
|
-
* `worktree` first, then the instance's existing worktree field,
|
|
184
|
-
* then `~/.cache/bizar/logs` as the last-resort fallback.
|
|
185
|
-
*
|
|
186
|
-
* @param {object} inst
|
|
187
|
-
* @returns {{ repaired: boolean, logPath: string }}
|
|
150
|
+
* Repair a bg instance's `logPath` if it is missing or broken.
|
|
188
151
|
*/
|
|
189
152
|
function repairLogPath(inst) {
|
|
190
153
|
const current = inst.logPath;
|
|
@@ -192,17 +155,8 @@ function repairLogPath(inst) {
|
|
|
192
155
|
return { repaired: false, logPath: typeof current === 'string' ? current : '' };
|
|
193
156
|
}
|
|
194
157
|
let worktree = '';
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
if (serve && typeof serve.worktree === 'string' && serve.worktree.length > 0) {
|
|
198
|
-
worktree = serve.worktree;
|
|
199
|
-
}
|
|
200
|
-
} catch {
|
|
201
|
-
/* ignore */
|
|
202
|
-
}
|
|
203
|
-
if (!worktree && typeof inst.worktree === 'string') {
|
|
204
|
-
worktree = inst.worktree;
|
|
205
|
-
}
|
|
158
|
+
if (typeof inst.worktree === 'string') worktree = inst.worktree;
|
|
159
|
+
if (!worktree) worktree = process.cwd();
|
|
206
160
|
const fixed = deriveAbsoluteBgLogPath(worktree, inst.instanceId || '');
|
|
207
161
|
return { repaired: true, logPath: fixed };
|
|
208
162
|
}
|
|
@@ -216,13 +170,6 @@ function repairLogPath(inst) {
|
|
|
216
170
|
* manual-retry endpoint) can render a useful message.
|
|
217
171
|
*
|
|
218
172
|
* @param {string} instanceId
|
|
219
|
-
* @returns {Promise<{
|
|
220
|
-
* ok: boolean,
|
|
221
|
-
* reason?: string,
|
|
222
|
-
* retryCount?: number,
|
|
223
|
-
* sessionId?: string,
|
|
224
|
-
* logPath?: string,
|
|
225
|
-
* }>}
|
|
226
173
|
*/
|
|
227
174
|
export async function retryDispatchOnce(instanceId) {
|
|
228
175
|
const found = findBgFile(instanceId);
|
|
@@ -248,133 +195,78 @@ export async function retryDispatchOnce(instanceId) {
|
|
|
248
195
|
return { ok: false, reason: 'max_retries_exceeded', retryCount };
|
|
249
196
|
}
|
|
250
197
|
|
|
251
|
-
// v3.11.0 — Repair a broken logPath so the new run can write logs.
|
|
252
198
|
const { repaired, logPath } = repairLogPath(inst);
|
|
253
199
|
|
|
254
|
-
//
|
|
255
|
-
|
|
256
|
-
// from the port and treat missing worktree as empty.
|
|
257
|
-
const serveInfo = readServeInfo();
|
|
258
|
-
if (!serveInfo) {
|
|
259
|
-
// Serve not running yet — bump retryCount but leave dispatchPending.
|
|
260
|
-
const updated = {
|
|
261
|
-
...inst,
|
|
262
|
-
retryCount,
|
|
263
|
-
lastRetryAt: Date.now(),
|
|
264
|
-
lastActivityAt: Date.now(),
|
|
265
|
-
...(repaired ? { logPath } : {}),
|
|
266
|
-
retryError: 'serve-info unavailable',
|
|
267
|
-
};
|
|
268
|
-
atomicWriteJson(found.file, updated);
|
|
269
|
-
return { ok: false, reason: 'serve_unavailable', retryCount };
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
const reachable = await pingClineServe(serveInfo);
|
|
273
|
-
if (!reachable) {
|
|
274
|
-
const updated = {
|
|
275
|
-
...inst,
|
|
276
|
-
retryCount,
|
|
277
|
-
lastRetryAt: Date.now(),
|
|
278
|
-
lastActivityAt: Date.now(),
|
|
279
|
-
...(repaired ? { logPath } : {}),
|
|
280
|
-
retryError: 'serve_unreachable',
|
|
281
|
-
};
|
|
282
|
-
atomicWriteJson(found.file, updated);
|
|
283
|
-
return { ok: false, reason: 'serve_unreachable', retryCount };
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// Attempt the actual session creation + prompt.
|
|
287
|
-
let createRes;
|
|
288
|
-
let sendRes;
|
|
200
|
+
// Verify the Claude Code runtime is reachable.
|
|
201
|
+
let claudeAvailable = false;
|
|
289
202
|
try {
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
agent: inst.agent || 'tyr',
|
|
295
|
-
parentID: undefined,
|
|
296
|
-
},
|
|
297
|
-
serveInfo.worktree || inst.worktree || '',
|
|
298
|
-
);
|
|
299
|
-
} catch (err) {
|
|
300
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
301
|
-
const updated = {
|
|
302
|
-
...inst,
|
|
303
|
-
retryCount,
|
|
304
|
-
lastRetryAt: Date.now(),
|
|
305
|
-
lastActivityAt: Date.now(),
|
|
306
|
-
...(repaired ? { logPath } : {}),
|
|
307
|
-
retryError: `createSession threw: ${message}`,
|
|
308
|
-
};
|
|
309
|
-
atomicWriteJson(found.file, updated);
|
|
310
|
-
return { ok: false, reason: 'create_threw', retryCount };
|
|
203
|
+
const { pingClaudeSdk } = await import('./claude-sdk.mjs');
|
|
204
|
+
claudeAvailable = await pingClaudeSdk();
|
|
205
|
+
} catch {
|
|
206
|
+
claudeAvailable = false;
|
|
311
207
|
}
|
|
312
|
-
|
|
313
|
-
|
|
208
|
+
if (!claudeAvailable) {
|
|
209
|
+
try {
|
|
210
|
+
const { spawnSync } = await import('node:child_process');
|
|
211
|
+
const probe = spawnSync('claude', ['-v'], { stdio: 'ignore', timeout: 1500 });
|
|
212
|
+
claudeAvailable = probe.status === 0;
|
|
213
|
+
} catch {
|
|
214
|
+
claudeAvailable = false;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (!claudeAvailable) {
|
|
314
218
|
const updated = {
|
|
315
219
|
...inst,
|
|
316
220
|
retryCount,
|
|
317
221
|
lastRetryAt: Date.now(),
|
|
318
222
|
lastActivityAt: Date.now(),
|
|
319
223
|
...(repaired ? { logPath } : {}),
|
|
320
|
-
retryError:
|
|
224
|
+
retryError: 'claude runtime unavailable',
|
|
321
225
|
};
|
|
322
226
|
atomicWriteJson(found.file, updated);
|
|
323
|
-
return { ok: false, reason: '
|
|
227
|
+
return { ok: false, reason: 'claude_unavailable', retryCount };
|
|
324
228
|
}
|
|
325
229
|
|
|
326
|
-
|
|
230
|
+
// Spawn the Claude Code process for this bg instance.
|
|
231
|
+
let sessionId = null;
|
|
327
232
|
try {
|
|
328
233
|
const promptText = buildReplayPromptText(inst);
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
)
|
|
234
|
+
const dispatchWorktree = inst.worktree || process.cwd();
|
|
235
|
+
const spawnRes = await spawnAgent({
|
|
236
|
+
prompt: promptText,
|
|
237
|
+
agent: inst.agent || 'tyr',
|
|
238
|
+
worktree: dispatchWorktree,
|
|
239
|
+
logPath: repaired ? logPath : (inst.logPath || getActualBgLogPath({ sessionId: instanceId })),
|
|
240
|
+
title: `retry:${instanceId}`,
|
|
241
|
+
});
|
|
242
|
+
if (!spawnRes.ok || !spawnRes.sessionId) {
|
|
243
|
+
const updated = {
|
|
244
|
+
...inst,
|
|
245
|
+
retryCount,
|
|
246
|
+
lastRetryAt: Date.now(),
|
|
247
|
+
lastActivityAt: Date.now(),
|
|
248
|
+
...(repaired ? { logPath } : {}),
|
|
249
|
+
retryError: spawnRes.error || 'spawn failed',
|
|
250
|
+
};
|
|
251
|
+
atomicWriteJson(found.file, updated);
|
|
252
|
+
return { ok: false, reason: 'spawn_failed', retryCount };
|
|
253
|
+
}
|
|
254
|
+
sessionId = spawnRes.sessionId;
|
|
338
255
|
} catch (err) {
|
|
339
256
|
const message = err instanceof Error ? err.message : String(err);
|
|
340
|
-
// Session was created but prompt failed. Mark the instance as
|
|
341
|
-
// running-with-sessionId so the operator can interact with it via
|
|
342
|
-
// cline directly; the next retry tick will re-issue the prompt
|
|
343
|
-
// only if toolCallCount stays at 0.
|
|
344
257
|
const updated = {
|
|
345
258
|
...inst,
|
|
346
|
-
sessionId,
|
|
347
259
|
retryCount,
|
|
348
260
|
lastRetryAt: Date.now(),
|
|
349
261
|
lastActivityAt: Date.now(),
|
|
350
|
-
status: 'running',
|
|
351
|
-
dispatchPending: false,
|
|
352
262
|
...(repaired ? { logPath } : {}),
|
|
353
|
-
retryError: `
|
|
263
|
+
retryError: `spawn threw: ${message}`,
|
|
354
264
|
};
|
|
355
265
|
atomicWriteJson(found.file, updated);
|
|
356
|
-
return { ok: false, reason: '
|
|
266
|
+
return { ok: false, reason: 'spawn_threw', retryCount };
|
|
357
267
|
}
|
|
358
268
|
|
|
359
|
-
|
|
360
|
-
const updated = {
|
|
361
|
-
...inst,
|
|
362
|
-
sessionId,
|
|
363
|
-
retryCount,
|
|
364
|
-
lastRetryAt: Date.now(),
|
|
365
|
-
lastActivityAt: Date.now(),
|
|
366
|
-
status: 'running',
|
|
367
|
-
dispatchPending: false,
|
|
368
|
-
...(repaired ? { logPath } : {}),
|
|
369
|
-
retryError: sendRes.error || 'sendPrompt failed',
|
|
370
|
-
};
|
|
371
|
-
atomicWriteJson(found.file, updated);
|
|
372
|
-
return { ok: false, reason: 'send_failed', retryCount, sessionId };
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
// Success path. Re-write the instance as `running`, clear
|
|
376
|
-
// dispatchPending, refresh activity timestamps, and wrap the agent
|
|
377
|
-
// run in a tmux session (best-effort, matches `task-delegator`).
|
|
269
|
+
// Success path.
|
|
378
270
|
const updated = {
|
|
379
271
|
...inst,
|
|
380
272
|
sessionId,
|
|
@@ -390,15 +282,11 @@ export async function retryDispatchOnce(instanceId) {
|
|
|
390
282
|
|
|
391
283
|
try {
|
|
392
284
|
const tmuxName = `bg_${(sessionId || instanceId).slice(0, 16)}`;
|
|
393
|
-
// v3.11.1 — Bug fix: the previous code tailed `${worktree}/.cline/log/<id>.log`,
|
|
394
|
-
// a path nothing writes to. The plugin's `LogWriter` writes to
|
|
395
|
-
// `${logDir}/${sessionId}.log` (default `~/.cache/bizar/logs`).
|
|
396
|
-
// Use the real path so the operator sees activity.
|
|
397
285
|
const logFile = getActualBgLogPath({ sessionId: sessionId || instanceId });
|
|
398
286
|
backgroundStore.spawnTmuxFor(
|
|
399
287
|
tmuxName,
|
|
400
288
|
{ command: 'tail', args: ['-n', '200', '-F', logFile] },
|
|
401
|
-
|
|
289
|
+
inst.worktree || undefined,
|
|
402
290
|
);
|
|
403
291
|
} catch {
|
|
404
292
|
/* best-effort */
|
|
@@ -410,7 +298,6 @@ export async function retryDispatchOnce(instanceId) {
|
|
|
410
298
|
await tasksStore.update(null, inst.taskId, {
|
|
411
299
|
status: 'doing',
|
|
412
300
|
metadata: {
|
|
413
|
-
...(typeof inst.mainTaskId === 'string' ? {} : {}),
|
|
414
301
|
progress: 5,
|
|
415
302
|
currentStep: `Re-dispatched (${sessionId})`,
|
|
416
303
|
dispatchedAt: Date.now(),
|
|
@@ -426,14 +313,7 @@ export async function retryDispatchOnce(instanceId) {
|
|
|
426
313
|
|
|
427
314
|
/**
|
|
428
315
|
* Reconstruct the prompt text for the retry from what the bg file
|
|
429
|
-
* stored.
|
|
430
|
-
* a multi-line prompt (`# Title`, body, `---`, IDs); we approximate
|
|
431
|
-
* that here using the promptPreview + instanceId context. If the
|
|
432
|
-
* upstream caller stored the full prompt in `metadata.promptText`,
|
|
433
|
-
* use that; otherwise fall back to the preview.
|
|
434
|
-
*
|
|
435
|
-
* @param {object} inst
|
|
436
|
-
* @returns {string}
|
|
316
|
+
* stored.
|
|
437
317
|
*/
|
|
438
318
|
function buildReplayPromptText(inst) {
|
|
439
319
|
const full = inst?.metadata?.promptText;
|
|
@@ -444,24 +324,23 @@ function buildReplayPromptText(inst) {
|
|
|
444
324
|
parts.push('');
|
|
445
325
|
parts.push('(Re-dispatched by the bg-retry loop — full prompt was not');
|
|
446
326
|
parts.push('persisted. The dashboard recovered this instance after the');
|
|
447
|
-
parts.push('
|
|
448
|
-
parts.push('if more context is required, inspect the
|
|
327
|
+
parts.push('Claude Code runtime was reachable. The original prompt');
|
|
328
|
+
parts.push('preview is above; if more context is required, inspect the');
|
|
329
|
+
parts.push('linked task.)');
|
|
449
330
|
parts.push('');
|
|
450
331
|
parts.push('---');
|
|
451
332
|
parts.push(`Subtask ID: ${inst.taskId || '(unknown)'}`);
|
|
452
333
|
parts.push(`Assigned agent: ${inst.agent || 'tyr'}`);
|
|
453
334
|
parts.push(`Parent task ID: ${inst.mainTaskId || '(none)'}`);
|
|
454
335
|
parts.push(`Instance ID: ${inst.instanceId}`);
|
|
336
|
+
parts.push(`Runtime: Claude Code (claude -p)`);
|
|
455
337
|
return parts.join('\n');
|
|
456
338
|
}
|
|
457
339
|
|
|
458
340
|
/**
|
|
459
341
|
* One pass of the retry loop. Walks every bg state file, identifies
|
|
460
342
|
* candidates via `shouldRetryDispatch`, and calls `retryDispatchOnce`
|
|
461
|
-
* for each.
|
|
462
|
-
* poison the rest of the pass.
|
|
463
|
-
*
|
|
464
|
-
* @returns {Promise<{ scanned: number, retried: number, succeeded: number, failed: number, skipped: number }>}
|
|
343
|
+
* for each.
|
|
465
344
|
*/
|
|
466
345
|
export async function tickRetryLoop() {
|
|
467
346
|
if (inFlightTick) {
|
|
@@ -528,9 +407,6 @@ export async function tickRetryLoop() {
|
|
|
528
407
|
|
|
529
408
|
/**
|
|
530
409
|
* Start the periodic retry loop. Idempotent.
|
|
531
|
-
*
|
|
532
|
-
* @param {object} [opts]
|
|
533
|
-
* @param {number} [opts.intervalMs] override the default 30s tick
|
|
534
410
|
*/
|
|
535
411
|
export function startBgRetryLoop({ intervalMs } = {}) {
|
|
536
412
|
if (intervalHandle) return { ok: true, alreadyRunning: true };
|
|
@@ -542,9 +418,6 @@ export function startBgRetryLoop({ intervalMs } = {}) {
|
|
|
542
418
|
});
|
|
543
419
|
}, ms);
|
|
544
420
|
if (typeof intervalHandle.unref === 'function') intervalHandle.unref();
|
|
545
|
-
// Kick off a first tick on the next event-loop turn so the
|
|
546
|
-
// dashboard recovers any pre-existing stuck instances immediately
|
|
547
|
-
// after a restart, without waiting 30s.
|
|
548
421
|
setImmediate(() => {
|
|
549
422
|
tickRetryLoop().catch(() => { /* logged inside */ });
|
|
550
423
|
});
|
|
@@ -570,5 +443,4 @@ export const _BG_RETRY_INTERNAL = {
|
|
|
570
443
|
MAX_DISPATCH_RETRIES,
|
|
571
444
|
};
|
|
572
445
|
|
|
573
|
-
|
|
574
|
-
void mkdirSync;
|
|
446
|
+
void mkdirSync;
|