@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,152 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test fixture: a fetch mock with canned responses + request log.
|
|
3
|
-
*
|
|
4
|
-
* Usage:
|
|
5
|
-
* const m = makeFetchMock();
|
|
6
|
-
* m.respondWith("GET", /\/sessions/, { body: [{ id: "ses_1" }] });
|
|
7
|
-
* const client = createBizarClient({ ..., fetch: m.fetch });
|
|
8
|
-
* await client.sessions.list();
|
|
9
|
-
* expect(m.lastRequest.url).toBe("http://127.0.0.1:4098/sessions");
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
export interface FetchMockRequest {
|
|
13
|
-
url: string;
|
|
14
|
-
method: string;
|
|
15
|
-
headers: Record<string, string>;
|
|
16
|
-
body: string | undefined;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface FetchMockRule {
|
|
20
|
-
method: string;
|
|
21
|
-
match: RegExp | string;
|
|
22
|
-
/** Plain canned response (text/JSON). */
|
|
23
|
-
response?: {
|
|
24
|
-
status: number;
|
|
25
|
-
body?: string;
|
|
26
|
-
contentType?: string;
|
|
27
|
-
};
|
|
28
|
-
/** Streaming response (SSE). Overrides `response` if both set. */
|
|
29
|
-
stream?: ReadableStream<Uint8Array>;
|
|
30
|
-
streamStatus?: number;
|
|
31
|
-
streamContentType?: string;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface FetchMock {
|
|
35
|
-
fetch: typeof fetch;
|
|
36
|
-
respondWith(method: string, match: RegExp | string, response: FetchMockRule["response"]): void;
|
|
37
|
-
respondWithStream(
|
|
38
|
-
method: string,
|
|
39
|
-
match: RegExp | string,
|
|
40
|
-
stream: ReadableStream<Uint8Array>,
|
|
41
|
-
opts?: { status?: number; contentType?: string },
|
|
42
|
-
): void;
|
|
43
|
-
respondWithError(method: string, match: RegExp | string, error: Error): void;
|
|
44
|
-
lastRequest: FetchMockRequest | null;
|
|
45
|
-
requests: FetchMockRequest[];
|
|
46
|
-
reset(): void;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function makeFetchMock(): FetchMock {
|
|
50
|
-
const rules: FetchMockRule[] = [];
|
|
51
|
-
const errorRules: Array<{ method: string; match: RegExp | string; error: Error }> = [];
|
|
52
|
-
const requests: FetchMockRequest[] = [];
|
|
53
|
-
let lastRequest: FetchMockRequest | null = null;
|
|
54
|
-
|
|
55
|
-
const mockFetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
|
|
56
|
-
const req: FetchMockRequest = {
|
|
57
|
-
url: typeof input === "string" ? input : input instanceof URL ? input.toString() : (input as Request).url,
|
|
58
|
-
method: (init?.method ?? "GET").toUpperCase(),
|
|
59
|
-
headers: parseHeaders(init?.headers),
|
|
60
|
-
body: init?.body === undefined ? undefined : String(init.body),
|
|
61
|
-
};
|
|
62
|
-
requests.push(req);
|
|
63
|
-
lastRequest = req;
|
|
64
|
-
|
|
65
|
-
const errorMatch = errorRules.find(
|
|
66
|
-
(r) => r.method.toUpperCase() === req.method && matchUrl(r.match, req.url),
|
|
67
|
-
);
|
|
68
|
-
if (errorMatch) throw errorMatch.error;
|
|
69
|
-
|
|
70
|
-
const rule = rules.find(
|
|
71
|
-
(r) => r.method.toUpperCase() === req.method && matchUrl(r.match, req.url),
|
|
72
|
-
);
|
|
73
|
-
if (!rule) {
|
|
74
|
-
return new Response(JSON.stringify({ error: "no mock rule" }), { status: 404 });
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (rule.stream) {
|
|
78
|
-
const headers: Record<string, string> = {};
|
|
79
|
-
headers["Content-Type"] = rule.streamContentType ?? "text/event-stream";
|
|
80
|
-
return new Response(rule.stream, {
|
|
81
|
-
status: rule.streamStatus ?? 200,
|
|
82
|
-
headers,
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const r = rule.response ?? { status: 200 };
|
|
87
|
-
const headers: Record<string, string> = {};
|
|
88
|
-
if (r.contentType) headers["Content-Type"] = r.contentType;
|
|
89
|
-
else if (r.body !== undefined) headers["Content-Type"] = "application/json";
|
|
90
|
-
|
|
91
|
-
// 204/205/304 MUST NOT have a body per the Fetch spec.
|
|
92
|
-
if (r.status === 204 || r.status === 205 || r.status === 304) {
|
|
93
|
-
return new Response(null, { status: r.status, headers });
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return new Response(r.body ?? "", {
|
|
97
|
-
status: r.status,
|
|
98
|
-
headers,
|
|
99
|
-
});
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
return {
|
|
103
|
-
fetch: mockFetch as typeof fetch,
|
|
104
|
-
respondWith(method, match, response) {
|
|
105
|
-
rules.push({ method: method.toUpperCase(), match, response });
|
|
106
|
-
},
|
|
107
|
-
respondWithStream(method, match, stream, opts) {
|
|
108
|
-
rules.push({
|
|
109
|
-
method: method.toUpperCase(),
|
|
110
|
-
match,
|
|
111
|
-
stream,
|
|
112
|
-
streamStatus: opts?.status ?? 200,
|
|
113
|
-
streamContentType: opts?.contentType ?? "text/event-stream",
|
|
114
|
-
});
|
|
115
|
-
},
|
|
116
|
-
respondWithError(method, match, error) {
|
|
117
|
-
errorRules.push({ method: method.toUpperCase(), match, error });
|
|
118
|
-
},
|
|
119
|
-
get lastRequest() {
|
|
120
|
-
return lastRequest;
|
|
121
|
-
},
|
|
122
|
-
requests,
|
|
123
|
-
reset() {
|
|
124
|
-
rules.length = 0;
|
|
125
|
-
errorRules.length = 0;
|
|
126
|
-
requests.length = 0;
|
|
127
|
-
lastRequest = null;
|
|
128
|
-
},
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function matchUrl(match: RegExp | string, url: string): boolean {
|
|
133
|
-
if (typeof match === "string") return url.endsWith(match) || url.includes(match);
|
|
134
|
-
return match.test(url);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function parseHeaders(h: HeadersInit | undefined): Record<string, string> {
|
|
138
|
-
if (!h) return {};
|
|
139
|
-
if (h instanceof Headers) {
|
|
140
|
-
const out: Record<string, string> = {};
|
|
141
|
-
h.forEach((v, k) => {
|
|
142
|
-
out[k] = v;
|
|
143
|
-
});
|
|
144
|
-
return out;
|
|
145
|
-
}
|
|
146
|
-
if (Array.isArray(h)) {
|
|
147
|
-
const out: Record<string, string> = {};
|
|
148
|
-
for (const [k, v] of h) out[k] = v;
|
|
149
|
-
return out;
|
|
150
|
-
}
|
|
151
|
-
return { ...(h as Record<string, string>) };
|
|
152
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test fixture: build an SSE ReadableStream from a list of events.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import type { DashboardEvent } from "../../src/types.js";
|
|
6
|
-
|
|
7
|
-
export function sseStream(events: DashboardEvent[]): ReadableStream<Uint8Array> {
|
|
8
|
-
const encoder = new TextEncoder();
|
|
9
|
-
return new ReadableStream<Uint8Array>({
|
|
10
|
-
start(controller) {
|
|
11
|
-
for (const event of events) {
|
|
12
|
-
const chunk = `event: ${event.type}\ndata: ${JSON.stringify(event)}\n\n`;
|
|
13
|
-
controller.enqueue(encoder.encode(chunk));
|
|
14
|
-
}
|
|
15
|
-
controller.close();
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function sseRawStream(chunks: string[]): ReadableStream<Uint8Array> {
|
|
21
|
-
const encoder = new TextEncoder();
|
|
22
|
-
return new ReadableStream<Uint8Array>({
|
|
23
|
-
start(controller) {
|
|
24
|
-
for (const chunk of chunks) {
|
|
25
|
-
controller.enqueue(encoder.encode(chunk));
|
|
26
|
-
}
|
|
27
|
-
controller.close();
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
}
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
# plugins/bizar/ — Architecture
|
|
2
|
-
|
|
3
|
-
> The Cline plugin entry and all 19 tools. This module is Layer 0
|
|
4
|
-
> (Core) and runs inside the Cline host. See
|
|
5
|
-
> [docs/architecture.md](../docs/architecture.md) for the layer
|
|
6
|
-
> model.
|
|
7
|
-
|
|
8
|
-
## Top-level layout
|
|
9
|
-
|
|
10
|
-
```
|
|
11
|
-
plugins/bizar/
|
|
12
|
-
├── index.ts # AgentPlugin entry; setup() + tools + hooks
|
|
13
|
-
├── src/
|
|
14
|
-
│ ├── clineruntime.ts # ClineCore wrapper (in-process)
|
|
15
|
-
│ ├── memory-vault.ts # Obsidian-compatible vault (in-process)
|
|
16
|
-
│ ├── dangerous-patterns.ts # 36 safety patterns (v6.0.0)
|
|
17
|
-
│ ├── background.ts # InstanceManager (state tracking)
|
|
18
|
-
│ ├── background-state.ts # Persisted state shape
|
|
19
|
-
│ ├── plan-fs.ts # Plan directory read/write
|
|
20
|
-
│ ├── plan-schema.ts # Zod schema for plans
|
|
21
|
-
│ ├── settings.ts # User settings store
|
|
22
|
-
│ ├── state.ts # Session state store (loop guard)
|
|
23
|
-
│ ├── settings-store.ts # Settings file IO
|
|
24
|
-
│ ├── log-writer.ts # Append-only tool-call log
|
|
25
|
-
│ ├── reasoning-clean.ts # <think> block stripper for fetch
|
|
26
|
-
│ ├── key-rotation.ts # API key rotation for fetch
|
|
27
|
-
│ ├── compaction.mjs # Compaction threshold
|
|
28
|
-
│ ├── commands.ts # Slash command parser (pure)
|
|
29
|
-
│ ├── commands-impl.ts # Slash command executor
|
|
30
|
-
│ ├── logger.ts # Logger interface
|
|
31
|
-
│ ├── hooks/
|
|
32
|
-
│ │ ├── memory-inject.ts # beforeModel hook
|
|
33
|
-
│ │ ├── memory-write-on-end.ts # onEvent hook (session.idle/error)
|
|
34
|
-
│ │ ├── skill-curator.ts # Closed learning loop (v6.0.0)
|
|
35
|
-
│ │ └── memory-flush-on-compact.ts # Pre-compact snapshot (v6.0.0)
|
|
36
|
-
│ └── tools/ # 19 tools
|
|
37
|
-
│ ├── bg-collect.ts
|
|
38
|
-
│ ├── bg-get-comments.ts
|
|
39
|
-
│ ├── bg-kill.ts
|
|
40
|
-
│ ├── bg-pause.ts
|
|
41
|
-
│ ├── bg-report-progress.ts
|
|
42
|
-
│ ├── bg-resume.ts
|
|
43
|
-
│ ├── bg-send-message.ts
|
|
44
|
-
│ ├── bg-spawn.ts
|
|
45
|
-
│ ├── bg-status.ts
|
|
46
|
-
│ ├── memory-list.ts
|
|
47
|
-
│ ├── memory-read.ts
|
|
48
|
-
│ ├── memory-search.ts
|
|
49
|
-
│ ├── memory-write.ts
|
|
50
|
-
│ ├── open-kb.ts
|
|
51
|
-
│ ├── plan-action.ts
|
|
52
|
-
│ ├── read-glyph-feedback.ts
|
|
53
|
-
│ ├── team-spawn.ts
|
|
54
|
-
│ ├── team-status.ts
|
|
55
|
-
│ ├── wait-for-feedback.ts
|
|
56
|
-
│ ├── graph-query.ts # Knowledge graph (v6.0.0)
|
|
57
|
-
│ ├── graph-path.ts # Shortest path (v6.0.0)
|
|
58
|
-
│ └── graph-explain.ts # Node summary (v6.0.0)
|
|
59
|
-
└── tests/ # bun:test (45 files)
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## Public contract
|
|
63
|
-
|
|
64
|
-
```ts
|
|
65
|
-
const plugin: AgentPlugin = {
|
|
66
|
-
name: "bizar",
|
|
67
|
-
manifest: { capabilities: ["tools", "hooks"] },
|
|
68
|
-
hooks: {...}, // computed from runtimeCtx
|
|
69
|
-
async setup(api, ctx) {
|
|
70
|
-
const { runtimeCtx, tools } = await initRuntime(api, ctx);
|
|
71
|
-
for (const t of tools) api.registerTool(t);
|
|
72
|
-
},
|
|
73
|
-
};
|
|
74
|
-
export default plugin;
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
## Tools (19 total)
|
|
78
|
-
|
|
79
|
-
| Category | Count | Tools |
|
|
80
|
-
| --- | --- | --- |
|
|
81
|
-
| **Background agents** | 9 | `bizar_spawn_background`, `bizar_status`, `bizar_collect`, `bizar_kill`, `bizar_pause`, `bizar_resume`, `bizar_send_message`, `bizar_get_comments`, `bizar_report_progress` |
|
|
82
|
-
| **Memory** | 4 | `bizar_memory_list`, `bizar_memory_read`, `bizar_memory_write`, `bizar_memory_search` |
|
|
83
|
-
| **Plan / Glyphs** | 4 | `bizar_plan_action`, `bizar_open_kb`, `bizar_wait_for_feedback`, `bizar_read_glyph_feedback` |
|
|
84
|
-
| **Cline agent teams** | 2 | `bizar_spawn_team`, `bizar_team_status` |
|
|
85
|
-
| **Knowledge graph** | 3 | `bizar_graph_query`, `bizar_graph_path`, `bizar_graph_explain` |
|
|
86
|
-
| **Total** | **22** | (19 + 3 graph) |
|
|
87
|
-
|
|
88
|
-
> Note: 19 was the count before v6.0.0 added the 3 graph tools.
|
|
89
|
-
> Current total: **22 tools**.
|
|
90
|
-
|
|
91
|
-
## Hooks (4 + 2 safety)
|
|
92
|
-
|
|
93
|
-
| Hook | Purpose |
|
|
94
|
-
| --- | --- |
|
|
95
|
-
| `beforeTool` | Loop guard + DANGEROUS_PATTERNS gate |
|
|
96
|
-
| `afterTool` | Per-tool-call log to `LogWriter` |
|
|
97
|
-
| `beforeModel` | Pre-compaction memory flush (writes snapshot to vault) |
|
|
98
|
-
| `onEvent` | `message-added` (slash commands) + `run-finished`/`run-failed` (memory write) |
|
|
99
|
-
|
|
100
|
-
| Safety hook | Purpose |
|
|
101
|
-
| --- | --- |
|
|
102
|
-
| `skill-curator` (manual) | Reports skill usage + flags revisions |
|
|
103
|
-
| `memory-flush-on-compact` (auto) | Writes snapshot to vault when `shouldCompact()` returns true |
|
|
104
|
-
|
|
105
|
-
## State flow
|
|
106
|
-
|
|
107
|
-
1. `setup()` builds the runtime context (logger, env flags,
|
|
108
|
-
stores).
|
|
109
|
-
2. Brings up `ClineRuntime` (best-effort; team tools only if
|
|
110
|
-
it works).
|
|
111
|
-
3. Brings up `InstanceManager` in bg-only mode (no HTTP).
|
|
112
|
-
4. Builds 22 tools via `buildTools(runtimeCtx, instanceManager,
|
|
113
|
-
clineRuntime)`.
|
|
114
|
-
5. Each tool uses
|
|
115
|
-
`createTool({ name, description, inputSchema: z.object({...}).shape, execute })`.
|
|
116
|
-
6. Hooks are computed lazily from the runtime context.
|
|
117
|
-
|
|
118
|
-
## Key invariants
|
|
119
|
-
|
|
120
|
-
- **Plugin must NOT import from `bizar-dash/`** (Layer 1).
|
|
121
|
-
- **Memory tools MUST use the in-process vault** (no HTTP).
|
|
122
|
-
- **Tools MUST use `createTool`** (no manual `AgentTool` shapes).
|
|
123
|
-
- **ClineRuntime MUST be used** (no `cline serve` subprocess).
|
|
124
|
-
- **All tool calls MUST pass `checkDangerous()`** in `beforeTool`.
|
|
125
|
-
- **Compaction MUST trigger a flush** in `beforeModel`.
|
|
126
|
-
|
|
127
|
-
## Verification
|
|
128
|
-
|
|
129
|
-
- `make check` — TS compile + tests
|
|
130
|
-
- `make e2e` — real plugin load + 27 tool/hook checks
|
|
131
|
-
- `make check-arch` — arch-rules.json enforcement (7 rules)
|
|
132
|
-
- `make clean-check` — 5-dimension clean-state check
|
|
133
|
-
|
|
134
|
-
## See also
|
|
135
|
-
|
|
136
|
-
- [plugins/bizar/CONSTRAINTS.md](CONSTRAINTS.md) — module hard rules
|
|
137
|
-
- [docs/architecture.md](../docs/architecture.md) — layer model
|
|
138
|
-
- [docs/safety.md](../docs/safety.md) — DANGEROUS_PATTERNS reference
|
|
139
|
-
- [docs/curator.md](../docs/curator.md) — Skill curator
|
|
140
|
-
- [docs/graph-tools.md](../docs/graph-tools.md) — Graph tools
|
|
141
|
-
- [docs/decisions/DEC-001-cline-rewrite.md](../docs/decisions/DEC-001-cline-rewrite.md)
|
|
142
|
-
— the OpenCode → Cline rewrite
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
# plugins/bizar/ — Hard Rules
|
|
2
|
-
|
|
3
|
-
> Module-specific hard rules. These complement the root
|
|
4
|
-
> [AGENTS.md](../../AGENTS.md) constraints. Violations break the
|
|
5
|
-
> plugin's portability or safety guarantees.
|
|
6
|
-
|
|
7
|
-
## Hard rules
|
|
8
|
-
|
|
9
|
-
- **MUST** use `createTool` from `@cline/sdk` for every tool.
|
|
10
|
-
# why: Ensures the `AgentTool` shape is correct and the host can
|
|
11
|
-
# validate the inputSchema.
|
|
12
|
-
- **MUST** use the in-process `ClineRuntime` (no `cline serve` subprocess).
|
|
13
|
-
# why: The subprocess hangs in headless test environments.
|
|
14
|
-
- **MUST** use the in-process `memory-vault.ts` for memory operations.
|
|
15
|
-
# why: The plugin must work without the dashboard.
|
|
16
|
-
- **MUST** run the `InstanceManager` in bg-only mode (http=null).
|
|
17
|
-
# why: No HTTP server means no background-agent controls via HTTP.
|
|
18
|
-
# The dashboard owns the actual Cline session lifecycle.
|
|
19
|
-
- **MUST NOT** import from `bizar-dash/`.
|
|
20
|
-
# why: Cross-layer violation. Use `@cline/sdk` or `packages/sdk/`.
|
|
21
|
-
- **MUST NOT** use `fetch('http://127.0.0.1:...')` for memory.
|
|
22
|
-
# why: The plugin must work in-process without a dashboard.
|
|
23
|
-
- **MUST NOT** return `{ output: JSON.stringify(...) }` from tool `execute()`.
|
|
24
|
-
# why: Use the structured `AgentToolResult` shape (`{ ok, ... }`).
|
|
25
|
-
- **MUST NOT** hand-roll `AgentTool` shapes (use `createTool`).
|
|
26
|
-
# why: Hand-rolled tools drift from the Cline contract.
|
|
27
|
-
- **MUST** pass every tool call through `checkDangerous()` in `beforeTool`.
|
|
28
|
-
# why: 36 dangerous patterns must be checked before the call
|
|
29
|
-
# reaches the host. Deny decisions stop the call.
|
|
30
|
-
- **MUST** call `createMemoryFlushOnCompact().maybeFlush()` in
|
|
31
|
-
`beforeModel` when usage crosses the compaction threshold.
|
|
32
|
-
# why: Compaction drops context before persistence; the flush
|
|
33
|
-
# writes a durable snapshot first.
|
|
34
|
-
- **MUST NOT** spawn subagents with `rm -rf`, `sudo`, SSRF, or
|
|
35
|
-
prompt-injection content. (Enforced by `checkDangerous()`.)
|
|
36
|
-
# why: Defense in depth — even legitimate agents sometimes
|
|
37
|
-
# generate bad tool calls.
|
|
38
|
-
|
|
39
|
-
## Soft rules
|
|
40
|
-
|
|
41
|
-
- Prefer `bun:test` over `vitest` for new tests.
|
|
42
|
-
- Prefer `Bun.file().text()` over `fs.readFileSync` for async reads.
|
|
43
|
-
- Use `logger.debug()` not `console.debug()`.
|
|
44
|
-
- Use `process.env.BIZAR_*` for environment-driven config.
|
|
45
|
-
- The plugin's `setup()` should not block. Use `try/catch` for
|
|
46
|
-
ClineRuntime setup; fall back gracefully.
|
|
47
|
-
|
|
48
|
-
## Anti-patterns
|
|
49
|
-
|
|
50
|
-
- ❌ Adding new tool types via the old OpenCode `tool()` factory
|
|
51
|
-
→ Use `createTool()`.
|
|
52
|
-
- ❌ Putting state in the plugin entry's module scope
|
|
53
|
-
→ Use `ctx.stateStore` for per-session state.
|
|
54
|
-
- ❌ Calling `process.exit()` from a hook
|
|
55
|
-
→ Return `{ stop: true, reason: '...' }` to the host.
|
|
56
|
-
- ❌ Spawning long-lived side effects in `beforeTool`
|
|
57
|
-
→ Use the `afterTool` hook for post-call actions.
|
|
58
|
-
- ❌ Skipping `checkDangerous()` for "trusted" tools
|
|
59
|
-
→ All tool calls go through the gate, no exceptions.
|
|
60
|
-
|
|
61
|
-
## When in doubt
|
|
62
|
-
|
|
63
|
-
1. Read [docs/architecture.md](../../docs/architecture.md) for the layer model.
|
|
64
|
-
2. Check [.harness/arch-rules.json](../../.harness/arch-rules.json) for enforced rules.
|
|
65
|
-
3. Run `make check-arch` before committing.
|
|
66
|
-
4. Read [docs/decisions/DEC-007-tool-approval-gate.md](../../docs/decisions/DEC-007-tool-approval-gate.md)
|
|
67
|
-
for the safety gate.
|
package/plugins/bizar/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 DrB0rk
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|