@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,264 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* compaction.test.ts
|
|
3
|
-
*
|
|
4
|
-
* Spec contract for the compaction gate (see src/compaction.mjs):
|
|
5
|
-
* - `shouldCompact` returns false below 50%, true at and above 50%.
|
|
6
|
-
* - `shouldCompact` is defensive: null usage, undefined usage.total, and
|
|
7
|
-
* non-positive maxContext all return false (no false positives).
|
|
8
|
-
* - `maybeCompactSession` returns `{ compacted: false, reason: "below_threshold" }`
|
|
9
|
-
* when below the gate.
|
|
10
|
-
* - `maybeCompactSession` returns `{ compacted: true, sessionId, threshold, … }`
|
|
11
|
-
* when at/over the gate.
|
|
12
|
-
* - The default threshold is 0.5.
|
|
13
|
-
* - `setCompactionThreshold` rejects out-of-range values with a throw;
|
|
14
|
-
* accepts in-range values silently.
|
|
15
|
-
* - State leaks between tests are not allowed — every test that mutates
|
|
16
|
-
* the threshold calls `resetCompactionDefaults()` in its teardown
|
|
17
|
-
* (bun:test does not have a global afterEach, so we use try/finally).
|
|
18
|
-
*
|
|
19
|
-
* Tests use `bun:test` to match the rest of the plugin suite (see
|
|
20
|
-
* `tests/loop.test.ts`, `tests/options.test.ts`, etc.).
|
|
21
|
-
*/
|
|
22
|
-
|
|
23
|
-
import {
|
|
24
|
-
describe,
|
|
25
|
-
test,
|
|
26
|
-
expect,
|
|
27
|
-
beforeEach,
|
|
28
|
-
afterEach,
|
|
29
|
-
} from "bun:test";
|
|
30
|
-
|
|
31
|
-
import {
|
|
32
|
-
shouldCompact,
|
|
33
|
-
maybeCompactSession,
|
|
34
|
-
getCompactionThreshold,
|
|
35
|
-
setCompactionThreshold,
|
|
36
|
-
resetCompactionDefaults,
|
|
37
|
-
} from "../src/compaction.mjs";
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Bun:test does not expose a global `afterEach`/`beforeEach` reset hook
|
|
41
|
-
* that runs across describe blocks, so we wire per-block setup/teardown
|
|
42
|
-
* via the standard `beforeEach`/`afterEach` imports. We also reset on
|
|
43
|
-
* entry to each test as a belt-and-braces guarantee that no leak from a
|
|
44
|
-
* prior test (run in the same process by `bun test`) can poison state.
|
|
45
|
-
*/
|
|
46
|
-
beforeEach(() => {
|
|
47
|
-
resetCompactionDefaults();
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
afterEach(() => {
|
|
51
|
-
resetCompactionDefaults();
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
describe("shouldCompact", () => {
|
|
55
|
-
test("does not compact below 50%", () => {
|
|
56
|
-
expect(shouldCompact({ total: 40000 }, 100000)).toBe(false);
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
test("does not compact at 49.99%", () => {
|
|
60
|
-
expect(shouldCompact({ total: 49999 }, 100000)).toBe(false);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test("compacts at exactly 50%", () => {
|
|
64
|
-
expect(shouldCompact({ total: 50000 }, 100000)).toBe(true);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
test("compacts above 50%", () => {
|
|
68
|
-
expect(shouldCompact({ total: 80000 }, 100000)).toBe(true);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
test("compacts at 100% (full context)", () => {
|
|
72
|
-
expect(shouldCompact({ total: 100000 }, 100000)).toBe(true);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
test("does not compact with null usage", () => {
|
|
76
|
-
expect(shouldCompact(null, 100000)).toBe(false);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test("does not compact with undefined usage", () => {
|
|
80
|
-
expect(shouldCompact(undefined, 100000)).toBe(false);
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
test("does not compact when usage.total is missing", () => {
|
|
84
|
-
expect(shouldCompact({}, 100000)).toBe(false);
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
test("does not compact with non-positive maxContext", () => {
|
|
88
|
-
expect(shouldCompact({ total: 50000 }, 0)).toBe(false);
|
|
89
|
-
expect(shouldCompact({ total: 50000 }, -1)).toBe(false);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
test("respects a non-default threshold (0.7)", () => {
|
|
93
|
-
setCompactionThreshold(0.7);
|
|
94
|
-
expect(shouldCompact({ total: 60000 }, 100000)).toBe(false);
|
|
95
|
-
expect(shouldCompact({ total: 70000 }, 100000)).toBe(true);
|
|
96
|
-
expect(shouldCompact({ total: 80000 }, 100000)).toBe(true);
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
describe("getCompactionThreshold / setCompactionThreshold", () => {
|
|
101
|
-
test("default threshold is 0.5", () => {
|
|
102
|
-
expect(getCompactionThreshold()).toBe(0.5);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
test("setCompactionThreshold rejects 0 (below minimum)", () => {
|
|
106
|
-
expect(() => setCompactionThreshold(0)).toThrow(/Invalid compaction threshold/);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
test("setCompactionThreshold rejects 0.05 (below minimum 0.1)", () => {
|
|
110
|
-
expect(() => setCompactionThreshold(0.05)).toThrow(/Invalid compaction threshold/);
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
test("setCompactionThreshold rejects 1.5 (above maximum)", () => {
|
|
114
|
-
expect(() => setCompactionThreshold(1.5)).toThrow(/Invalid compaction threshold/);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
test("setCompactionThreshold rejects NaN", () => {
|
|
118
|
-
expect(() => setCompactionThreshold(Number.NaN)).toThrow(/Invalid compaction threshold/);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
test("setCompactionThreshold rejects Infinity", () => {
|
|
122
|
-
expect(() => setCompactionThreshold(Number.POSITIVE_INFINITY)).toThrow(
|
|
123
|
-
/Invalid compaction threshold/,
|
|
124
|
-
);
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
test("setCompactionThreshold rejects non-number values", () => {
|
|
128
|
-
expect(() => setCompactionThreshold("0.5" as unknown as number)).toThrow(
|
|
129
|
-
/Invalid compaction threshold/,
|
|
130
|
-
);
|
|
131
|
-
expect(() => setCompactionThreshold(null as unknown as number)).toThrow(
|
|
132
|
-
/Invalid compaction threshold/,
|
|
133
|
-
);
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
test("setCompactionThreshold accepts 0.1 (lower bound)", () => {
|
|
137
|
-
expect(() => setCompactionThreshold(0.1)).not.toThrow();
|
|
138
|
-
expect(getCompactionThreshold()).toBe(0.1);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
test("setCompactionThreshold accepts 1.0 (upper bound)", () => {
|
|
142
|
-
expect(() => setCompactionThreshold(1.0)).not.toThrow();
|
|
143
|
-
expect(getCompactionThreshold()).toBe(1.0);
|
|
144
|
-
});
|
|
145
|
-
|
|
146
|
-
test("setCompactionThreshold accepts 0.7 (in-range)", () => {
|
|
147
|
-
expect(() => setCompactionThreshold(0.7)).not.toThrow();
|
|
148
|
-
expect(getCompactionThreshold()).toBe(0.7);
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
describe("maybeCompactSession", () => {
|
|
153
|
-
test("returns below_threshold when under limit", async () => {
|
|
154
|
-
const r = await maybeCompactSession({
|
|
155
|
-
sessionId: "s1",
|
|
156
|
-
messageCount: 5,
|
|
157
|
-
currentUsage: { total: 30000 },
|
|
158
|
-
maxContext: 100000,
|
|
159
|
-
summarizer: async (texts) => texts.join(" "),
|
|
160
|
-
});
|
|
161
|
-
expect(r.compacted).toBe(false);
|
|
162
|
-
expect(r.reason).toBe("below_threshold");
|
|
163
|
-
expect(r.ratio).toBeCloseTo(0.3);
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
test("triggers when over limit", async () => {
|
|
167
|
-
const r = await maybeCompactSession({
|
|
168
|
-
sessionId: "s1",
|
|
169
|
-
messageCount: 100,
|
|
170
|
-
currentUsage: { total: 60000 },
|
|
171
|
-
maxContext: 100000,
|
|
172
|
-
summarizer: async () => "summary",
|
|
173
|
-
});
|
|
174
|
-
expect(r.compacted).toBe(true);
|
|
175
|
-
expect(r.sessionId).toBe("s1");
|
|
176
|
-
expect(r.atMessages).toBe(100);
|
|
177
|
-
expect(r.threshold).toBe(0.5);
|
|
178
|
-
expect(r.preservedRecent).toBe(10);
|
|
179
|
-
expect(r.ratio).toBeCloseTo(0.6);
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
test("triggers at exactly the threshold (50000/100000 = 0.5)", async () => {
|
|
183
|
-
const r = await maybeCompactSession({
|
|
184
|
-
sessionId: "edge",
|
|
185
|
-
messageCount: 42,
|
|
186
|
-
currentUsage: { total: 50000 },
|
|
187
|
-
maxContext: 100000,
|
|
188
|
-
summarizer: async () => "",
|
|
189
|
-
});
|
|
190
|
-
expect(r.compacted).toBe(true);
|
|
191
|
-
expect(r.atMessages).toBe(42);
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
test("respects a custom preserveRecent override", async () => {
|
|
195
|
-
const r = await maybeCompactSession({
|
|
196
|
-
sessionId: "s2",
|
|
197
|
-
messageCount: 200,
|
|
198
|
-
currentUsage: { total: 90000 },
|
|
199
|
-
maxContext: 100000,
|
|
200
|
-
summarizer: async () => "",
|
|
201
|
-
preserveRecent: 25,
|
|
202
|
-
});
|
|
203
|
-
expect(r.compacted).toBe(true);
|
|
204
|
-
expect(r.preservedRecent).toBe(25);
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
test("respects a non-default threshold", async () => {
|
|
208
|
-
setCompactionThreshold(0.8);
|
|
209
|
-
const r1 = await maybeCompactSession({
|
|
210
|
-
sessionId: "s3",
|
|
211
|
-
messageCount: 50,
|
|
212
|
-
currentUsage: { total: 70000 },
|
|
213
|
-
maxContext: 100000,
|
|
214
|
-
summarizer: async () => "",
|
|
215
|
-
});
|
|
216
|
-
expect(r1.compacted).toBe(false);
|
|
217
|
-
|
|
218
|
-
const r2 = await maybeCompactSession({
|
|
219
|
-
sessionId: "s3",
|
|
220
|
-
messageCount: 50,
|
|
221
|
-
currentUsage: { total: 85000 },
|
|
222
|
-
maxContext: 100000,
|
|
223
|
-
summarizer: async () => "",
|
|
224
|
-
});
|
|
225
|
-
expect(r2.compacted).toBe(true);
|
|
226
|
-
expect(r2.threshold).toBe(0.8);
|
|
227
|
-
});
|
|
228
|
-
|
|
229
|
-
test("does not invoke the summarizer when below threshold", async () => {
|
|
230
|
-
let called = false;
|
|
231
|
-
await maybeCompactSession({
|
|
232
|
-
sessionId: "s4",
|
|
233
|
-
messageCount: 10,
|
|
234
|
-
currentUsage: { total: 1000 },
|
|
235
|
-
maxContext: 100000,
|
|
236
|
-
summarizer: async () => {
|
|
237
|
-
called = true;
|
|
238
|
-
return "should-not-run";
|
|
239
|
-
},
|
|
240
|
-
});
|
|
241
|
-
expect(called).toBe(false);
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
test("throws when sessionId is missing", async () => {
|
|
245
|
-
await expect(
|
|
246
|
-
maybeCompactSession({
|
|
247
|
-
sessionId: "",
|
|
248
|
-
messageCount: 1,
|
|
249
|
-
currentUsage: { total: 999999 },
|
|
250
|
-
maxContext: 100000,
|
|
251
|
-
summarizer: async () => "",
|
|
252
|
-
}),
|
|
253
|
-
).rejects.toThrow(/sessionId is required/);
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
describe("resetCompactionDefaults", () => {
|
|
258
|
-
test("restores the threshold to 0.5 after a custom set", () => {
|
|
259
|
-
setCompactionThreshold(0.9);
|
|
260
|
-
expect(getCompactionThreshold()).toBe(0.9);
|
|
261
|
-
resetCompactionDefaults();
|
|
262
|
-
expect(getCompactionThreshold()).toBe(0.5);
|
|
263
|
-
});
|
|
264
|
-
});
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* config.test.ts — Config drift detection tests (R4 audit).
|
|
3
|
-
*
|
|
4
|
-
* Verifies:
|
|
5
|
-
* 1. Every `bizar_*` tool registered in `plugins/bizar/index.ts`
|
|
6
|
-
* is also present in `config/cline.json` `tools: { ... }`.
|
|
7
|
-
* 2. No `bizarre_*` (double-r) typos remain in `plugins/bizar/src/`.
|
|
8
|
-
* 3. `plugins/bizar/package.json` version matches the current beta.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { describe, test, expect } from "bun:test";
|
|
12
|
-
import { readFileSync, readdirSync, statSync, existsSync } from "node:fs";
|
|
13
|
-
import { join } from "node:path";
|
|
14
|
-
|
|
15
|
-
const BIZAR_PLUGIN_ROOT = join(__dirname, "..");
|
|
16
|
-
const PLUGIN_INDEX = join(BIZAR_PLUGIN_ROOT, "index.ts");
|
|
17
|
-
const CONFIG_CLINE = join(__dirname, "..", "..", "..", "config", "cline.json");
|
|
18
|
-
const PKG_JSON = join(BIZAR_PLUGIN_ROOT, "package.json");
|
|
19
|
-
const SRC_DIR = join(BIZAR_PLUGIN_ROOT, "src");
|
|
20
|
-
|
|
21
|
-
// ---------------------------------------------------------------------------
|
|
22
|
-
// Helpers
|
|
23
|
-
// ---------------------------------------------------------------------------
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Extract `bizar_*` tool registration keys from index.ts.
|
|
27
|
-
* Matches: `bizar_spawn_background: createBgSpawnTool(...)` etc.
|
|
28
|
-
*/
|
|
29
|
-
function extractPluginToolKeys(indexContent: string): string[] {
|
|
30
|
-
const keys: string[] = [];
|
|
31
|
-
// Matches `bizar_xxx: createXxxTool(` or `bizar_xxx: createBgXxxTool(`
|
|
32
|
-
const toolKeyRegex = /\bbizar_([a-z_]+)\s*:\s*(?:create(?:Bg)?[A-Z]\w*Tool|createWaitForFeedbackTool)\s*\(/g;
|
|
33
|
-
let m: RegExpExecArray | null;
|
|
34
|
-
while ((m = toolKeyRegex.exec(indexContent)) !== null) {
|
|
35
|
-
keys.push(`bizar_${m[1]}`);
|
|
36
|
-
}
|
|
37
|
-
return [...new Set(keys)].sort();
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Extract `tools: { ... }` keys from config/cline.json.
|
|
42
|
-
*/
|
|
43
|
-
function extractConfigToolKeys(configContent: string): string[] {
|
|
44
|
-
const parsed = JSON.parse(configContent) as { tools?: Record<string, unknown> };
|
|
45
|
-
if (!parsed.tools) return [];
|
|
46
|
-
return Object.keys(parsed.tools).sort();
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// ---------------------------------------------------------------------------
|
|
50
|
-
// Test cases
|
|
51
|
-
// ---------------------------------------------------------------------------
|
|
52
|
-
|
|
53
|
-
describe("config drift detection", () => {
|
|
54
|
-
test("plugin_tool_keys ⊆ config_tools_keys (R4 audit)", () => {
|
|
55
|
-
if (!existsSync(CONFIG_CLINE)) {
|
|
56
|
-
// Skip when config/cline.json has not been generated yet.
|
|
57
|
-
// `bizar install` produces it from `config/cline.json.template`.
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
const indexContent = readFileSync(PLUGIN_INDEX, "utf-8");
|
|
61
|
-
const configContent = readFileSync(CONFIG_CLINE, "utf-8");
|
|
62
|
-
|
|
63
|
-
const pluginKeys = extractPluginToolKeys(indexContent);
|
|
64
|
-
const configKeys = extractConfigToolKeys(configContent);
|
|
65
|
-
|
|
66
|
-
const missingInConfig = pluginKeys.filter((k) => !configKeys.includes(k));
|
|
67
|
-
expect(missingInConfig, `Plugin tools missing in config: ${JSON.stringify(missingInConfig)}`).toEqual([]);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test("no 'bizarre_*' (double-r) typos remain in plugins/bizar/src/", () => {
|
|
71
|
-
// Walk src/ directory recursively and grep for 'bizarre_'
|
|
72
|
-
const allSrcFiles = getAllTsFiles(SRC_DIR);
|
|
73
|
-
const violations: Array<{ file: string; match: string }> = [];
|
|
74
|
-
|
|
75
|
-
const doubleRRegex = /\bbizarre_[a-z_]+\b/g;
|
|
76
|
-
|
|
77
|
-
for (const file of allSrcFiles) {
|
|
78
|
-
const content = readFileSync(file, "utf-8");
|
|
79
|
-
let m: RegExpExecArray | null;
|
|
80
|
-
while ((m = doubleRRegex.exec(content)) !== null) {
|
|
81
|
-
violations.push({ file: relativeToSrc(file), match: m[0] });
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
expect(
|
|
86
|
-
violations,
|
|
87
|
-
`Found 'bizarre_*' typos: ${JSON.stringify(violations)}`,
|
|
88
|
-
).toEqual([]);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
test("plugins/bizar/package.json version is current beta", () => {
|
|
92
|
-
const pkg = JSON.parse(readFileSync(PKG_JSON, "utf-8")) as { version?: string };
|
|
93
|
-
// v6.0.0 sprint bumped to 5.6.0-beta series; assert the prefix.
|
|
94
|
-
expect(pkg.version).toMatch(/^\d+\.\d+\.\d+(-beta\.\d+)?$/);
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
// ---------------------------------------------------------------------------
|
|
99
|
-
// Helper: recursively collect all .ts files under a directory
|
|
100
|
-
// ---------------------------------------------------------------------------
|
|
101
|
-
|
|
102
|
-
function getAllTsFiles(dir: string): string[] {
|
|
103
|
-
const results: string[] = [];
|
|
104
|
-
let entries: string[];
|
|
105
|
-
try {
|
|
106
|
-
entries = readdirSync(dir);
|
|
107
|
-
} catch {
|
|
108
|
-
return results;
|
|
109
|
-
}
|
|
110
|
-
for (const name of entries) {
|
|
111
|
-
const full = join(dir, name);
|
|
112
|
-
try {
|
|
113
|
-
const stat = statSync(full);
|
|
114
|
-
if (stat.isDirectory()) {
|
|
115
|
-
results.push(...getAllTsFiles(full));
|
|
116
|
-
} else if (name.endsWith(".ts") || name.endsWith(".tsx")) {
|
|
117
|
-
results.push(full);
|
|
118
|
-
}
|
|
119
|
-
} catch {
|
|
120
|
-
// skip inaccessible entries
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return results;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
function relativeToSrc(file: string): string {
|
|
127
|
-
return file.replace(SRC_DIR + "/", "");
|
|
128
|
-
}
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* dashboard-client.test.ts
|
|
3
|
-
*
|
|
4
|
-
* v0.7.0-alpha.1 — Tests for the SDK-backed dashboard publisher.
|
|
5
|
-
*
|
|
6
|
-
* Verifies:
|
|
7
|
-
* - publish() succeeds when the dashboard is reachable (uses a stub
|
|
8
|
-
* fetch via `createBizarClient`'s `fetch` injection — but our
|
|
9
|
-
* publisher doesn't currently expose fetch injection, so we test
|
|
10
|
-
* via the real `publishV2Event` round-trip from the smoke test
|
|
11
|
-
* pattern instead).
|
|
12
|
-
* - publish() drops events when the publisher is not started.
|
|
13
|
-
* - Graceful degradation: env var override is respected.
|
|
14
|
-
*
|
|
15
|
-
* Network tests (publish to a real dashboard) live in
|
|
16
|
-
* `tests/integration/dashboard-bridge.test.ts` and require a running
|
|
17
|
-
* dashboard server.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import { describe, it, expect } from "bun:test";
|
|
21
|
-
import { createDashboardPublisher, type Logger } from "../src/dashboard-client.js";
|
|
22
|
-
|
|
23
|
-
// ---------------------------------------------------------------------------
|
|
24
|
-
// Test logger
|
|
25
|
-
// ---------------------------------------------------------------------------
|
|
26
|
-
|
|
27
|
-
const makeLogger = (): Logger & { lines: string[] } => {
|
|
28
|
-
const lines: string[] = [];
|
|
29
|
-
return {
|
|
30
|
-
lines,
|
|
31
|
-
debug(m) { lines.push(`debug: ${m}`); },
|
|
32
|
-
info(m) { lines.push(`info: ${m}`); },
|
|
33
|
-
warn(m) { lines.push(`warn: ${m}`); },
|
|
34
|
-
error(m) { lines.push(`error: ${m}`); },
|
|
35
|
-
};
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
// ---------------------------------------------------------------------------
|
|
39
|
-
// Tests
|
|
40
|
-
// ---------------------------------------------------------------------------
|
|
41
|
-
|
|
42
|
-
describe("createDashboardPublisher", () => {
|
|
43
|
-
it("publish() drops events when not started", async () => {
|
|
44
|
-
const logger = makeLogger();
|
|
45
|
-
const pub = createDashboardPublisher({ logger });
|
|
46
|
-
// Do NOT call start()
|
|
47
|
-
expect(pub.isReady()).toBe(false);
|
|
48
|
-
|
|
49
|
-
await pub.publish({
|
|
50
|
-
type: "session.created",
|
|
51
|
-
properties: { sessionId: "ses_1", agent: "mimir" },
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
// Logger should have recorded a debug drop message.
|
|
55
|
-
expect(logger.lines.some((l) => l.includes("not ready"))).toBe(true);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it("start() is a no-op when disabled by config", async () => {
|
|
59
|
-
const logger = makeLogger();
|
|
60
|
-
const pub = createDashboardPublisher({ logger, disabled: true });
|
|
61
|
-
await pub.start();
|
|
62
|
-
expect(pub.isReady()).toBe(false);
|
|
63
|
-
expect(logger.lines.some((l) => l.includes("disabled"))).toBe(true);
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
it("start() is a no-op when no password is available", async () => {
|
|
67
|
-
const logger = makeLogger();
|
|
68
|
-
// Make sure no env vars or auth files are present in this test.
|
|
69
|
-
const prevUrl = process.env.BIZAR_DASHBOARD_URL;
|
|
70
|
-
const prevPort = process.env.BIZAR_DASHBOARD_PORT;
|
|
71
|
-
const prevPw = process.env.BIZAR_DASHBOARD_PASSWORD;
|
|
72
|
-
const prevAuthFile = process.env.BIZAR_DASHBOARD_AUTH_FILE;
|
|
73
|
-
const prevAuthFiles = process.env.BIZAR_DASHBOARD_AUTH_FILES;
|
|
74
|
-
delete process.env.BIZAR_DASHBOARD_URL;
|
|
75
|
-
delete process.env.BIZAR_DASHBOARD_PORT;
|
|
76
|
-
delete process.env.BIZAR_DASHBOARD_PASSWORD;
|
|
77
|
-
// Point auth-file discovery at a non-existent path.
|
|
78
|
-
process.env.BIZAR_DASHBOARD_AUTH_FILE = "/tmp/__no_such_auth_file__.json";
|
|
79
|
-
|
|
80
|
-
try {
|
|
81
|
-
const pub = createDashboardPublisher({ logger });
|
|
82
|
-
await pub.start();
|
|
83
|
-
expect(pub.isReady()).toBe(false);
|
|
84
|
-
expect(logger.lines.some((l) => l.includes("not started"))).toBe(true);
|
|
85
|
-
} finally {
|
|
86
|
-
if (prevUrl !== undefined) process.env.BIZAR_DASHBOARD_URL = prevUrl;
|
|
87
|
-
if (prevPort !== undefined) process.env.BIZAR_DASHBOARD_PORT = prevPort;
|
|
88
|
-
if (prevPw !== undefined) process.env.BIZAR_DASHBOARD_PASSWORD = prevPw;
|
|
89
|
-
if (prevAuthFile !== undefined) {
|
|
90
|
-
process.env.BIZAR_DASHBOARD_AUTH_FILE = prevAuthFile;
|
|
91
|
-
} else {
|
|
92
|
-
delete process.env.BIZAR_DASHBOARD_AUTH_FILE;
|
|
93
|
-
}
|
|
94
|
-
if (prevAuthFiles !== undefined) {
|
|
95
|
-
process.env.BIZAR_DASHBOARD_AUTH_FILES = prevAuthFiles;
|
|
96
|
-
} else {
|
|
97
|
-
delete process.env.BIZAR_DASHBOARD_AUTH_FILES;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
it("start() succeeds when password is provided via env", async () => {
|
|
103
|
-
const logger = makeLogger();
|
|
104
|
-
process.env.BIZAR_DASHBOARD_PASSWORD = "test-password-1234567890abcdef";
|
|
105
|
-
|
|
106
|
-
try {
|
|
107
|
-
const pub = createDashboardPublisher({
|
|
108
|
-
logger,
|
|
109
|
-
baseUrl: "http://127.0.0.1:1", // port 1 = unreachable, but SDK client constructs fine
|
|
110
|
-
});
|
|
111
|
-
await pub.start();
|
|
112
|
-
expect(pub.isReady()).toBe(true);
|
|
113
|
-
expect(logger.lines.some((l) => l.includes("publisher started"))).toBe(true);
|
|
114
|
-
pub.stop();
|
|
115
|
-
} finally {
|
|
116
|
-
delete process.env.BIZAR_DASHBOARD_PASSWORD;
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it("start() respects BIZAR_DASHBOARD_URL env var", async () => {
|
|
121
|
-
const logger = makeLogger();
|
|
122
|
-
process.env.BIZAR_DASHBOARD_URL = "http://127.0.0.1:4099";
|
|
123
|
-
process.env.BIZAR_DASHBOARD_PASSWORD = "test-password-1234567890abcdef";
|
|
124
|
-
|
|
125
|
-
try {
|
|
126
|
-
const pub = createDashboardPublisher({ logger });
|
|
127
|
-
await pub.start();
|
|
128
|
-
expect(pub.isReady()).toBe(true);
|
|
129
|
-
expect(
|
|
130
|
-
logger.lines.some((l) => l.includes("url=http://127.0.0.1:4099")),
|
|
131
|
-
).toBe(true);
|
|
132
|
-
pub.stop();
|
|
133
|
-
} finally {
|
|
134
|
-
delete process.env.BIZAR_DASHBOARD_URL;
|
|
135
|
-
delete process.env.BIZAR_DASHBOARD_PASSWORD;
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it("stop() clears ready state and drops queue", async () => {
|
|
140
|
-
const logger = makeLogger();
|
|
141
|
-
process.env.BIZAR_DASHBOARD_PASSWORD = "test-password-1234567890abcdef";
|
|
142
|
-
|
|
143
|
-
try {
|
|
144
|
-
const pub = createDashboardPublisher({ logger });
|
|
145
|
-
await pub.start();
|
|
146
|
-
expect(pub.isReady()).toBe(true);
|
|
147
|
-
pub.stop();
|
|
148
|
-
expect(pub.isReady()).toBe(false);
|
|
149
|
-
// Subsequent publish should be a no-op (drops because not ready).
|
|
150
|
-
await pub.publish({
|
|
151
|
-
type: "session.created",
|
|
152
|
-
properties: { sessionId: "ses_x", agent: "thor" },
|
|
153
|
-
});
|
|
154
|
-
// Just verifies it doesn't throw.
|
|
155
|
-
} finally {
|
|
156
|
-
delete process.env.BIZAR_DASHBOARD_PASSWORD;
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
});
|