@polderlabs/bizar 3.23.1 → 4.2.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/README.md +83 -16
- package/bizar-dash/.bizar/activity.log +3 -0
- package/bizar-dash/.bizar/graph/.graphify_analysis.json +1540 -0
- package/bizar-dash/.bizar/graph/.graphify_labels.json +1 -0
- package/bizar-dash/.bizar/graph/GRAPH_REPORT.md +404 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/0661b816358db84dfdb7f10443db8a61152fd20b3fee950caf8fbf32920a1790.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/16da06d774142a6e5d74829ad982531286a6193ef798de8f593db029e123ec32.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/27e5697c01254c69c64c5a33896669073b40afb5ba88375102ae77fa5404136d.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/532997898027254aa4c0932243dc71d2f55888181232b65974961934997dc85b.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/84e3451a64c7f99f0cd6a88b0748d7426780486f53ab4935b7476b28c08f8293.json +1 -0
- package/bizar-dash/.bizar/graph/cache/ast/v0.8.46/88e5ea5f3e78fa69353fe9e6a8d1a05391d54605e25600cb125531eb5a6432ff.json +1 -0
- package/bizar-dash/.bizar/graph/cache/stat-index.json +1 -0
- package/bizar-dash/.bizar/graph/graph.html +307 -0
- package/bizar-dash/.bizar/graph/graph.json +40267 -0
- package/bizar-dash/.bizar/graph/manifest.json +762 -0
- package/bizar-dash/.graphifyignore +40 -0
- package/bizar-dash/.obsidian/README.md +14 -0
- package/bizar-dash/.obsidian/daily/2026-06-25.md +9 -0
- package/bizar-dash/.obsidian/vault.json +7 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/SKILL.md +103 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/assets/template.html +338 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/example.html +81 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/open-design.json +172 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/references/checklist.md +44 -0
- package/bizar-dash/.od-skills/web-prototype-e1429c1737/references/layouts.md +247 -0
- package/bizar-dash/CHANGELOG.md +474 -0
- package/bizar-dash/DESIGN.md +136 -0
- package/bizar-dash/dist/assets/main-B3RgW6FS.js +331 -0
- package/bizar-dash/dist/assets/main-B3RgW6FS.js.map +1 -0
- package/bizar-dash/dist/assets/main-DlJ8wgLR.css +1 -0
- package/bizar-dash/dist/assets/mobile-CsZQAswA.css +1 -0
- package/bizar-dash/dist/assets/mobile-DbxIw8BG.js +2 -0
- package/bizar-dash/dist/assets/mobile-DbxIw8BG.js.map +1 -0
- package/bizar-dash/dist/assets/mobile-Dvq2d53Y.js +354 -0
- package/bizar-dash/dist/assets/mobile-Dvq2d53Y.js.map +1 -0
- package/bizar-dash/dist/index.html +40 -0
- package/bizar-dash/dist/mobile.html +22 -0
- package/bizar-dash/plans/debug-plan/comments.json +1 -0
- package/bizar-dash/plans/debug-plan/meta.json +10 -0
- package/bizar-dash/plans/debug-plan/plan.json +174 -0
- package/bizar-dash/scripts/smoke-bg-retry.mjs +246 -0
- package/bizar-dash/src/cli/dashboard-ports.mjs +488 -0
- package/bizar-dash/src/cli.mjs +522 -0
- package/bizar-dash/src/server/activity-log.mjs +174 -0
- package/bizar-dash/src/server/agents-store.mjs +465 -0
- package/bizar-dash/src/server/api.mjs +138 -0
- package/bizar-dash/src/server/artifact-template.html +810 -0
- package/bizar-dash/src/server/artifacts-store.mjs +733 -0
- package/bizar-dash/src/server/auth.mjs +381 -0
- package/bizar-dash/src/server/background-store.mjs +447 -0
- package/bizar-dash/src/server/bg-poller.mjs +305 -0
- package/bizar-dash/src/server/bg-retry.mjs +574 -0
- package/bizar-dash/src/server/browser.mjs +40 -0
- package/bizar-dash/src/server/diagnostics-store.mjs +148 -0
- package/bizar-dash/src/server/dialog-poller.mjs +105 -0
- package/bizar-dash/src/server/dialog-store.mjs +177 -0
- package/bizar-dash/src/server/glyphs/mdx-compiler.mjs +583 -0
- package/bizar-dash/src/server/lib/path-safe.mjs +283 -0
- package/bizar-dash/src/server/memory-git.mjs +329 -0
- package/bizar-dash/src/server/memory-lightrag.mjs +767 -0
- package/bizar-dash/src/server/memory-schema.mjs +145 -0
- package/bizar-dash/src/server/memory-secrets.mjs +84 -0
- package/bizar-dash/src/server/memory-store.mjs +471 -0
- package/bizar-dash/src/server/mod-security.mjs +398 -0
- package/bizar-dash/src/server/mods-loader.mjs +1067 -0
- package/bizar-dash/src/server/notifications-store.mjs +243 -0
- package/bizar-dash/src/server/obsidian-store.mjs +318 -0
- package/bizar-dash/src/server/opencode-runner.mjs +279 -0
- package/bizar-dash/src/server/pair-store.mjs +138 -0
- package/bizar-dash/src/server/projects-store.mjs +364 -0
- package/bizar-dash/src/server/providers-store.mjs +789 -0
- package/bizar-dash/src/server/routes/_shared.mjs +415 -0
- package/bizar-dash/src/server/routes/activity.mjs +110 -0
- package/bizar-dash/src/server/routes/agents.mjs +134 -0
- package/bizar-dash/src/server/routes/artifacts.mjs +279 -0
- package/bizar-dash/src/server/routes/auth.mjs +69 -0
- package/bizar-dash/src/server/routes/background.mjs +165 -0
- package/bizar-dash/src/server/routes/chat.mjs +485 -0
- package/bizar-dash/src/server/routes/config.mjs +129 -0
- package/bizar-dash/src/server/routes/diagnostics.mjs +50 -0
- package/bizar-dash/src/server/routes/dialogs.mjs +86 -0
- package/bizar-dash/src/server/routes/fs.mjs +429 -0
- package/bizar-dash/src/server/routes/history.mjs +78 -0
- package/bizar-dash/src/server/routes/memory.mjs +658 -0
- package/bizar-dash/src/server/routes/misc.mjs +89 -0
- package/bizar-dash/src/server/routes/mods.mjs +359 -0
- package/bizar-dash/src/server/routes/notifications.mjs +54 -0
- package/bizar-dash/src/server/routes/obsidian.mjs +239 -0
- package/bizar-dash/src/server/routes/opencode-sessions.mjs +55 -0
- package/bizar-dash/src/server/routes/overview.mjs +91 -0
- package/bizar-dash/src/server/routes/pair.mjs +67 -0
- package/bizar-dash/src/server/routes/projects.mjs +175 -0
- package/bizar-dash/src/server/routes/providers.mjs +47 -0
- package/bizar-dash/src/server/routes/schedules.mjs +104 -0
- package/bizar-dash/src/server/routes/settings.mjs +51 -0
- package/bizar-dash/src/server/routes/skills.mjs +76 -0
- package/bizar-dash/src/server/routes/tasks.mjs +468 -0
- package/bizar-dash/src/server/routes/themes.mjs +51 -0
- package/bizar-dash/src/server/routes-v2/auth.mjs +59 -0
- package/bizar-dash/src/server/routes-v2/events.mjs +107 -0
- package/bizar-dash/src/server/routes-v2/health.mjs +21 -0
- package/bizar-dash/src/server/routes-v2/index.mjs +90 -0
- package/bizar-dash/src/server/routes-v2/sessions.mjs +111 -0
- package/bizar-dash/src/server/schedules-runner.mjs +369 -0
- package/bizar-dash/src/server/schedules-store.mjs +268 -0
- package/bizar-dash/src/server/search-store.mjs +220 -0
- package/bizar-dash/src/server/serve-info.mjs +684 -0
- package/bizar-dash/src/server/server.mjs +796 -0
- package/bizar-dash/src/server/settings-store.mjs +45 -0
- package/bizar-dash/src/server/skills-store.mjs +300 -0
- package/bizar-dash/src/server/state.mjs +437 -0
- package/bizar-dash/src/server/tailscale-store.mjs +113 -0
- package/bizar-dash/src/server/task-delegator.mjs +824 -0
- package/bizar-dash/src/server/tasks-store.mjs +508 -0
- package/bizar-dash/src/server/tui.mjs +923 -0
- package/bizar-dash/src/server/update-store.mjs +168 -0
- package/bizar-dash/src/server/v2-auth-file.mjs +99 -0
- package/bizar-dash/src/server/v2-event-bus.mjs +128 -0
- package/bizar-dash/src/server/watcher.mjs +81 -0
- package/bizar-dash/src/server/yaml.mjs +238 -0
- package/bizar-dash/src/web/App.tsx +718 -0
- package/bizar-dash/src/web/MobileApp.tsx +408 -0
- package/bizar-dash/src/web/components/ArtifactCreateDialog.tsx +95 -0
- package/bizar-dash/src/web/components/ArtifactListDialog.tsx +55 -0
- package/bizar-dash/src/web/components/ArtifactViewer.tsx +143 -0
- package/bizar-dash/src/web/components/AuditDialog.tsx +79 -0
- package/bizar-dash/src/web/components/BgStatusBadge.tsx +32 -0
- package/bizar-dash/src/web/components/Button.tsx +56 -0
- package/bizar-dash/src/web/components/CanvasContextMenu.tsx +68 -0
- package/bizar-dash/src/web/components/Card.tsx +40 -0
- package/bizar-dash/src/web/components/CollapsibleSection.tsx +72 -0
- package/bizar-dash/src/web/components/CommandDialog.tsx +66 -0
- package/bizar-dash/src/web/components/EmptyState.tsx +30 -0
- package/bizar-dash/src/web/components/FileBrowser.tsx +633 -0
- package/bizar-dash/src/web/components/HelpDialog.tsx +55 -0
- package/bizar-dash/src/web/components/KillConfirmDialog.tsx +88 -0
- package/bizar-dash/src/web/components/Modal.tsx +215 -0
- package/bizar-dash/src/web/components/Notifications.tsx +241 -0
- package/bizar-dash/src/web/components/SearchModal.tsx +224 -0
- package/bizar-dash/src/web/components/Sidebar.tsx +66 -0
- package/bizar-dash/src/web/components/Spinner.tsx +19 -0
- package/bizar-dash/src/web/components/StatusBadge.tsx +25 -0
- package/bizar-dash/src/web/components/Tag.tsx +28 -0
- package/bizar-dash/src/web/components/Toast.tsx +150 -0
- package/bizar-dash/src/web/components/Topbar.tsx +368 -0
- package/bizar-dash/src/web/components/VisualPlanDialog.tsx +58 -0
- package/bizar-dash/src/web/components/chat/AgentChip.tsx +68 -0
- package/bizar-dash/src/web/components/chat/ChatBubble.tsx +60 -0
- package/bizar-dash/src/web/components/chat/ChatThread.tsx +88 -0
- package/bizar-dash/src/web/components/chat/ChatTopBar.tsx +50 -0
- package/bizar-dash/src/web/components/chat/Composer.tsx +164 -0
- package/bizar-dash/src/web/components/chat/ConfirmModal.tsx +54 -0
- package/bizar-dash/src/web/components/chat/EmptyState.tsx +21 -0
- package/bizar-dash/src/web/components/chat/FirstRunGreeting.tsx +18 -0
- package/bizar-dash/src/web/components/chat/FloatingComposer.tsx +32 -0
- package/bizar-dash/src/web/components/chat/InfoPanel.tsx +119 -0
- package/bizar-dash/src/web/components/chat/LoadingSkeleton.tsx +19 -0
- package/bizar-dash/src/web/components/chat/MessageBubble.tsx +60 -0
- package/bizar-dash/src/web/components/chat/SessionList.tsx +153 -0
- package/bizar-dash/src/web/components/chat/StreamingIndicator.tsx +9 -0
- package/bizar-dash/src/web/components/chat/SuggestionCards.tsx +55 -0
- package/bizar-dash/src/web/components/chat/WelcomeScreen.tsx +36 -0
- package/bizar-dash/src/web/components/chat/index.ts +20 -0
- package/bizar-dash/src/web/components/chat/useAutoGrowTextarea.ts +18 -0
- package/bizar-dash/src/web/components/chat/useChat.ts +219 -0
- package/bizar-dash/src/web/components/chat/useSlashCommands.ts +47 -0
- package/bizar-dash/src/web/index.html +37 -0
- package/bizar-dash/src/web/lib/api.ts +193 -0
- package/bizar-dash/src/web/lib/markdown.tsx +59 -0
- package/bizar-dash/src/web/lib/types.ts +668 -0
- package/bizar-dash/src/web/lib/utils.ts +114 -0
- package/bizar-dash/src/web/lib/ws.ts +176 -0
- package/bizar-dash/src/web/main.tsx +34 -0
- package/bizar-dash/src/web/mobile/MobileApp.tsx +278 -0
- package/bizar-dash/src/web/mobile/MobileBottomNav.tsx +38 -0
- package/bizar-dash/src/web/mobile/MobileTopbar.tsx +115 -0
- package/bizar-dash/src/web/mobile/components/MobileBottomSheet.tsx +182 -0
- package/bizar-dash/src/web/mobile/components/MobileListItem.tsx +64 -0
- package/bizar-dash/src/web/mobile/components/MobileModal.tsx +123 -0
- package/bizar-dash/src/web/mobile/views/MobileActivity.tsx +273 -0
- package/bizar-dash/src/web/mobile/views/MobileAgents.tsx +374 -0
- package/bizar-dash/src/web/mobile/views/MobileArtifactCanvas.tsx +439 -0
- package/bizar-dash/src/web/mobile/views/MobileArtifacts.tsx +143 -0
- package/bizar-dash/src/web/mobile/views/MobileChat.tsx +180 -0
- package/bizar-dash/src/web/mobile/views/MobileConfig.tsx +175 -0
- package/bizar-dash/src/web/mobile/views/MobileHistory.tsx +191 -0
- package/bizar-dash/src/web/mobile/views/MobileMods.tsx +149 -0
- package/bizar-dash/src/web/mobile/views/MobileMore.tsx +121 -0
- package/bizar-dash/src/web/mobile/views/MobileNotifications.tsx +137 -0
- package/bizar-dash/src/web/mobile/views/MobilePlans.tsx +26 -0
- package/bizar-dash/src/web/mobile/views/MobileSchedules.tsx +685 -0
- package/bizar-dash/src/web/mobile/views/MobileSearchModal.tsx +172 -0
- package/bizar-dash/src/web/mobile/views/MobileSettings.tsx +388 -0
- package/bizar-dash/src/web/mobile/views/MobileSkills.tsx +153 -0
- package/bizar-dash/src/web/mobile/views/MobileTasks.tsx +564 -0
- package/bizar-dash/src/web/mobile.html +20 -0
- package/bizar-dash/src/web/mobile.tsx +13 -0
- package/bizar-dash/src/web/styles/chat.css +198 -0
- package/bizar-dash/src/web/styles/glyphs.css +960 -0
- package/bizar-dash/src/web/styles/main.css +8855 -0
- package/bizar-dash/src/web/styles/mobile-chat.css +5 -0
- package/bizar-dash/src/web/styles/mobile.css +1960 -0
- package/bizar-dash/src/web/views/Activity.tsx +1203 -0
- package/bizar-dash/src/web/views/Agents.tsx +701 -0
- package/bizar-dash/src/web/views/Artifacts.tsx +1480 -0
- package/bizar-dash/src/web/views/BackgroundAgents.tsx +450 -0
- package/bizar-dash/src/web/views/Chat.tsx +190 -0
- package/bizar-dash/src/web/views/Config.tsx +2063 -0
- package/bizar-dash/src/web/views/History.tsx +335 -0
- package/bizar-dash/src/web/views/ModView.tsx +207 -0
- package/bizar-dash/src/web/views/Mods.tsx +693 -0
- package/bizar-dash/src/web/views/Overview.tsx +812 -0
- package/bizar-dash/src/web/views/Providers.tsx +302 -0
- package/bizar-dash/src/web/views/Schedules.tsx +802 -0
- package/bizar-dash/src/web/views/Settings.tsx +1787 -0
- package/bizar-dash/src/web/views/Skills.tsx +431 -0
- package/bizar-dash/src/web/views/Tasks.tsx +1523 -0
- package/bizar-dash/src/web/views/glyphs/GlyphRenderer.tsx +613 -0
- package/bizar-dash/src/web/views/glyphs/components.tsx +1098 -0
- package/bizar-dash/templates/mod/FORMAT.md +76 -0
- package/bizar-dash/templates/mod/hello-mod/README.md +19 -0
- package/bizar-dash/templates/mod/hello-mod/agents/greeter.md +8 -0
- package/bizar-dash/templates/mod/hello-mod/commands/hello.md +6 -0
- package/bizar-dash/templates/mod/hello-mod/mod.json +20 -0
- package/bizar-dash/templates/mod/hello-mod/routes/ping.mjs +9 -0
- package/bizar-dash/templates/mod/hello-mod/views/HelloView.tsx +10 -0
- package/bizar-dash/tests/dashboard-ports.test.mjs +138 -0
- package/bizar-dash/tests/graphify-mod-spawn.node.test.mjs +90 -0
- package/bizar-dash/tests/memory-cli.test.mjs +542 -0
- package/bizar-dash/tests/memory-config.test.mjs +422 -0
- package/bizar-dash/tests/memory-git.test.mjs +246 -0
- package/bizar-dash/tests/memory-lightrag.test.mjs +153 -0
- package/bizar-dash/tests/memory-protocol-drift.test.mjs +45 -0
- package/bizar-dash/tests/memory-schema.test.mjs +198 -0
- package/bizar-dash/tests/memory-secrets.test.mjs +121 -0
- package/bizar-dash/tests/memory-store.test.mjs +390 -0
- package/bizar-dash/tests/memory-sync.test.mjs +141 -0
- package/bizar-dash/tests/mod-instructions.node.test.mjs +188 -0
- package/bizar-dash/tests/mod-security.test.mjs +273 -0
- package/bizar-dash/tests/mod-upgrade.node.test.mjs +357 -0
- package/bizar-dash/tests/no-agent-browser.node.test.mjs +98 -0
- package/bizar-dash/tests/obsidian-back-compat.test.mjs +199 -0
- package/bizar-dash/tests/opencode-runner.test.mjs +172 -0
- package/bizar-dash/tests/path-safe.test.mjs +108 -0
- package/bizar-dash/tests/providers-store-backup-keys.node.test.mjs +333 -0
- package/bizar-dash/tests/smoke-v2.mjs +212 -0
- package/bizar-dash/tests/strip-thinking.test.mjs +175 -0
- package/bizar-dash/tests/submit-feedback.test.mjs +353 -0
- package/bizar-dash/tests/tmux-wrap.test.mjs +145 -0
- package/bizar-dash/tests/yaml.test.mjs +128 -0
- package/bizar-dash/tsconfig.json +23 -0
- package/bizar-dash/vite.config.ts +27 -0
- package/cli/atomic.mjs +73 -0
- package/cli/banner.mjs +1 -1
- package/cli/bin.mjs +44 -47
- package/cli/bootstrap.mjs +1 -1
- package/cli/copy.mjs +25 -16
- package/cli/dev-link.mjs +17 -1
- package/cli/doctor.mjs +4 -4
- package/cli/doctor.test.mjs +2 -2
- package/cli/init.mjs +135 -1
- package/cli/install.mjs +31 -39
- package/cli/memory-constants.mjs +59 -0
- package/cli/memory.mjs +1436 -0
- package/cli/service.mjs +5 -6
- package/cli/utils.mjs +6 -3
- package/config/AGENTS.md +7 -7
- package/config/agents/_shared/AGENT_BASELINE.md +59 -61
- package/config/opencode.json +13 -38
- package/config/skills/memory-protocol/SKILL.md +105 -0
- package/config/skills/obsidian/SKILL.md +270 -65
- package/install.sh +59 -19
- package/package.json +49 -14
- package/packages/sdk/LICENSE +21 -0
- package/packages/sdk/README.md +80 -0
- package/packages/sdk/src/client.ts +183 -0
- package/packages/sdk/src/errors.ts +120 -0
- package/packages/sdk/src/events.ts +153 -0
- package/packages/sdk/src/index.ts +63 -0
- package/packages/sdk/src/types.ts +176 -0
- package/packages/sdk/src/version.ts +4 -0
- package/packages/sdk/tests/client.test.ts +217 -0
- package/packages/sdk/tests/errors.test.ts +108 -0
- package/packages/sdk/tests/events.test.ts +139 -0
- package/packages/sdk/tests/fixtures/fetch-mock.ts +152 -0
- package/packages/sdk/tests/fixtures/sse-mock.ts +30 -0
- package/packages/sdk/tsconfig.json +25 -0
- package/packages/sdk/vitest.config.ts +9 -0
- package/plugins/bizar/LICENSE +21 -0
- package/plugins/bizar/README.md +448 -0
- package/plugins/bizar/dist/index.js +29901 -0
- package/plugins/bizar/index.ts +1491 -0
- package/plugins/bizar/scripts/check-forbidden-imports.sh +33 -0
- package/plugins/bizar/src/background-state.ts +551 -0
- package/plugins/bizar/src/background.ts +1250 -0
- package/plugins/bizar/src/commands-impl.ts +464 -0
- package/plugins/bizar/src/commands.ts +1168 -0
- package/plugins/bizar/src/dashboard-client.ts +233 -0
- package/plugins/bizar/src/event-stream.ts +606 -0
- package/plugins/bizar/src/fingerprint.ts +120 -0
- package/plugins/bizar/src/handoff.ts +79 -0
- package/plugins/bizar/src/http-client.ts +467 -0
- package/plugins/bizar/src/key-rotation.ts +218 -0
- package/plugins/bizar/src/logger.ts +144 -0
- package/plugins/bizar/src/loop.ts +176 -0
- package/plugins/bizar/src/opencode-runner.ts +390 -0
- package/plugins/bizar/src/options.ts +421 -0
- package/plugins/bizar/src/plan-fs.ts +323 -0
- package/plugins/bizar/src/reasoning-clean.ts +454 -0
- package/plugins/bizar/src/report.ts +178 -0
- package/plugins/bizar/src/research-prompt.ts +35 -0
- package/plugins/bizar/src/serve-info.ts +228 -0
- package/plugins/bizar/src/serve.ts +496 -0
- package/plugins/bizar/src/settings.ts +349 -0
- package/plugins/bizar/src/state.ts +298 -0
- package/plugins/bizar/src/tools/bg-collect.ts +104 -0
- package/plugins/bizar/src/tools/bg-get-comments.ts +239 -0
- package/plugins/bizar/src/tools/bg-kill.ts +87 -0
- package/plugins/bizar/src/tools/bg-spawn.ts +401 -0
- package/plugins/bizar/src/tools/bg-status.ts +99 -0
- package/plugins/bizar/src/tools/open-kb.ts +191 -0
- package/plugins/bizar/src/tools/plan-action.ts +767 -0
- package/plugins/bizar/src/tools/read-glyph-feedback.ts +170 -0
- package/plugins/bizar/src/tools/wait-for-feedback.ts +402 -0
- package/plugins/bizar/tests/attach-handler-bug.test.ts +169 -0
- package/plugins/bizar/tests/background-state.test.ts +277 -0
- package/plugins/bizar/tests/background.test.ts +402 -0
- package/plugins/bizar/tests/block.test.ts +195 -0
- package/plugins/bizar/tests/canonical-key-order.test.ts +75 -0
- package/plugins/bizar/tests/commands-impl.test.ts +442 -0
- package/plugins/bizar/tests/commands.test.ts +584 -0
- package/plugins/bizar/tests/config.test.ts +122 -0
- package/plugins/bizar/tests/dashboard-client.test.ts +159 -0
- package/plugins/bizar/tests/dispose.test.ts +336 -0
- package/plugins/bizar/tests/event-stream.test.ts +409 -0
- package/plugins/bizar/tests/event.test.ts +262 -0
- package/plugins/bizar/tests/fingerprint.test.ts +162 -0
- package/plugins/bizar/tests/http-client.test.ts +404 -0
- package/plugins/bizar/tests/init-helpers.test.ts +203 -0
- package/plugins/bizar/tests/integration/slash-command.test.ts +348 -0
- package/plugins/bizar/tests/integration/tool-routing.test.ts +314 -0
- package/plugins/bizar/tests/key-rotation.test.ts +396 -0
- package/plugins/bizar/tests/loop.test.ts +397 -0
- package/plugins/bizar/tests/options.test.ts +276 -0
- package/plugins/bizar/tests/reasoning-clean.test.ts +422 -0
- package/plugins/bizar/tests/serve.test.ts +339 -0
- package/plugins/bizar/tests/settings.test.ts +351 -0
- package/plugins/bizar/tests/stall-think.test.ts +750 -0
- package/plugins/bizar/tests/state.test.ts +276 -0
- package/plugins/bizar/tests/tools/bg-collect.test.ts +337 -0
- package/plugins/bizar/tests/tools/bg-get-comments.test.ts +485 -0
- package/plugins/bizar/tests/tools/bg-kill.test.ts +235 -0
- package/plugins/bizar/tests/tools/bg-spawn-delegation.test.ts +147 -0
- package/plugins/bizar/tests/tools/bg-spawn.test.ts +311 -0
- package/plugins/bizar/tests/tools/bg-status.test.ts +217 -0
- package/plugins/bizar/tests/tools/opencode-runner.test.ts +115 -0
- package/plugins/bizar/tests/tools/plan-action.test.ts +599 -0
- package/plugins/bizar/tests/tools/read-glyph-feedback.test.ts +253 -0
- package/plugins/bizar/tests/tools/wait-for-feedback.test.ts +390 -0
- package/plugins/bizar/tests/update-deadlock.test.ts +145 -0
- package/plugins/bizar/tsconfig.json +29 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bg-collect.ts
|
|
3
|
+
*
|
|
4
|
+
* `bizar_collect` tool (v0.4.2 spec §7.1, §4.4).
|
|
5
|
+
*
|
|
6
|
+
* Odin-only — only Odin may collect. Blocks until the instance reaches a
|
|
7
|
+
* terminal state or `timeoutMs` elapses. On timeout, returns
|
|
8
|
+
* `status: "running"` with the last known `resultPreview`.
|
|
9
|
+
*
|
|
10
|
+
* Returns:
|
|
11
|
+
* `{ instanceId, status, result, toolCallCount, durationMs, error? }`
|
|
12
|
+
*
|
|
13
|
+
* The `result` field is the concatenated text of all assistant messages
|
|
14
|
+
* (TextPart only). If the instance ended with a threshold-12 loop-guard
|
|
15
|
+
* error, the marker `[loop guard: 12 identical calls to <tool>]` is
|
|
16
|
+
* prepended (MEDIUM-30).
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { tool } from "@opencode-ai/plugin";
|
|
20
|
+
import { z } from "zod";
|
|
21
|
+
|
|
22
|
+
import type { InstanceManager } from "../background.js";
|
|
23
|
+
import type { Logger } from "../logger.js";
|
|
24
|
+
|
|
25
|
+
const TIMEOUT_MIN_MS = 1000;
|
|
26
|
+
const TIMEOUT_MAX_MS = 1_800_000;
|
|
27
|
+
const TIMEOUT_DEFAULT_MS = 60_000;
|
|
28
|
+
|
|
29
|
+
export interface BgCollectDeps {
|
|
30
|
+
instanceManager: InstanceManager;
|
|
31
|
+
logger: Logger;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Build the `bizar_collect` tool.
|
|
36
|
+
*/
|
|
37
|
+
export function createBgCollectTool(deps: BgCollectDeps) {
|
|
38
|
+
return tool({
|
|
39
|
+
description:
|
|
40
|
+
"Wait for a background instance to complete and return its result. " +
|
|
41
|
+
"Only Odin may collect. Blocks until the instance reaches a terminal state or the timeout fires.",
|
|
42
|
+
args: {
|
|
43
|
+
instanceId: z
|
|
44
|
+
.string()
|
|
45
|
+
.min(1)
|
|
46
|
+
.describe("Instance id returned by bizar_spawn_background."),
|
|
47
|
+
timeoutMs: z
|
|
48
|
+
.number()
|
|
49
|
+
.int()
|
|
50
|
+
.positive()
|
|
51
|
+
.optional()
|
|
52
|
+
.describe("Collect-time timeout in ms (1s..30min, default 60s)."),
|
|
53
|
+
},
|
|
54
|
+
execute: async (rawArgs, ctx) => {
|
|
55
|
+
// Odin-only (§6.3).
|
|
56
|
+
if (ctx.agent !== "odin") {
|
|
57
|
+
return {
|
|
58
|
+
output: JSON.stringify({
|
|
59
|
+
error:
|
|
60
|
+
"Only Odin can collect background agent results. Use bizar_status to inspect or ask Odin to collect.",
|
|
61
|
+
}),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const args = rawArgs as { instanceId: string; timeoutMs?: number };
|
|
65
|
+
|
|
66
|
+
// Clamp timeoutMs (MEDIUM-33 / §7.3).
|
|
67
|
+
const requested = args.timeoutMs ?? TIMEOUT_DEFAULT_MS;
|
|
68
|
+
if (requested < TIMEOUT_MIN_MS || requested > TIMEOUT_MAX_MS) {
|
|
69
|
+
return {
|
|
70
|
+
output: JSON.stringify({
|
|
71
|
+
error: `timeoutMs must be between ${TIMEOUT_MIN_MS} (1s) and ${TIMEOUT_MAX_MS} (30min). Got ${requested}.`,
|
|
72
|
+
}),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const timeoutMs = requested;
|
|
76
|
+
|
|
77
|
+
try {
|
|
78
|
+
const result = await deps.instanceManager.collect(args.instanceId, timeoutMs);
|
|
79
|
+
return {
|
|
80
|
+
output: JSON.stringify({
|
|
81
|
+
instanceId: args.instanceId,
|
|
82
|
+
status: result.status,
|
|
83
|
+
result: result.result,
|
|
84
|
+
toolCallCount: result.toolCallCount,
|
|
85
|
+
durationMs: result.durationMs,
|
|
86
|
+
...(result.error !== undefined ? { error: result.error } : {}),
|
|
87
|
+
}),
|
|
88
|
+
};
|
|
89
|
+
} catch (err: unknown) {
|
|
90
|
+
deps.logger.warn(
|
|
91
|
+
`bizar: collect(${args.instanceId}) failed: ${
|
|
92
|
+
err instanceof Error ? err.message : String(err)
|
|
93
|
+
}`,
|
|
94
|
+
);
|
|
95
|
+
return {
|
|
96
|
+
output: JSON.stringify({
|
|
97
|
+
error: `collect failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
98
|
+
instanceId: args.instanceId,
|
|
99
|
+
}),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bg-get-comments.ts
|
|
3
|
+
*
|
|
4
|
+
* `bizar_get_plan_comments` tool — read-only access to the comments on a
|
|
5
|
+
* Bizar Plan canvas.
|
|
6
|
+
*
|
|
7
|
+
* Background agents (Thor, Tyr, Mimir, etc.) call this to pick up user
|
|
8
|
+
* feedback pinned to specific elements they are working on. The tool
|
|
9
|
+
* reads `plans/<slug>/plan.json` from disk and returns the comments
|
|
10
|
+
* array, optionally filtered to a specific element.
|
|
11
|
+
*
|
|
12
|
+
* The schema on disk is the v2 canvas shape:
|
|
13
|
+
*
|
|
14
|
+
* {
|
|
15
|
+
* schemaVersion: 2,
|
|
16
|
+
* title: "...",
|
|
17
|
+
* elements: [...],
|
|
18
|
+
* connections: [...],
|
|
19
|
+
* comments: [
|
|
20
|
+
* {
|
|
21
|
+
* id: "c_xxx",
|
|
22
|
+
* x: 100, y: 200,
|
|
23
|
+
* elementId: "el_yyy" | null,
|
|
24
|
+
* author: "DrB0rk",
|
|
25
|
+
* text: "Make this button bigger",
|
|
26
|
+
* created: "2026-06-18T...",
|
|
27
|
+
* thread: [
|
|
28
|
+
* { id: "r_xxx", author: "ai", text: "Done", created: "..." }
|
|
29
|
+
* ]
|
|
30
|
+
* }
|
|
31
|
+
* ],
|
|
32
|
+
* viewport: { x, y, zoom }
|
|
33
|
+
* }
|
|
34
|
+
*
|
|
35
|
+
* If the file does not exist, has an older shape, or the elementId filter
|
|
36
|
+
* yields zero results, the tool returns an empty array — never an error.
|
|
37
|
+
* This matches the principle that a missing plan is not the agent's
|
|
38
|
+
* problem; it just means "no feedback on file".
|
|
39
|
+
*
|
|
40
|
+
* Returns (on success):
|
|
41
|
+
* `Array<{ id, x, y, elementId, author, text, created, thread: [...] }>`
|
|
42
|
+
*
|
|
43
|
+
* Returns (on error):
|
|
44
|
+
* `{ error: string, planSlug: string }`
|
|
45
|
+
*
|
|
46
|
+
* Read-only — available to ALL agents (Vör, Frigg, Mimir, Odin, Thor,
|
|
47
|
+
* Tyr, Heimdall, etc.). The function is pure: no side effects, no
|
|
48
|
+
* network calls, no process spawning.
|
|
49
|
+
*
|
|
50
|
+
* The "worktree" passed in via deps is the directory the plugin was
|
|
51
|
+
* loaded for; `plans/` lives at the root of the project.
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
import { tool } from "@opencode-ai/plugin";
|
|
55
|
+
import { z } from "zod";
|
|
56
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
57
|
+
import { join } from "node:path";
|
|
58
|
+
|
|
59
|
+
import type { Logger } from "../logger.js";
|
|
60
|
+
|
|
61
|
+
export interface BgGetCommentsDeps {
|
|
62
|
+
/** The project's working directory (e.g. /home/user/proj). `plans/` is here. */
|
|
63
|
+
worktree: string;
|
|
64
|
+
logger: Logger;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// --- On-disk shapes ---------------------------------------------------------
|
|
68
|
+
|
|
69
|
+
/** A single thread reply on a canvas comment. */
|
|
70
|
+
interface PlanCommentReply {
|
|
71
|
+
id?: string;
|
|
72
|
+
author?: string;
|
|
73
|
+
text?: string;
|
|
74
|
+
created?: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** A single canvas comment as stored in plan.json. */
|
|
78
|
+
interface PlanComment {
|
|
79
|
+
id: string;
|
|
80
|
+
x?: number;
|
|
81
|
+
y?: number;
|
|
82
|
+
elementId?: string | null;
|
|
83
|
+
author?: string;
|
|
84
|
+
text?: string;
|
|
85
|
+
created?: string;
|
|
86
|
+
thread?: PlanCommentReply[];
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** The minimum subset of plan.json the tool reads. */
|
|
90
|
+
interface PlanCanvasFile {
|
|
91
|
+
schemaVersion?: number;
|
|
92
|
+
title?: string;
|
|
93
|
+
elements?: Array<{ id?: string; title?: string }>;
|
|
94
|
+
connections?: unknown[];
|
|
95
|
+
comments?: PlanComment[];
|
|
96
|
+
viewport?: unknown;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// --- Validation helpers -----------------------------------------------------
|
|
100
|
+
|
|
101
|
+
/** Same slug rule used by `cli/plan.mjs`. Lowercase, hyphens, 1–64 chars. */
|
|
102
|
+
const SLUG_REGEX = /^[a-z0-9][a-z0-9-]{0,63}$/;
|
|
103
|
+
|
|
104
|
+
function isValidSlug(s: string): boolean {
|
|
105
|
+
return SLUG_REGEX.test(s);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// --- Core read function (extracted for testability) --------------------------
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Read the plan.json from disk, parse it, and return the filtered comments.
|
|
112
|
+
*
|
|
113
|
+
* Exported (named) so the test file can drive the same code path the
|
|
114
|
+
* real tool uses, without needing a tool framework.
|
|
115
|
+
*
|
|
116
|
+
* Errors are swallowed and returned as a result — a missing plan should
|
|
117
|
+
* never break an agent session. The only fatal error is "invalid slug",
|
|
118
|
+
* which is a programming error rather than a runtime condition.
|
|
119
|
+
*/
|
|
120
|
+
export function readPlanComments(
|
|
121
|
+
worktree: string,
|
|
122
|
+
planSlug: string,
|
|
123
|
+
elementId: string | undefined,
|
|
124
|
+
): { ok: true; comments: PlanComment[]; planSlug: string } | { ok: false; error: string; planSlug: string } {
|
|
125
|
+
if (!isValidSlug(planSlug)) {
|
|
126
|
+
return { ok: false, error: `Invalid planSlug: "${planSlug}". Must match ^[a-z0-9][a-z0-9-]{0,63}$.`, planSlug };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const planPath = join(worktree, "plans", planSlug, "plan.json");
|
|
130
|
+
if (!existsSync(planPath)) {
|
|
131
|
+
// No plan.json — this is a v1 plan, or the plan was never created.
|
|
132
|
+
// We return an empty array; the agent should treat it as "no feedback".
|
|
133
|
+
return { ok: true, comments: [], planSlug };
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
let parsed: PlanCanvasFile;
|
|
137
|
+
try {
|
|
138
|
+
const raw = readFileSync(planPath, "utf-8");
|
|
139
|
+
parsed = JSON.parse(raw) as PlanCanvasFile;
|
|
140
|
+
} catch (err: unknown) {
|
|
141
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
142
|
+
return { ok: false, error: `Failed to read plan.json: ${msg}`, planSlug };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Guard against the JSON being null or a non-object (e.g. "null" or "[]"
|
|
146
|
+
// at the top level). The v2 schema requires an object; anything else is
|
|
147
|
+
// a programmer error rather than a runtime condition.
|
|
148
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
149
|
+
return {
|
|
150
|
+
ok: false,
|
|
151
|
+
error: `plan.json is not a v2 canvas object (got ${Array.isArray(parsed) ? "array" : typeof parsed})`,
|
|
152
|
+
planSlug,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const all = Array.isArray(parsed.comments) ? parsed.comments : [];
|
|
157
|
+
|
|
158
|
+
// Filter by elementId if requested. Note: we keep elementId === null
|
|
159
|
+
// (canvas-pinned, no element) separate from elementId === undefined
|
|
160
|
+
// (malformed comment). The latter is filtered out as "not a comment".
|
|
161
|
+
let filtered: PlanComment[];
|
|
162
|
+
if (elementId === undefined) {
|
|
163
|
+
filtered = all.filter((c) => c && typeof c === "object" && typeof c.id === "string");
|
|
164
|
+
} else if (elementId === "nil" || elementId === "null") {
|
|
165
|
+
// explicit "canvas-pinned only"
|
|
166
|
+
filtered = all.filter(
|
|
167
|
+
(c) => c && typeof c === "object" && typeof c.id === "string" && c.elementId == null,
|
|
168
|
+
);
|
|
169
|
+
} else if (elementId === "") {
|
|
170
|
+
// empty string means "all comments" (used by the v2 viewer's
|
|
171
|
+
// "show me everything" GET with ?elementId=)
|
|
172
|
+
filtered = all.filter((c) => c && typeof c === "object" && typeof c.id === "string");
|
|
173
|
+
} else {
|
|
174
|
+
filtered = all.filter(
|
|
175
|
+
(c) => c && typeof c === "object" && typeof c.id === "string" && c.elementId === elementId,
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Sort by created time (oldest first) so the agent sees a chronological
|
|
180
|
+
// thread. Missing/empty timestamps are pushed to the end.
|
|
181
|
+
filtered.sort((a, b) => {
|
|
182
|
+
const at = String(a.created || "");
|
|
183
|
+
const bt = String(b.created || "");
|
|
184
|
+
if (at === bt) return 0;
|
|
185
|
+
if (at === "") return 1;
|
|
186
|
+
if (bt === "") return -1;
|
|
187
|
+
return at.localeCompare(bt);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
return { ok: true, comments: filtered, planSlug };
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// --- Tool factory -----------------------------------------------------------
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Build the `bizar_get_plan_comments` tool. The plugin wires the result
|
|
197
|
+
* into `Hooks.tool`. The `deps` closure carries the worktree and logger.
|
|
198
|
+
*/
|
|
199
|
+
export function createBgGetCommentsTool(deps: BgGetCommentsDeps) {
|
|
200
|
+
return tool({
|
|
201
|
+
description:
|
|
202
|
+
"Read the comments pinned to elements on a Bizar Plan canvas. " +
|
|
203
|
+
"Use this to pick up user feedback while implementing changes. " +
|
|
204
|
+
"Read-only; available to all agents. " +
|
|
205
|
+
"Returns an array of comment objects with id, x, y, elementId, " +
|
|
206
|
+
"author, text, created, and a thread of replies.",
|
|
207
|
+
args: {
|
|
208
|
+
planSlug: z
|
|
209
|
+
.string()
|
|
210
|
+
.min(1)
|
|
211
|
+
.max(64)
|
|
212
|
+
.describe(
|
|
213
|
+
"The plan's slug (lowercase, hyphens, e.g. 'my-feature'). " +
|
|
214
|
+
"Matches the directory under plans/<slug>/.",
|
|
215
|
+
),
|
|
216
|
+
elementId: z
|
|
217
|
+
.string()
|
|
218
|
+
.optional()
|
|
219
|
+
.describe(
|
|
220
|
+
"Optional element id (e.g. 'el_abc123'). If provided, only " +
|
|
221
|
+
"comments pinned to that element are returned. Omit to " +
|
|
222
|
+
"get all comments on the plan. Pass an empty string, " +
|
|
223
|
+
"'nil', or 'null' to get comments pinned to the canvas " +
|
|
224
|
+
"(no element).",
|
|
225
|
+
),
|
|
226
|
+
},
|
|
227
|
+
execute: async (rawArgs) => {
|
|
228
|
+
const args = rawArgs as { planSlug: string; elementId?: string };
|
|
229
|
+
const result = readPlanComments(deps.worktree, args.planSlug, args.elementId);
|
|
230
|
+
if (!result.ok) {
|
|
231
|
+
deps.logger.warn(
|
|
232
|
+
`bizar: get_plan_comments(${args.planSlug}) failed: ${result.error}`,
|
|
233
|
+
);
|
|
234
|
+
return { output: JSON.stringify({ error: result.error, planSlug: args.planSlug }) };
|
|
235
|
+
}
|
|
236
|
+
return { output: JSON.stringify(result.comments) };
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bg-kill.ts
|
|
3
|
+
*
|
|
4
|
+
* `bizar_kill` tool (v0.4.2 spec §1.5, §7.1, HIGH-4, MEDIUM-40).
|
|
5
|
+
*
|
|
6
|
+
* Odin-only — only Odin may kill background instances.
|
|
7
|
+
*
|
|
8
|
+
* Calls `POST /session/{id}/abort` (NOT `DELETE /session/{id}`). The
|
|
9
|
+
* session record is preserved in opencode for history; the running
|
|
10
|
+
* loop is stopped.
|
|
11
|
+
*
|
|
12
|
+
* After abort, the next event for that session is `EventSessionIdle`
|
|
13
|
+
* or `EventSessionError`. The plugin's event handler updates the
|
|
14
|
+
* instance status; `bizar_kill` itself also stamps `status: "killed"`
|
|
15
|
+
* synchronously so the caller gets immediate feedback.
|
|
16
|
+
*
|
|
17
|
+
* No-op on already-terminal instances (returns the current status).
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { tool } from "@opencode-ai/plugin";
|
|
21
|
+
import { z } from "zod";
|
|
22
|
+
|
|
23
|
+
import type { InstanceManager } from "../background.js";
|
|
24
|
+
import type { Logger } from "../logger.js";
|
|
25
|
+
|
|
26
|
+
export interface BgKillDeps {
|
|
27
|
+
instanceManager: InstanceManager;
|
|
28
|
+
logger: Logger;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function createBgKillTool(deps: BgKillDeps) {
|
|
32
|
+
return tool({
|
|
33
|
+
description:
|
|
34
|
+
"Kill a running background instance via POST /session/{id}/abort. " +
|
|
35
|
+
"Only Odin may kill. No-op on already-terminal instances.",
|
|
36
|
+
args: {
|
|
37
|
+
instanceId: z
|
|
38
|
+
.string()
|
|
39
|
+
.min(1)
|
|
40
|
+
.describe("Instance id returned by bizar_spawn_background."),
|
|
41
|
+
},
|
|
42
|
+
execute: async (rawArgs, ctx) => {
|
|
43
|
+
if (ctx.agent !== "odin") {
|
|
44
|
+
return {
|
|
45
|
+
output: JSON.stringify({
|
|
46
|
+
error:
|
|
47
|
+
"Only Odin can kill background agents. Use bizar_status to inspect or ask Odin to kill.",
|
|
48
|
+
}),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const args = rawArgs as { instanceId: string };
|
|
52
|
+
const inst = await deps.instanceManager.get(args.instanceId);
|
|
53
|
+
if (!inst) {
|
|
54
|
+
return {
|
|
55
|
+
output: JSON.stringify({
|
|
56
|
+
error: `instance not found`,
|
|
57
|
+
instanceId: args.instanceId,
|
|
58
|
+
}),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
await deps.instanceManager.kill(args.instanceId);
|
|
63
|
+
// After kill, the in-memory state should be "killed". Re-read so
|
|
64
|
+
// the caller sees the final status.
|
|
65
|
+
const after = await deps.instanceManager.get(args.instanceId);
|
|
66
|
+
return {
|
|
67
|
+
output: JSON.stringify({
|
|
68
|
+
instanceId: args.instanceId,
|
|
69
|
+
status: after?.status ?? "killed",
|
|
70
|
+
}),
|
|
71
|
+
};
|
|
72
|
+
} catch (err: unknown) {
|
|
73
|
+
deps.logger.warn(
|
|
74
|
+
`bizar: kill(${args.instanceId}) failed: ${
|
|
75
|
+
err instanceof Error ? err.message : String(err)
|
|
76
|
+
}`,
|
|
77
|
+
);
|
|
78
|
+
return {
|
|
79
|
+
output: JSON.stringify({
|
|
80
|
+
error: `kill failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
81
|
+
instanceId: args.instanceId,
|
|
82
|
+
}),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|