cli-jaw 2.17.38 → 2.17.39
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 +40 -1
- package/dist/bin/commands/chat.js +19 -2
- package/dist/bin/commands/chat.js.map +1 -1
- package/dist/bin/commands/dashboard.js +27 -10
- package/dist/bin/commands/dashboard.js.map +1 -1
- package/dist/bin/commands/init.js +10 -1
- package/dist/bin/commands/init.js.map +1 -1
- package/dist/bin/commands/tui/activity-answer-read.js +122 -0
- package/dist/bin/commands/tui/activity-answer-read.js.map +1 -0
- package/dist/bin/commands/tui/activity-fallback.js +40 -0
- package/dist/bin/commands/tui/activity-fallback.js.map +1 -0
- package/dist/bin/commands/tui/activity-handler.js +273 -0
- package/dist/bin/commands/tui/activity-handler.js.map +1 -0
- package/dist/bin/commands/tui/activity-history.js +245 -0
- package/dist/bin/commands/tui/activity-history.js.map +1 -0
- package/dist/bin/commands/tui/activity-http.js +88 -0
- package/dist/bin/commands/tui/activity-http.js.map +1 -0
- package/dist/bin/commands/tui/activity-replay.js +250 -0
- package/dist/bin/commands/tui/activity-replay.js.map +1 -0
- package/dist/bin/commands/tui/api.js +48 -1
- package/dist/bin/commands/tui/api.js.map +1 -1
- package/dist/bin/commands/tui/channel.js +11 -1
- package/dist/bin/commands/tui/channel.js.map +1 -1
- package/dist/bin/commands/tui/fullscreen-mode.js +78 -12
- package/dist/bin/commands/tui/fullscreen-mode.js.map +1 -1
- package/dist/bin/commands/tui/input-handler.js +7 -0
- package/dist/bin/commands/tui/input-handler.js.map +1 -1
- package/dist/bin/commands/tui/overlays.js +6 -3
- package/dist/bin/commands/tui/overlays.js.map +1 -1
- package/dist/bin/commands/tui/renderer.js +27 -15
- package/dist/bin/commands/tui/renderer.js.map +1 -1
- package/dist/bin/commands/tui/types.js.map +1 -1
- package/dist/bin/commands/tui/ws-handler.js +158 -13
- package/dist/bin/commands/tui/ws-handler.js.map +1 -1
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/dist/src/agent/claude-runtime-pool.js +386 -0
- package/dist/src/agent/claude-runtime-pool.js.map +1 -0
- package/dist/src/agent/claude-runtime-run.js +366 -0
- package/dist/src/agent/claude-runtime-run.js.map +1 -0
- package/dist/src/agent/codex-app-events.js +3 -1
- package/dist/src/agent/codex-app-events.js.map +1 -1
- package/dist/src/agent/events/claude.js +11 -9
- package/dist/src/agent/events/claude.js.map +1 -1
- package/dist/src/agent/events/codex.js +2 -0
- package/dist/src/agent/events/codex.js.map +1 -1
- package/dist/src/agent/events/cursor.js +49 -21
- package/dist/src/agent/events/cursor.js.map +1 -1
- package/dist/src/agent/events/grok.js +33 -5
- package/dist/src/agent/events/grok.js.map +1 -1
- package/dist/src/agent/events/helpers.js +9 -0
- package/dist/src/agent/events/helpers.js.map +1 -1
- package/dist/src/agent/events/index.js +13 -1
- package/dist/src/agent/events/index.js.map +1 -1
- package/dist/src/agent/events/opencode.js +65 -1
- package/dist/src/agent/events/opencode.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +185 -62
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/merge-tool-log.js +77 -0
- package/dist/src/agent/merge-tool-log.js.map +1 -0
- package/dist/src/agent/native-runtime-run.js +235 -0
- package/dist/src/agent/native-runtime-run.js.map +1 -0
- package/dist/src/agent/pi-runtime.js +468 -101
- package/dist/src/agent/pi-runtime.js.map +1 -1
- package/dist/src/agent/prompt-context.js +88 -2
- package/dist/src/agent/prompt-context.js.map +1 -1
- package/dist/src/agent/runtime/acp/callbacks.js +223 -0
- package/dist/src/agent/runtime/acp/callbacks.js.map +1 -0
- package/dist/src/agent/runtime/acp/config.js +182 -0
- package/dist/src/agent/runtime/acp/config.js.map +1 -0
- package/dist/src/agent/runtime/acp/connection.js +254 -0
- package/dist/src/agent/runtime/acp/connection.js.map +1 -0
- package/dist/src/agent/runtime/acp/content.js +63 -0
- package/dist/src/agent/runtime/acp/content.js.map +1 -0
- package/dist/src/agent/runtime/acp/cursor-session.js +92 -0
- package/dist/src/agent/runtime/acp/cursor-session.js.map +1 -0
- package/dist/src/agent/runtime/acp/grok-control.js +3 -0
- package/dist/src/agent/runtime/acp/grok-control.js.map +1 -0
- package/dist/src/agent/runtime/acp/grok-events.js +28 -0
- package/dist/src/agent/runtime/acp/grok-events.js.map +1 -0
- package/dist/src/agent/runtime/acp/grok-options.js +63 -0
- package/dist/src/agent/runtime/acp/grok-options.js.map +1 -0
- package/dist/src/agent/runtime/acp/grok-session.js +118 -0
- package/dist/src/agent/runtime/acp/grok-session.js.map +1 -0
- package/dist/src/agent/runtime/acp/notification-queue.js +107 -0
- package/dist/src/agent/runtime/acp/notification-queue.js.map +1 -0
- package/dist/src/agent/runtime/acp/permissions.js +133 -0
- package/dist/src/agent/runtime/acp/permissions.js.map +1 -0
- package/dist/src/agent/runtime/acp/projection.js +162 -0
- package/dist/src/agent/runtime/acp/projection.js.map +1 -0
- package/dist/src/agent/runtime/acp/replacement-turn.js +187 -0
- package/dist/src/agent/runtime/acp/replacement-turn.js.map +1 -0
- package/dist/src/agent/runtime/acp/replacement.js +159 -0
- package/dist/src/agent/runtime/acp/replacement.js.map +1 -0
- package/dist/src/agent/runtime/acp/runtime-session.js +245 -0
- package/dist/src/agent/runtime/acp/runtime-session.js.map +1 -0
- package/dist/src/agent/runtime/acp/session.js +426 -0
- package/dist/src/agent/runtime/acp/session.js.map +1 -0
- package/dist/src/agent/runtime/acp/wire.js +46 -0
- package/dist/src/agent/runtime/acp/wire.js.map +1 -0
- package/dist/src/agent/runtime/claude-run-controls.js +41 -0
- package/dist/src/agent/runtime/claude-run-controls.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-children.js +405 -0
- package/dist/src/agent/runtime/claude-sdk-children.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-close.js +43 -0
- package/dist/src/agent/runtime/claude-sdk-close.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-content.js +42 -0
- package/dist/src/agent/runtime/claude-sdk-content.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-events.js +337 -0
- package/dist/src/agent/runtime/claude-sdk-events.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-hooks.js +32 -0
- package/dist/src/agent/runtime/claude-sdk-hooks.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-input.js +58 -0
- package/dist/src/agent/runtime/claude-sdk-input.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-loader.js +21 -0
- package/dist/src/agent/runtime/claude-sdk-loader.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-messages.js +133 -0
- package/dist/src/agent/runtime/claude-sdk-messages.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-metadata.js +40 -0
- package/dist/src/agent/runtime/claude-sdk-metadata.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-options.js +70 -0
- package/dist/src/agent/runtime/claude-sdk-options.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-owners.js +113 -0
- package/dist/src/agent/runtime/claude-sdk-owners.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-permissions.js +283 -0
- package/dist/src/agent/runtime/claude-sdk-permissions.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-process.js +72 -0
- package/dist/src/agent/runtime/claude-sdk-process.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-roots.js +103 -0
- package/dist/src/agent/runtime/claude-sdk-roots.js.map +1 -0
- package/dist/src/agent/runtime/claude-sdk-session.js +518 -0
- package/dist/src/agent/runtime/claude-sdk-session.js.map +1 -0
- package/dist/src/agent/runtime/codex-projection.js +126 -0
- package/dist/src/agent/runtime/codex-projection.js.map +1 -0
- package/dist/src/agent/runtime/events.js +39 -0
- package/dist/src/agent/runtime/events.js.map +1 -0
- package/dist/src/agent/runtime/grok-main.js +7 -0
- package/dist/src/agent/runtime/grok-main.js.map +1 -0
- package/dist/src/agent/runtime/outcome.js +28 -0
- package/dist/src/agent/runtime/outcome.js.map +1 -0
- package/dist/src/agent/runtime/pi-projection.js +97 -0
- package/dist/src/agent/runtime/pi-projection.js.map +1 -0
- package/dist/src/agent/runtime/pi-raw-trace.js +87 -0
- package/dist/src/agent/runtime/pi-raw-trace.js.map +1 -0
- package/dist/src/agent/runtime/pi-turn.js +159 -0
- package/dist/src/agent/runtime/pi-turn.js.map +1 -0
- package/dist/src/agent/runtime/print-activity.js +47 -0
- package/dist/src/agent/runtime/print-activity.js.map +1 -0
- package/dist/src/agent/runtime/print-projection.js +51 -0
- package/dist/src/agent/runtime/print-projection.js.map +1 -0
- package/dist/src/agent/runtime/projection.js +283 -0
- package/dist/src/agent/runtime/projection.js.map +1 -0
- package/dist/src/agent/runtime/replace-turn.js +36 -0
- package/dist/src/agent/runtime/replace-turn.js.map +1 -0
- package/dist/src/agent/runtime/requests.js +207 -0
- package/dist/src/agent/runtime/requests.js.map +1 -0
- package/dist/src/agent/runtime/selection.js +31 -0
- package/dist/src/agent/runtime/selection.js.map +1 -0
- package/dist/src/agent/runtime/session.js +2 -0
- package/dist/src/agent/runtime/session.js.map +1 -0
- package/dist/src/agent/runtime-pool-contract.js +2 -0
- package/dist/src/agent/runtime-pool-contract.js.map +1 -0
- package/dist/src/agent/runtime-pool.js +317 -9
- package/dist/src/agent/runtime-pool.js.map +1 -1
- package/dist/src/agent/session-persistence.js +10 -2
- package/dist/src/agent/session-persistence.js.map +1 -1
- package/dist/src/agent/spawn.js +990 -143
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/agent/steer-input-guard.js +33 -0
- package/dist/src/agent/steer-input-guard.js.map +1 -0
- package/dist/src/cli/acp-client.js +20 -21
- package/dist/src/cli/acp-client.js.map +1 -1
- package/dist/src/cli/handlers-runtime.js +21 -12
- package/dist/src/cli/handlers-runtime.js.map +1 -1
- package/dist/src/cli/registry.js +2 -0
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/cli/tui/activity-answer.js +97 -0
- package/dist/src/cli/tui/activity-answer.js.map +1 -0
- package/dist/src/cli/tui/activity-history.js +364 -0
- package/dist/src/cli/tui/activity-history.js.map +1 -0
- package/dist/src/cli/tui/activity-linear.js +29 -0
- package/dist/src/cli/tui/activity-linear.js.map +1 -0
- package/dist/src/cli/tui/activity-terminal-text.js +111 -0
- package/dist/src/cli/tui/activity-terminal-text.js.map +1 -0
- package/dist/src/cli/tui/activity.js +95 -0
- package/dist/src/cli/tui/activity.js.map +1 -0
- package/dist/src/cli/tui/cell-width.js +41 -0
- package/dist/src/cli/tui/cell-width.js.map +1 -0
- package/dist/src/cli/tui/events.js +15 -0
- package/dist/src/cli/tui/events.js.map +1 -1
- package/dist/src/cli/tui/keymap.js +2 -0
- package/dist/src/cli/tui/keymap.js.map +1 -1
- package/dist/src/cli/tui/render/composer-box.js +12 -14
- package/dist/src/cli/tui/render/composer-box.js.map +1 -1
- package/dist/src/cli/tui/render/viewport.js +9 -5
- package/dist/src/cli/tui/render/viewport.js.map +1 -1
- package/dist/src/cli/tui/renderers.js +119 -139
- package/dist/src/cli/tui/renderers.js.map +1 -1
- package/dist/src/cli/tui/settings-screen.js +11 -0
- package/dist/src/cli/tui/settings-screen.js.map +1 -1
- package/dist/src/cli/tui/store.js +3 -0
- package/dist/src/cli/tui/store.js.map +1 -1
- package/dist/src/cli/tui/transcript.js +68 -0
- package/dist/src/cli/tui/transcript.js.map +1 -1
- package/dist/src/core/bus.js +8 -0
- package/dist/src/core/bus.js.map +1 -1
- package/dist/src/core/chat-sessions.js +1 -0
- package/dist/src/core/chat-sessions.js.map +1 -1
- package/dist/src/core/compact.js +10 -3
- package/dist/src/core/compact.js.map +1 -1
- package/dist/src/core/config.js +21 -0
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +26 -0
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/runtime-settings.js +44 -3
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/core/session-ops.js +40 -9
- package/dist/src/core/session-ops.js.map +1 -1
- package/dist/src/core/settings-merge.js +31 -1
- package/dist/src/core/settings-merge.js.map +1 -1
- package/dist/src/core/settings-watch.js +8 -1
- package/dist/src/core/settings-watch.js.map +1 -1
- package/dist/src/discord/bot.js +28 -9
- package/dist/src/discord/bot.js.map +1 -1
- package/dist/src/discord/send-only-client.js +4 -0
- package/dist/src/discord/send-only-client.js.map +1 -1
- package/dist/src/manager/routes/telegram-hub.js +2 -1
- package/dist/src/manager/routes/telegram-hub.js.map +1 -1
- package/dist/src/manager/scan.js +12 -0
- package/dist/src/manager/scan.js.map +1 -1
- package/dist/src/manager/server.js +89 -13
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/manager/telegram-hub/hub-bot.js +9 -3
- package/dist/src/manager/telegram-hub/hub-bot.js.map +1 -1
- package/dist/src/orchestrator/collect.js +80 -6
- package/dist/src/orchestrator/collect.js.map +1 -1
- package/dist/src/orchestrator/gateway.js +13 -10
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +68 -29
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/request-registry.js +2 -0
- package/dist/src/orchestrator/request-registry.js.map +1 -1
- package/dist/src/orchestrator/scope.js +15 -0
- package/dist/src/orchestrator/scope.js.map +1 -1
- package/dist/src/routes/memory.js +2 -2
- package/dist/src/routes/memory.js.map +1 -1
- package/dist/src/routes/messages.js +51 -18
- package/dist/src/routes/messages.js.map +1 -1
- package/dist/src/routes/orchestrate.js +29 -17
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/runtime-request-notices.js +23 -0
- package/dist/src/routes/runtime-request-notices.js.map +1 -0
- package/dist/src/routes/runtime-requests.js +43 -0
- package/dist/src/routes/runtime-requests.js.map +1 -0
- package/dist/src/routes/settings.js +7 -1
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/routes/traces.js +93 -6
- package/dist/src/routes/traces.js.map +1 -1
- package/dist/src/shared/activity-read.js +158 -0
- package/dist/src/shared/activity-read.js.map +1 -0
- package/dist/src/shared/activity-replay.js +279 -0
- package/dist/src/shared/activity-replay.js.map +1 -0
- package/dist/src/shared/activity-state.js +144 -0
- package/dist/src/shared/activity-state.js.map +1 -0
- package/dist/src/shared/isolated-qa.js +132 -0
- package/dist/src/shared/isolated-qa.js.map +1 -0
- package/dist/src/shared/presentation.js +21 -0
- package/dist/src/shared/presentation.js.map +1 -0
- package/dist/src/shared/runtime-contract.js +2 -0
- package/dist/src/shared/runtime-contract.js.map +1 -0
- package/dist/src/shared/runtime-event-parse.js +99 -0
- package/dist/src/shared/runtime-event-parse.js.map +1 -0
- package/dist/src/shared/runtime-request-notice.js +9 -0
- package/dist/src/shared/runtime-request-notice.js.map +1 -0
- package/dist/src/shared/tool-log-sanitize.js +11 -5
- package/dist/src/shared/tool-log-sanitize.js.map +1 -1
- package/dist/src/slack/bot.js +20 -7
- package/dist/src/slack/bot.js.map +1 -1
- package/dist/src/slack/send-only-client.js +3 -0
- package/dist/src/slack/send-only-client.js.map +1 -1
- package/dist/src/telegram/bot.js +27 -5
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/telegram/rich-message.js +47 -1
- package/dist/src/telegram/rich-message.js.map +1 -1
- package/dist/src/trace/activity-control.js +87 -0
- package/dist/src/trace/activity-control.js.map +1 -0
- package/dist/src/trace/activity-journal.js +155 -0
- package/dist/src/trace/activity-journal.js.map +1 -0
- package/dist/src/trace/activity-retention.js +55 -0
- package/dist/src/trace/activity-retention.js.map +1 -0
- package/dist/src/trace/runtime-body-codec.js +162 -0
- package/dist/src/trace/runtime-body-codec.js.map +1 -0
- package/dist/src/trace/store.js +65 -22
- package/dist/src/trace/store.js.map +1 -1
- package/package.json +8 -5
- package/public/css/activity.css +211 -0
- package/public/css/chat-search.css +13 -1
- package/public/css/chat.css +10 -0
- package/public/css/native-requests.css +55 -0
- package/public/css/trace-drawer.css +15 -8
- package/public/dist/assets/AdvancedExport-q4DnVxpT.js +1 -0
- package/public/dist/assets/Agent-CI1AfYOA.js +1 -0
- package/public/dist/assets/Browser-D9kwPJfN.js +1 -0
- package/public/dist/assets/BrowserPanel-CVZyvbth.js +3 -0
- package/public/dist/assets/{ChannelEnablementControl-B9KiYDZZ.js → ChannelEnablementControl-BkxeZonM.js} +1 -1
- package/public/dist/assets/ChannelsDiscord-CulKFTiX.js +1 -0
- package/public/dist/assets/ChannelsSlack-D09H8GKC.js +1 -0
- package/public/dist/assets/ChannelsTelegram-yA_NMLfM.js +1 -0
- package/public/dist/assets/CodeCanvas-DUaLWPBe.js +3 -0
- package/public/dist/assets/{DashboardEmbeddingSection-CIOwsVB5.js → DashboardEmbeddingSection-R9vUu9X2.js} +1 -1
- package/public/dist/assets/{DashboardMeta-D6nJsY8n.js → DashboardMeta-BKutQ9Ps.js} +1 -1
- package/public/dist/assets/DesignPanel-CE5jvzt4.js +2 -0
- package/public/dist/assets/{DiffPanel-ZaDoV7qS.js → DiffPanel-D9Cch5FG.js} +2 -2
- package/public/dist/assets/Display-BPYZ295k.js +1 -0
- package/public/dist/assets/DocPanel-DvtFw8AP.js +1 -0
- package/public/dist/assets/{Employees-CR41RcWo.js → Employees-bxErTlcA.js} +1 -1
- package/public/dist/assets/FolderPanel-u2YeiFFr.js +3 -0
- package/public/dist/assets/HealthBadge-CDPKdSXc.js +1 -0
- package/public/dist/assets/{Heartbeat-CD1R95Kv.js → Heartbeat-BCt4mFWz.js} +1 -1
- package/public/dist/assets/{InlineWarn-B3bJfG-Z.js → InlineWarn-DakL-ThS.js} +1 -1
- package/public/dist/assets/MarkdownRenderer-Cc3DeHvm.js +1 -0
- package/public/dist/assets/MarkdownRenderer-DzN66XVb.js +15 -0
- package/public/dist/assets/{Mcp-DSIEQZfH.js → Mcp-Cp1ffHWt.js} +2 -2
- package/public/dist/assets/{Memory-CpZIdE1o.js → Memory-Rq4fHjZv.js} +1 -1
- package/public/dist/assets/MilkdownWysiwygEditor-xObhviw7.js +160 -0
- package/public/dist/assets/ModelProvider-BNDxlWHC.js +1 -0
- package/public/dist/assets/Network-D_OYGb_C.js +1 -0
- package/public/dist/assets/NotesGraphWorkspace-DO9LtVGF.js +1 -0
- package/public/dist/assets/PanelLayoutProvider-BFxal5fZ.js +1 -0
- package/public/dist/assets/Permissions-DZ3ADB4i.js +1 -0
- package/public/dist/assets/Permissions-wj06yuy6.js +1 -0
- package/public/dist/assets/Profile-BQiNETCP.js +1 -0
- package/public/dist/assets/Prompts-DrMb2Kom.js +1 -0
- package/public/dist/assets/{SpeechKeys-CIq4c1iz.js → SpeechKeys-DqMhN-bl.js} +1 -1
- package/public/dist/assets/{TelegramHub-BrCeAZEf.js → TelegramHub-BSZ3xTdS.js} +1 -1
- package/public/dist/assets/TerminalPanel-Dwfd6Mhs.js +16 -0
- package/public/dist/assets/TerminalPanel-muGat3B1.css +1 -0
- package/public/dist/assets/{abnfDiagram-VCTEODGH-DOF68zXc.js → abnfDiagram-VCTEODGH-Bh3YzulT.js} +1 -1
- package/public/dist/assets/api-CLHen33W.js +1 -0
- package/public/dist/assets/api-CUtiCd2-.js +1 -0
- package/public/dist/assets/{apl-CYLd9I-9.js → apl-gfMMiTNf.js} +1 -1
- package/public/dist/assets/app-Dskscukr.css +1 -0
- package/public/dist/assets/app-ckFtOSgc.js +55 -0
- package/public/dist/assets/architecture-7GRP2DOG-Bp3iCG16.js +1 -0
- package/public/dist/assets/architectureDiagram-5GKGNRK7-COhidFYz.js +36 -0
- package/public/dist/assets/asciiarmor-C_eisQCp.js +1 -0
- package/public/dist/assets/{asn1-BlhHp3qx.js → asn1-DCl_8MCW.js} +1 -1
- package/public/dist/assets/{asterisk-Q0-IBwUt.js → asterisk-BEn0Cwpx.js} +1 -1
- package/public/dist/assets/{bgtask-badge-Cu1w7rg2.js → bgtask-badge-BmSGU6nQ.js} +1 -1
- package/public/dist/assets/bgtask-badge-DKpNEyny.js +1 -0
- package/public/dist/assets/{blockDiagram-OSKFZWR5-CRNzDJwU.js → blockDiagram-OSKFZWR5--OxgY2yr.js} +4 -4
- package/public/dist/assets/bounded-api-DdpT93LB.js +1 -0
- package/public/dist/assets/{bounded-set-DXkYOGnQ.js → bounded-set-BELTet1M.js} +1 -1
- package/public/dist/assets/c4Diagram-7LVT6UL2-C0DocmNb.js +38 -0
- package/public/dist/assets/channel-DO94Q0oH.js +1 -0
- package/public/dist/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/public/dist/assets/{chunk-2ZTRR5NV-DF9qGbFc.js → chunk-2ZTRR5NV-BFt7Dm5O.js} +1 -1
- package/public/dist/assets/chunk-3NF5O7KM-FbOqoUnr.js +168 -0
- package/public/dist/assets/{chunk-3Z5EZCMW-D-umBnbE.js → chunk-3Z5EZCMW-udVqggne.js} +1 -1
- package/public/dist/assets/{chunk-4HAMMTFA-BzeIXjef.js → chunk-4HAMMTFA-UBUVs5kk.js} +2 -2
- package/public/dist/assets/{chunk-5V3GS4D5-DB7RMaO_.js → chunk-5V3GS4D5-ecLo0f1p.js} +1 -1
- package/public/dist/assets/{chunk-5VM5RSS4-CEUkek2W.js → chunk-5VM5RSS4-ZNzvKenW.js} +1 -1
- package/public/dist/assets/{chunk-6AZGARVD-qPN7cVYY.js → chunk-6AZGARVD-Cou1D2Ji.js} +1 -1
- package/public/dist/assets/{chunk-6EIED4P4-Bt6lS0r9.js → chunk-6EIED4P4-DeqPLKcQ.js} +1 -1
- package/public/dist/assets/{chunk-6K3QC6MW-BC_6hNGf.js → chunk-6K3QC6MW-Cn9odKk7.js} +1 -1
- package/public/dist/assets/{chunk-6TQVIW2G-NQr1OdRE.js → chunk-6TQVIW2G-IVBzI7O8.js} +1 -1
- package/public/dist/assets/{chunk-747NJXEK-CukETSeX.js → chunk-747NJXEK-Bxgd5wfl.js} +1 -1
- package/public/dist/assets/{chunk-75Z2AOVW-BLiFJXcr.js → chunk-75Z2AOVW-B1-fK2mN.js} +1 -1
- package/public/dist/assets/chunk-CLGD4ZFX-CotBINqH.js +1 -0
- package/public/dist/assets/{chunk-DU6HZSFF-CqT8wcBs.js → chunk-DU6HZSFF-vsD_dO7e.js} +3 -3
- package/public/dist/assets/{chunk-F27PBJKO-Ccrogyxp.js → chunk-F27PBJKO-C3O21Si2.js} +1 -1
- package/public/dist/assets/{chunk-FOHPRMQF--f9XSh-3.js → chunk-FOHPRMQF-CoA4358r.js} +35 -35
- package/public/dist/assets/{chunk-GMAD6QVW-BJLz4nC-.js → chunk-GMAD6QVW-BSVfzVP1.js} +2 -2
- package/public/dist/assets/chunk-GVQU2GXP-CsYaquup.js +1 -0
- package/public/dist/assets/chunk-H2I77ZZE-ytBKuGMS.js +1 -0
- package/public/dist/assets/{chunk-HLEWEB6X-BKWwzzZJ.js → chunk-HLEWEB6X-bHrMh27k.js} +3 -3
- package/public/dist/assets/{chunk-I5DQTOEV-B46sdKHC.js → chunk-I5DQTOEV-BYKVfZyL.js} +1 -1
- package/public/dist/assets/{chunk-ICYGCRZG-CSu4gXtC.js → chunk-ICYGCRZG-hvV-gq8M.js} +1 -1
- package/public/dist/assets/{chunk-IH6LHLGP-B2m3mWfU.js → chunk-IH6LHLGP-DTNFuJiP.js} +1 -1
- package/public/dist/assets/{chunk-JWPE2WC7-D-FE5omP.js → chunk-JWPE2WC7-DVXcaiue.js} +1 -1
- package/public/dist/assets/{chunk-KI3K4JFJ-Bfn6wbch.js → chunk-KI3K4JFJ-B4ZziqcX.js} +1 -1
- package/public/dist/assets/chunk-L3NEJ4N5-DxbPaCWe.js +1 -0
- package/public/dist/assets/{chunk-LNGE3PJU-Dyjtq0ks.js → chunk-LNGE3PJU-5-SxdO55.js} +7 -7
- package/public/dist/assets/chunk-LQGUR6SS-C7emO-i3.js +2 -0
- package/public/dist/assets/chunk-OSK3NFVY-D_HWIC0H.js +10 -0
- package/public/dist/assets/{chunk-OUJLGHUK-DkWSHliq.js → chunk-OUJLGHUK-CTWiVXba.js} +1 -1
- package/public/dist/assets/{chunk-P2QGCYS3-B-9ymCdr.js → chunk-P2QGCYS3-D9LpOEME.js} +1 -1
- package/public/dist/assets/{chunk-POPQ4Y6H-Df0_Odad.js → chunk-POPQ4Y6H-BzSgf7pO.js} +1 -1
- package/public/dist/assets/{chunk-PWAF6VOD-B1cuaLs-.js → chunk-PWAF6VOD-CqSJPGBE.js} +1 -1
- package/public/dist/assets/{chunk-SVP7TREG-DCh4QTp-.js → chunk-SVP7TREG-NOSK04BT.js} +1 -1
- package/public/dist/assets/{chunk-UY3FDG6J--uyeDRt4.js → chunk-UY3FDG6J-BVPsKpVN.js} +1 -1
- package/public/dist/assets/{chunk-X3CZISLH-C1s9nTVF.js → chunk-X3CZISLH-ChyOdCnY.js} +1 -1
- package/public/dist/assets/{chunk-XHIXRSVI-CQtpMKYq.js → chunk-XHIXRSVI-CQipzMEr.js} +1 -1
- package/public/dist/assets/chunk-XXDRQBXY-Uq2wLB4L.js +1 -0
- package/public/dist/assets/{chunk-ZLD2IHE6-DOKyEMMC.js → chunk-ZLD2IHE6-CWSP7frq.js} +3 -3
- package/public/dist/assets/classDiagram-CYGNFDIV-C1ssjdiH.js +1 -0
- package/public/dist/assets/classDiagram-v2-TLXNO2FR-C1ssjdiH.js +1 -0
- package/public/dist/assets/clike-D_6L3tnO.js +1 -0
- package/public/dist/assets/cmake-84nbDH0I.js +1 -0
- package/public/dist/assets/cobol-DHLQUbN7.js +1 -0
- package/public/dist/assets/coffeescript-De_zI4J0.js +1 -0
- package/public/dist/assets/commonlisp-DgAKBe0r.js +1 -0
- package/public/dist/assets/{constants-BfYYzHNr.js → constants-TRkDoXvF.js} +1 -1
- package/public/dist/assets/{copy-text-Dy0kfmb9.js → copy-text-WsUHYigB.js} +1 -1
- package/public/dist/assets/cose-bilkent-JH36ORCC-BqCMCbxR.js +1 -0
- package/public/dist/assets/crystal-Bsdphhtm.js +1 -0
- package/public/dist/assets/css-CnaYoQib.js +1 -0
- package/public/dist/assets/cynefin-OW5HDTMX-57vG-IQU.js +1 -0
- package/public/dist/assets/cynefinDiagram-5FMLGOSQ-UAM-DZmU.js +62 -0
- package/public/dist/assets/cytoscape.esm-Ql0ZPabT.js +321 -0
- package/public/dist/assets/{d-BfHF1VVF.js → d-DWkQyNnU.js} +1 -1
- package/public/dist/assets/dagre-Fg-GCROL.js +1 -0
- package/public/dist/assets/{dagre-OS7QT2EB-c-JkA4ju.js → dagre-OS7QT2EB-CflcJHKB.js} +2 -2
- package/public/dist/assets/{diagram-S7CK7UJ4-CgObZnGW.js → diagram-S7CK7UJ4-Dzl9sLZD.js} +1 -1
- package/public/dist/assets/{diagram-UQ7AKVKN-DTiko3yH.js → diagram-UQ7AKVKN-BhpfQUAt.js} +2 -2
- package/public/dist/assets/{diagram-VSXAHHWV-BtwoQsOH.js → diagram-VSXAHHWV-CnuHIxOm.js} +1 -1
- package/public/dist/assets/{diagram-VX7I27RA-BvFpphqo.js → diagram-VX7I27RA-CQzbjtqd.js} +13 -13
- package/public/dist/assets/{diagram-Z3DM3KII-Zq8iJClC.js → diagram-Z3DM3KII-DR3Ie5C2.js} +1 -1
- package/public/dist/assets/dist--wUCkuiC.js +9 -0
- package/public/dist/assets/dist-B2ugUS7T.js +1 -0
- package/public/dist/assets/dist-B6-H00Bu.js +1 -0
- package/public/dist/assets/{dist-CD7tjeNO.js → dist-B_o5XbiL.js} +1 -1
- package/public/dist/assets/{dist-D8Zky4R1.js → dist-Bn361Kgk.js} +2 -2
- package/public/dist/assets/{dist-BspKh_Zg.js → dist-Box-O1ow.js} +1 -1
- package/public/dist/assets/dist-Bp7q5-Qc.js +39 -0
- package/public/dist/assets/dist-C9i-hLBK.js +1 -0
- package/public/dist/assets/{dist-JnCmAxGR.js → dist-CGUtB2hn.js} +1 -1
- package/public/dist/assets/dist-CHO5CBK1.js +1 -0
- package/public/dist/assets/dist-CJNnOuaA.js +1 -0
- package/public/dist/assets/dist-CPYD5RoF.js +1 -0
- package/public/dist/assets/dist-CW1HDUim.js +1 -0
- package/public/dist/assets/dist-Cbkb9LHa.js +1 -0
- package/public/dist/assets/dist-CcmA2WLJ.js +2 -0
- package/public/dist/assets/dist-ClT6EIJP.js +1 -0
- package/public/dist/assets/dist-D011G-p-.js +13 -0
- package/public/dist/assets/dist-DBX5LjYY.js +6 -0
- package/public/dist/assets/dist-DBpt7gM8.js +1 -0
- package/public/dist/assets/{dist-CgIOBybm.js → dist-DJGc9cyj.js} +1 -1
- package/public/dist/assets/{dist-CTpw6PFT.js → dist-DUl4SBwX.js} +1 -1
- package/public/dist/assets/{dist-DKd_hdkE.js → dist-DWvaIPaS.js} +1 -1
- package/public/dist/assets/{dist-DS7cuuIk.js → dist-Ds6qQDMC.js} +1 -1
- package/public/dist/assets/dist-Dxy8kUAu.js +1 -0
- package/public/dist/assets/{dist-Bg80xGMJ.js → dist-OaQUa3cd.js} +1 -1
- package/public/dist/assets/dist-Ohtnri73.js +11 -0
- package/public/dist/assets/dist-TN2_Nms3.js +2 -0
- package/public/dist/assets/dist-XM8qpb8C.js +1 -0
- package/public/dist/assets/dist-Y0iINzVl.js +1 -0
- package/public/dist/assets/{dist-uSfGXqs6.js → dist-kYfyPZP9.js} +1 -1
- package/public/dist/assets/{dist-D3ShDeDU.js → dist-lsEiXLAb.js} +1 -1
- package/public/dist/assets/{dockerfile-DkX5AHzr.js → dockerfile-DJkHQgkl.js} +1 -1
- package/public/dist/assets/{dylan-BQ0i5j3T.js → dylan-BCDoL_-p.js} +1 -1
- package/public/dist/assets/{ebnfDiagram-PWID7BFC-_fcO3z5G.js → ebnfDiagram-PWID7BFC-D_FcQuZg.js} +1 -1
- package/public/dist/assets/{ecl-oXh4vhiy.js → ecl-BVIeWmwY.js} +1 -1
- package/public/dist/assets/{employees-qLLnQlAv.js → employees-BJRRI3rV.js} +3 -3
- package/public/dist/assets/{erDiagram-2YWLMYGG-YIq0Go-p.js → erDiagram-2YWLMYGG-CLpGDU8-.js} +3 -3
- package/public/dist/assets/{erlang-GRIYhTbY.js → erlang-BV0c4Hdn.js} +1 -1
- package/public/dist/assets/{error-normalize-CLRJh19F.js → error-normalize-UHvG8s92.js} +1 -1
- package/public/dist/assets/esm-Q6VOkDbn.js +4 -0
- package/public/dist/assets/eventmodeling-NTZA5JFV-Dz1yjNT-.js +1 -0
- package/public/dist/assets/{factor-Xro2mWdw.js → factor-LKH5gN8L.js} +1 -1
- package/public/dist/assets/fields-CSdFjOgg.js +1 -0
- package/public/dist/assets/flowDiagram-T62WH6J4-jooH4x9e.js +1 -0
- package/public/dist/assets/forth-D6RzAl64.js +1 -0
- package/public/dist/assets/ganttDiagram-EL5Y4UJY-B9_NJDV6.js +292 -0
- package/public/dist/assets/gitGraph-4MIJSDKK-NIO2XoGv.js +1 -0
- package/public/dist/assets/{gitGraphDiagram-WWUBYQGX-Bg3OM_0S.js → gitGraphDiagram-WWUBYQGX-BO0vc7Qh.js} +4 -4
- package/public/dist/assets/graphlib-CGJNr7IJ.js +1 -0
- package/public/dist/assets/groovy-CUpZ7dEl.js +1 -0
- package/public/dist/assets/{haxe-BrZpr4Ca.js → haxe-DjVOVvNP.js} +1 -1
- package/public/dist/assets/idb-cache-BRpjf_a8.js +1 -0
- package/public/dist/assets/idb-cache-CFBnPfHz.js +1 -0
- package/public/dist/assets/iframe-renderer-BngLCbh9.js +1 -0
- package/public/dist/assets/iframe-renderer-CFD7rXuQ.js +142 -0
- package/public/dist/assets/info-A6RAGUB7-yRMwEr76.js +1 -0
- package/public/dist/assets/{infoDiagram-FKFFQAWI-Dbi9pIPw.js → infoDiagram-FKFFQAWI-BM2g31_p.js} +1 -1
- package/public/dist/assets/{ishikawaDiagram-5VMMS53U-C1FUP-sO.js → ishikawaDiagram-5VMMS53U-BZvjesKs.js} +2 -2
- package/public/dist/assets/javascript-B9I2pbsP.js +1 -0
- package/public/dist/assets/javascript-DctB8BJo.js +1 -0
- package/public/dist/assets/{journeyDiagram-EYS64GPL-CaEEa3uT.js → journeyDiagram-EYS64GPL-CqtePaqZ.js} +3 -3
- package/public/dist/assets/{jsx-runtime-CYoNlHAD.js → jsx-runtime-CkEUZM6i.js} +1 -1
- package/public/dist/assets/{kanban-definition-UXKFOSKX-DQjqFxtj.js → kanban-definition-UXKFOSKX-ChZA_T7a.js} +5 -5
- package/public/dist/assets/katex-DL-Py6bk.js +1 -0
- package/public/dist/assets/{lua-CxVmDfKg.js → lua-zbJo2mq3.js} +1 -1
- package/public/dist/assets/manager-Bfy42VgJ.css +1 -0
- package/public/dist/assets/manager-CTX6I1Jk.js +13 -0
- package/public/dist/assets/memory-BXcwokaP.js +1 -0
- package/public/dist/assets/{memory-I_6c8skr.js → memory-D2wwkOUi.js} +10 -10
- package/public/dist/assets/mermaid-loader-Beqble_i.js +1 -0
- package/public/dist/assets/{mermaid-parser.core-CBiGpWk6.js → mermaid-parser.core-J035_CYr.js} +1 -1
- package/public/dist/assets/{mermaid-preprocess-4oGDpf1X.js → mermaid-preprocess-D8xe5R2A.js} +1 -1
- package/public/dist/assets/mermaid.core-D1YZrgc_.js +11 -0
- package/public/dist/assets/mermaid.core-DSXunyto.js +1 -0
- package/public/dist/assets/message-history-C2JH-y2v.js +1 -0
- package/public/dist/assets/message-history-CYp7fqXy.js +4 -0
- package/public/dist/assets/{mindmap-definition-THT77NOG-CXOyjall.js → mindmap-definition-THT77NOG-C4c47DPO.js} +3 -3
- package/public/dist/assets/{mumps-BdPrWvs5.js → mumps-BSzj6Xyz.js} +1 -1
- package/public/dist/assets/{nginx-C7cLiM4x.js → nginx-8H7HVH4w.js} +1 -1
- package/public/dist/assets/{notes-graph-settings-Cl4lMj-A.js → notes-graph-settings-BUoTzvqs.js} +1 -1
- package/public/dist/assets/{nsis-iX94j4T9.js → nsis-CfSuhXs5.js} +1 -1
- package/public/dist/assets/{ntriples-DLMpvgb1.js → ntriples-B9h1VB_g.js} +1 -1
- package/public/dist/assets/packet-AYTQ26CC-BreuCLNh.js +1 -0
- package/public/dist/assets/{page-shell-DZ1lls_P.js → page-shell-Bs0RBRoD.js} +1 -1
- package/public/dist/assets/{pegDiagram-XKGWAZYB-DVD3P7WU.js → pegDiagram-XKGWAZYB-BHiELbRn.js} +1 -1
- package/public/dist/assets/perl-BkSkiI9m.js +1 -0
- package/public/dist/assets/pi-settings-B7e38HJP.js +1 -0
- package/public/dist/assets/{pi-settings-DEuKgvIj.js → pi-settings-BmvRWRpc.js} +1 -1
- package/public/dist/assets/pie-WAS4IAKB-Co3_rQ80.js +1 -0
- package/public/dist/assets/{pieDiagram-E7YTZNPT-DEH6UJP4.js → pieDiagram-E7YTZNPT-BEKTktaH.js} +2 -2
- package/public/dist/assets/{powershell-Dfw2t4-B.js → powershell-BcIto6Sf.js} +1 -1
- package/public/dist/assets/preload-helper-CfbQpVni.js +1 -0
- package/public/dist/assets/presentation-DWHWElFr.js +1 -0
- package/public/dist/assets/presentation-preference-BYEPPRPg.js +1 -0
- package/public/dist/assets/presentation-preference-D9u6LD07.js +1 -0
- package/public/dist/assets/{pug-C8nPBT90.js → pug-CqqUmdG7.js} +1 -1
- package/public/dist/assets/puppet-BZyAS7I4.js +1 -0
- package/public/dist/assets/python-B_1Jd8HM.js +1 -0
- package/public/dist/assets/{quadrantDiagram-AXDQQJYC-CAbCNOON.js → quadrantDiagram-AXDQQJYC-CeJGAkDA.js} +2 -2
- package/public/dist/assets/r-CxDmU1I4.js +1 -0
- package/public/dist/assets/radar-RG4KPBEZ-C2cOxc85.js +1 -0
- package/public/dist/assets/railroad-74A4TZTK-BZ4umY4g.js +1 -0
- package/public/dist/assets/railroad-abnf-HS5TGJTU-DxbXiuYs.js +1 -0
- package/public/dist/assets/railroad-ebnf-LZEXJU2U-Bthp2_-B.js +1 -0
- package/public/dist/assets/railroad-peg-WCYAUIDC-YcQ4ouxQ.js +1 -0
- package/public/dist/assets/{railroadDiagram-O6MQD6OU-CEs81LrU.js → railroadDiagram-O6MQD6OU-CsT34rgN.js} +1 -1
- package/public/dist/assets/{render-Cc0Y43E3.js → render-DRweFDYR.js} +13 -13
- package/public/dist/assets/{requirementDiagram-IS5BZ75X-DsPApdKv.js → requirementDiagram-IS5BZ75X-4PwTKQWK.js} +2 -2
- package/public/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/public/dist/assets/{rough.esm-DQG0wzX4.js → rough.esm-Dy-Kn_BL.js} +1 -1
- package/public/dist/assets/ruby-BjXV7-Qa.js +1 -0
- package/public/dist/assets/{sankeyDiagram-P5KCCOFB-Im52Eou9.js → sankeyDiagram-P5KCCOFB-BykRKMDj.js} +2 -2
- package/public/dist/assets/scheme-D9qYN0V5.js +1 -0
- package/public/dist/assets/sequenceDiagram-WJ2MYXX4-Dyj787ok.js +162 -0
- package/public/dist/assets/settings-2diaN51W.js +1 -0
- package/public/dist/assets/{settings-DpjZSu2J.js → settings-DuqNWkxS.js} +3 -3
- package/public/dist/assets/settings-client-CSHmzyxv.js +1 -0
- package/public/dist/assets/settings-core-CIPKFBNN.js +162 -0
- package/public/dist/assets/settings-core-DiYr5EbU.js +1 -0
- package/public/dist/assets/{shell-BBoIO9l0.js → shell-DwuoZtxw.js} +1 -1
- package/public/dist/assets/sidebar-DumxhgAD.js +49 -0
- package/public/dist/assets/{sieve-8oEe6gDx.js → sieve-tLWDfEkZ.js} +1 -1
- package/public/dist/assets/{simple-mode-BNw0K2rL.js → simple-mode-DXiLM1-G.js} +1 -1
- package/public/dist/assets/{sizeCapture-INFHLROL-D9Rpk-aA.js → sizeCapture-INFHLROL-B0uUizjq.js} +1 -1
- package/public/dist/assets/skills-CCXE-bXK.js +1 -0
- package/public/dist/assets/skills-D3AfzYbP.js +12 -0
- package/public/dist/assets/slash-commands-Cn9AWqF6.js +1 -0
- package/public/dist/assets/slash-commands-DCHYDCYa.js +20 -0
- package/public/dist/assets/solr-B78wSQJQ.js +1 -0
- package/public/dist/assets/sql-DuQMFDvy.js +1 -0
- package/public/dist/assets/state-Dl-xxPoS.js +1 -0
- package/public/dist/assets/{stateDiagram-XQSTLZYL-B5CxGVqv.js → stateDiagram-XQSTLZYL-6p5Yrm8S.js} +1 -1
- package/public/dist/assets/stateDiagram-v2-IH3M54BS-DfXrMbZg.js +1 -0
- package/public/dist/assets/{stex-32iK7T_9.js → stex-DNzd62Q_.js} +1 -1
- package/public/dist/assets/{stylus-C689wDNM.js → stylus-BOVgKnng.js} +1 -1
- package/public/dist/assets/swimlanes-V6O3JKXN-Pyw_hrrE.js +1 -0
- package/public/dist/assets/swimlanesDiagram-JKAHXJPX-R-OHp34K.js +8 -0
- package/public/dist/assets/textile-C4jVoHG1.js +1 -0
- package/public/dist/assets/tiki-AK6FwT8q.js +1 -0
- package/public/dist/assets/timeline-definition-24CTP7MA-V_LwIXs0.js +120 -0
- package/public/dist/assets/toml-BPTmHmyx.js +1 -0
- package/public/dist/assets/trace-drawer-B05Fa2ja.js +20 -0
- package/public/dist/assets/treeView-Q6P3EWNA-CDjnLfDO.js +1 -0
- package/public/dist/assets/treemap-WGGIJYW6-CbGUwvA1.js +1 -0
- package/public/dist/assets/{ttcn-CPOduycD.js → ttcn-PPSTk1ow.js} +1 -1
- package/public/dist/assets/{ttcn-cfg-DmA__-R_.js → ttcn-cfg-2b4Gb5sE.js} +1 -1
- package/public/dist/assets/turtle-Cx3rYX2g.js +1 -0
- package/public/dist/assets/ui-BO9pdl-p.js +1 -0
- package/public/dist/assets/ui-CCXcKDL5.js +2 -0
- package/public/dist/assets/vendor-render-Cmfl_oW8.js +383 -0
- package/public/dist/assets/vendor-render-DSSkXCir.css +1 -0
- package/public/dist/assets/vendor-utils-C1xaEGmb.js +1 -0
- package/public/dist/assets/{vennDiagram-4TSXK5OY-fVndHq7T.js → vennDiagram-4TSXK5OY-ZagiHlwi.js} +3 -3
- package/public/dist/assets/{verilog-DMw8DKoT.js → verilog-CjI9Y6RI.js} +1 -1
- package/public/dist/assets/vhdl-kS471soi.js +1 -0
- package/public/dist/assets/wardley-WFR3VGLG-Cj73o4Iq.js +1 -0
- package/public/dist/assets/{wardleyDiagram-VM6X3IG4-CXIfS7ZF.js → wardleyDiagram-VM6X3IG4-BBAHdIq-.js} +35 -35
- package/public/dist/assets/wiki-link-resolver-CbJATnBn.js +22 -0
- package/public/dist/assets/wiki-link-suggestions-BcEfThgf.js +2 -0
- package/public/dist/assets/{xquery-CYbd_YmJ.js → xquery-BKJx4mf9.js} +1 -1
- package/public/dist/assets/{xychartDiagram-S5SC5T6Z-CqC-Uvuc.js → xychartDiagram-S5SC5T6Z-C43SenTd.js} +4 -4
- package/public/dist/assets/z80-Co3PbHdE.js +1 -0
- package/public/dist/index.html +4 -4
- package/public/dist/manager/index.html +3 -3
- package/public/index.html +3 -1
- package/public/js/api.ts +2 -2
- package/public/js/bounded-api.ts +49 -0
- package/public/js/features/activity-discovery.ts +142 -0
- package/public/js/features/activity-history.ts +334 -0
- package/public/js/features/activity-http.ts +17 -0
- package/public/js/features/activity-live.ts +330 -0
- package/public/js/features/activity-view.ts +218 -0
- package/public/js/features/chat-messages.ts +13 -4
- package/public/js/features/idb-cache.ts +37 -3
- package/public/js/features/message-history.ts +144 -16
- package/public/js/features/message-item-html.ts +7 -3
- package/public/js/features/native-request-bridge.ts +133 -0
- package/public/js/features/native-requests.ts +337 -0
- package/public/js/features/presentation-preference.ts +52 -0
- package/public/js/features/process-block.ts +35 -1
- package/public/js/features/process-log-adapter.ts +11 -1
- package/public/js/features/settings-core.ts +20 -1
- package/public/js/features/settings-types.ts +5 -1
- package/public/js/features/trace-drawer.ts +145 -43
- package/public/js/features/ui-status.ts +5 -0
- package/public/js/state.ts +3 -0
- package/public/js/ui.ts +41 -8
- package/public/js/virtual-scroll.ts +66 -4
- package/public/js/ws.ts +324 -29
- package/public/manager/src/settings/fields/SelectField.tsx +7 -5
- package/public/manager/src/settings/pages/Agent.tsx +3 -2
- package/public/manager/src/settings/pages/Display.tsx +100 -19
- package/public/manager/src/settings/pages/ModelProvider.tsx +133 -45
- package/public/manager/src/settings/pages/Permissions.tsx +18 -10
- package/public/manager/src/settings/pages/components/PerCliRow.tsx +42 -6
- package/public/manager/src/settings/pages/components/PiProfileDialog.tsx +59 -6
- package/public/manager/src/settings/pages/components/agent/PermissionQuickSection.tsx +9 -6
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +3 -0
- package/public/manager/src/settings/pages/components/runtime-transport-field.tsx +68 -0
- package/public/manager/src/settings-controls.css +43 -0
- package/public/manager/src/settings-shell.css +21 -1
- package/scripts/bundle-sidecar.sh +282 -37
- package/scripts/check-sidecar-smoke.mjs +250 -137
- package/scripts/sidecar-smoke-probe.mjs +171 -0
- package/public/dist/assets/AdvancedExport-tXydxVAh.js +0 -1
- package/public/dist/assets/Agent-CHaTUS7c.js +0 -1
- package/public/dist/assets/Browser-Dm5J1gXP.js +0 -1
- package/public/dist/assets/BrowserPanel-0b3deLGR.js +0 -3
- package/public/dist/assets/ChannelsDiscord-D6jmfyHe.js +0 -1
- package/public/dist/assets/ChannelsSlack-BcykASIN.js +0 -1
- package/public/dist/assets/ChannelsTelegram-XkNtVi8o.js +0 -1
- package/public/dist/assets/CodeCanvas-D-JH2Ikl.js +0 -3
- package/public/dist/assets/DesignPanel-SuUOoyQN.js +0 -2
- package/public/dist/assets/Display-B25HqCMH.js +0 -1
- package/public/dist/assets/DocPanel-qiqo6365.js +0 -1
- package/public/dist/assets/FolderPanel-BkggPdTP.js +0 -3
- package/public/dist/assets/HealthBadge-D7BQ-LHD.js +0 -1
- package/public/dist/assets/MarkdownRenderer-DZ-hWmCB.js +0 -15
- package/public/dist/assets/MarkdownRenderer-uwE0Wam5.js +0 -1
- package/public/dist/assets/MilkdownWysiwygEditor-DanGAZL5.js +0 -160
- package/public/dist/assets/ModelProvider-tL42E5dy.js +0 -1
- package/public/dist/assets/Network-ByNu-VCZ.js +0 -1
- package/public/dist/assets/NotesGraphWorkspace-Be6ctzYE.js +0 -1
- package/public/dist/assets/PanelLayoutProvider-B9fYsunp.js +0 -1
- package/public/dist/assets/Permissions-B-74b-nO.js +0 -1
- package/public/dist/assets/Permissions-x_6_kLC1.js +0 -1
- package/public/dist/assets/Profile-Bf9-QN2Y.js +0 -1
- package/public/dist/assets/Prompts-DGDw56NQ.js +0 -1
- package/public/dist/assets/TerminalPanel-DdE69MNo.css +0 -1
- package/public/dist/assets/TerminalPanel-gXH7bTXQ.js +0 -36
- package/public/dist/assets/api-DNnX8m0u.js +0 -1
- package/public/dist/assets/api-tVoG39dL.js +0 -1
- package/public/dist/assets/app-CXraFyoA.js +0 -55
- package/public/dist/assets/app-DuyLYRC6.css +0 -1
- package/public/dist/assets/architecture-7GRP2DOG-DxLizWvy.js +0 -1
- package/public/dist/assets/architectureDiagram-5GKGNRK7-BpxFEoT5.js +0 -36
- package/public/dist/assets/asciiarmor-7YwhfGDq.js +0 -1
- package/public/dist/assets/bgtask-badge-BjyAbBio.js +0 -1
- package/public/dist/assets/c4Diagram-7LVT6UL2-Bg0DdRYW.js +0 -38
- package/public/dist/assets/channel-BjgXjYj8.js +0 -1
- package/public/dist/assets/chunk-2Q5K7J3B-BClkI2P5.js +0 -1
- package/public/dist/assets/chunk-3NF5O7KM-DXOprKA_.js +0 -168
- package/public/dist/assets/chunk-CLGD4ZFX-B5zkZ8n6.js +0 -1
- package/public/dist/assets/chunk-GVQU2GXP-BlVn1fMW.js +0 -1
- package/public/dist/assets/chunk-H2I77ZZE-BXf4_vA2.js +0 -1
- package/public/dist/assets/chunk-L3NEJ4N5-FGXu31jw.js +0 -1
- package/public/dist/assets/chunk-LQGUR6SS-qUTD5FMI.js +0 -2
- package/public/dist/assets/chunk-OSK3NFVY-CrXjNywV.js +0 -10
- package/public/dist/assets/chunk-XXDRQBXY-DEwmqeYc.js +0 -1
- package/public/dist/assets/classDiagram-CYGNFDIV-hbaxbeYd.js +0 -1
- package/public/dist/assets/classDiagram-v2-TLXNO2FR-_OfX3b6Y.js +0 -1
- package/public/dist/assets/clike-BcV5UqGE.js +0 -1
- package/public/dist/assets/cmake-DhPsEu0W.js +0 -1
- package/public/dist/assets/cobol-BEekiT-v.js +0 -1
- package/public/dist/assets/coffeescript-Bgk4ZVWF.js +0 -1
- package/public/dist/assets/commonlisp-Dw4PRJwx.js +0 -1
- package/public/dist/assets/cose-bilkent-JH36ORCC-HnUYAhwC.js +0 -1
- package/public/dist/assets/crystal-CJ-iCD_G.js +0 -1
- package/public/dist/assets/css-BDUaiSMY.js +0 -1
- package/public/dist/assets/cynefin-OW5HDTMX-VXYSLvft.js +0 -1
- package/public/dist/assets/cynefinDiagram-5FMLGOSQ-D0dmg5fA.js +0 -62
- package/public/dist/assets/cytoscape.esm-CS3SmpXd.js +0 -321
- package/public/dist/assets/dagre-DDTOgfwg.js +0 -1
- package/public/dist/assets/dist-BCCaGGDY.js +0 -1
- package/public/dist/assets/dist-BPE4W9iX.js +0 -6
- package/public/dist/assets/dist-BQMBTYXL.js +0 -1
- package/public/dist/assets/dist-BaPGPaX4.js +0 -1
- package/public/dist/assets/dist-CBnlLSQZ.js +0 -1
- package/public/dist/assets/dist-CINTuhik.js +0 -2
- package/public/dist/assets/dist-CX7KjpF3.js +0 -39
- package/public/dist/assets/dist-CczLsP0o.js +0 -9
- package/public/dist/assets/dist-CdfDDy4r.js +0 -1
- package/public/dist/assets/dist-Cl_pRobr.js +0 -1
- package/public/dist/assets/dist-CruwQXwE.js +0 -1
- package/public/dist/assets/dist-CvE8Qa9r.js +0 -2
- package/public/dist/assets/dist-Cy3mcP1e.js +0 -1
- package/public/dist/assets/dist-CzCFEnHw.js +0 -1
- package/public/dist/assets/dist-D2h9T4I9.js +0 -13
- package/public/dist/assets/dist-DLOg6n0b.js +0 -1
- package/public/dist/assets/dist-DW0I56_o.js +0 -1
- package/public/dist/assets/dist-TombgBki.js +0 -11
- package/public/dist/assets/dist-hBRIxDzG.js +0 -1
- package/public/dist/assets/dist-z5Z70wW8.js +0 -1
- package/public/dist/assets/esm-CT1xxdH5.js +0 -4
- package/public/dist/assets/eventmodeling-NTZA5JFV-Csqcv5T_.js +0 -1
- package/public/dist/assets/fields-E1L8aEhU.js +0 -1
- package/public/dist/assets/flowDiagram-T62WH6J4-Del9dfOW.js +0 -1
- package/public/dist/assets/forth-DNnBFTm6.js +0 -1
- package/public/dist/assets/ganttDiagram-EL5Y4UJY-CezfIvti.js +0 -292
- package/public/dist/assets/gitGraph-4MIJSDKK-D_1mlgPm.js +0 -1
- package/public/dist/assets/graphlib-Cjg_soTo.js +0 -1
- package/public/dist/assets/groovy-Cm4gdIYU.js +0 -1
- package/public/dist/assets/idb-cache-B5PX63p7.js +0 -1
- package/public/dist/assets/idb-cache-lOntwU3S.js +0 -1
- package/public/dist/assets/iframe-renderer-BLP8Army.js +0 -1
- package/public/dist/assets/iframe-renderer-vuNrU6aI.js +0 -142
- package/public/dist/assets/info-A6RAGUB7-ce7F80NR.js +0 -1
- package/public/dist/assets/javascript-DD7UxIxH.js +0 -1
- package/public/dist/assets/javascript-DZFdG8BN.js +0 -1
- package/public/dist/assets/katex-BoGadFcG.js +0 -1
- package/public/dist/assets/manager-BspQvGAC.js +0 -13
- package/public/dist/assets/manager-Cmu0aKPb.css +0 -1
- package/public/dist/assets/memory-CRji7xpO.js +0 -1
- package/public/dist/assets/mermaid-loader-BcReSszT.js +0 -1
- package/public/dist/assets/mermaid.core-BJIXJ0Ir.js +0 -11
- package/public/dist/assets/mermaid.core-J6tiqiVK.js +0 -1
- package/public/dist/assets/message-history-C1ThtA4i.js +0 -1
- package/public/dist/assets/message-history-CXg12lcd.js +0 -1
- package/public/dist/assets/packet-AYTQ26CC-86oNpyWh.js +0 -1
- package/public/dist/assets/perl-DfpfXWOH.js +0 -1
- package/public/dist/assets/pi-settings-5HVg1sXJ.js +0 -1
- package/public/dist/assets/pie-WAS4IAKB-CMzmzfvT.js +0 -1
- package/public/dist/assets/preload-helper-DFYRRz9w.js +0 -1
- package/public/dist/assets/puppet-DnsvBfcg.js +0 -1
- package/public/dist/assets/python-mfoZJSDM.js +0 -1
- package/public/dist/assets/r-FO7GgXB8.js +0 -1
- package/public/dist/assets/radar-RG4KPBEZ-CsDBxCx4.js +0 -1
- package/public/dist/assets/railroad-74A4TZTK-B6s85Oul.js +0 -1
- package/public/dist/assets/railroad-abnf-HS5TGJTU-jnABoAnr.js +0 -1
- package/public/dist/assets/railroad-ebnf-LZEXJU2U-C_VWXbk9.js +0 -1
- package/public/dist/assets/railroad-peg-WCYAUIDC-y3jeoP_s.js +0 -1
- package/public/dist/assets/rolldown-runtime-XQCOJYun.js +0 -1
- package/public/dist/assets/ruby-Cg1fwXaw.js +0 -1
- package/public/dist/assets/scheme-DGFmPoR2.js +0 -1
- package/public/dist/assets/sequenceDiagram-WJ2MYXX4-BChOR6yh.js +0 -162
- package/public/dist/assets/settings-B2Ix6Y7k.js +0 -1
- package/public/dist/assets/settings-client-D9KY2Ufl.js +0 -1
- package/public/dist/assets/settings-core-Bkb0BoYY.js +0 -1
- package/public/dist/assets/settings-core-DWYQIIoe.js +0 -162
- package/public/dist/assets/sidebar-C8WKweCz.js +0 -49
- package/public/dist/assets/skills-QWf6vRIB.js +0 -12
- package/public/dist/assets/skills-bEGqvmiQ.js +0 -1
- package/public/dist/assets/slash-commands-BbA0Y1up.js +0 -1
- package/public/dist/assets/slash-commands-qD6yScsx.js +0 -20
- package/public/dist/assets/solr-BwGyzi2H.js +0 -1
- package/public/dist/assets/sql-B6Phvk1R.js +0 -1
- package/public/dist/assets/state-DxpgDKMO.js +0 -1
- package/public/dist/assets/stateDiagram-v2-IH3M54BS-BmdRqxzy.js +0 -1
- package/public/dist/assets/swimlanes-V6O3JKXN-Ckem4dQh.js +0 -1
- package/public/dist/assets/swimlanesDiagram-JKAHXJPX-DW_0PiOk.js +0 -8
- package/public/dist/assets/textile-xOWO1SH7.js +0 -1
- package/public/dist/assets/tiki-OG7n6UAo.js +0 -1
- package/public/dist/assets/timeline-definition-24CTP7MA-CJRsjFnd.js +0 -120
- package/public/dist/assets/toml-DkxT-aUR.js +0 -1
- package/public/dist/assets/trace-drawer-Ct8sP4j-.js +0 -15
- package/public/dist/assets/treeView-Q6P3EWNA-ChnMvz2a.js +0 -1
- package/public/dist/assets/treemap-WGGIJYW6-DZJ4jE42.js +0 -1
- package/public/dist/assets/turtle-CEzrJHdY.js +0 -1
- package/public/dist/assets/ui-BZxyyJUk.js +0 -1
- package/public/dist/assets/ui-xoW9x-Pz.js +0 -2
- package/public/dist/assets/vendor-render-BpGO1zp3.js +0 -383
- package/public/dist/assets/vendor-render-kIxHrxDV.css +0 -1
- package/public/dist/assets/vendor-utils-BUFU5ypz.js +0 -1
- package/public/dist/assets/vhdl-M4wLPuJt.js +0 -1
- package/public/dist/assets/wardley-WFR3VGLG-CGM_JiX0.js +0 -1
- package/public/dist/assets/wiki-link-resolver-BGpGBLMp.js +0 -22
- package/public/dist/assets/wiki-link-suggestions-cvpqJp6c.js +0 -2
- package/public/dist/assets/z80-nGsPT_fm.js +0 -1
- /package/public/dist/assets/{agent-meta-KPnVam9G.js → agent-meta-WqLP4HPi.js} +0 -0
- /package/public/dist/assets/{api-FOqKQ9fm.js → api-B9RiiOMM.js} +0 -0
- /package/public/dist/assets/{brainfuck-CM8jf4Gu.js → brainfuck-D5EjA2JK.js} +0 -0
- /package/public/dist/assets/{chunk-Y2CYZVJY-DlLjK0OJ.js → chunk-Y2CYZVJY-DsF7k-Jl.js} +0 -0
- /package/public/dist/assets/{clojure-XHu9GAjV.js → clojure-BflJGmDX.js} +0 -0
- /package/public/dist/assets/{cypher-CJ05ZgAu.js → cypher-p9eYesGn.js} +0 -0
- /package/public/dist/assets/{desktop-bridge-DtydAvqu.js → desktop-bridge-DbRfkg8l.js} +0 -0
- /package/public/dist/assets/{diff-BVcHwfdB.js → diff-ChtP43wD.js} +0 -0
- /package/public/dist/assets/{dtd-Bg0TgBY9.js → dtd-DTF72YNO.js} +0 -0
- /package/public/dist/assets/{ebnf-QSFUkOiT.js → ebnf-D4c0_ac3.js} +0 -0
- /package/public/dist/assets/{eiffel-S15DDWzw.js → eiffel-BEjRio4Q.js} +0 -0
- /package/public/dist/assets/{elm-B746ZFPi.js → elm-Cshzl8qu.js} +0 -0
- /package/public/dist/assets/{fcl-DjQMeb0v.js → fcl-ClOhbFR7.js} +0 -0
- /package/public/dist/assets/{folder-drag-payload-CJ0dxhZa.js → folder-drag-payload-BhV9yzhH.js} +0 -0
- /package/public/dist/assets/{fortran-yg6K9z9n.js → fortran-Bt6PBEDR.js} +0 -0
- /package/public/dist/assets/{gas-fbsH19hy.js → gas-BHEdbvp9.js} +0 -0
- /package/public/dist/assets/{gherkin-BCy9haeT.js → gherkin-oBAE_ms0.js} +0 -0
- /package/public/dist/assets/{haskell-Dq28dVw2.js → haskell-BRsoo5mP.js} +0 -0
- /package/public/dist/assets/{http-B3zr0y0o.js → http-CLVgA2GD.js} +0 -0
- /package/public/dist/assets/{idl-C9CL9hdG.js → idl-BUZw3wgd.js} +0 -0
- /package/public/dist/assets/{julia-CjwfSXBk.js → julia-CQfgDRfP.js} +0 -0
- /package/public/dist/assets/{livescript-vRjI6jFU.js → livescript-BXxG0Yva.js} +0 -0
- /package/public/dist/assets/{locale-DC-ZsWOf.js → locale-B9w_kUtW.js} +0 -0
- /package/public/dist/assets/{mathematica-DJZPFt8k.js → mathematica-u8YMmbU0.js} +0 -0
- /package/public/dist/assets/{mbox-CxBBnlIA.js → mbox-BEMVcqjs.js} +0 -0
- /package/public/dist/assets/{mirc-CBWc0vcU.js → mirc-C9zpzAZU.js} +0 -0
- /package/public/dist/assets/{mllike-DYddHpeS.js → mllike-B45xgp2S.js} +0 -0
- /package/public/dist/assets/{modelica-B94rrYMn.js → modelica-CqHI_q-D.js} +0 -0
- /package/public/dist/assets/{mscgen-D0PO0iPT.js → mscgen-qgSLujhx.js} +0 -0
- /package/public/dist/assets/{octave-DeJPElAr.js → octave-D2Q8cUp1.js} +0 -0
- /package/public/dist/assets/{oz-4dtXWqwe.js → oz-BwTct_5T.js} +0 -0
- /package/public/dist/assets/{pascal-TdeXcL-o.js → pascal-Dp_KdFgX.js} +0 -0
- /package/public/dist/assets/{path-utils-QbjARuCC.js → path-utils-B6vBr0DD.js} +0 -0
- /package/public/dist/assets/{pig-xQ4essgV.js → pig-AF4Hwhju.js} +0 -0
- /package/public/dist/assets/{properties-CrJLOvU2.js → properties-C357ku5U.js} +0 -0
- /package/public/dist/assets/{protobuf-BYv78GYU.js → protobuf-D1ij_kNL.js} +0 -0
- /package/public/dist/assets/{provider-icons-CXA2mnPO.js → provider-icons-Det0fC-4.js} +0 -0
- /package/public/dist/assets/{q-BrTIu4PU.js → q-B9NhS7L_.js} +0 -0
- /package/public/dist/assets/{rpm-D8Wbdep5.js → rpm-gpDK5sbt.js} +0 -0
- /package/public/dist/assets/{sas-Ch1GEx-n.js → sas-C2OyD2Y6.js} +0 -0
- /package/public/dist/assets/{settings-types-DPhhM-cj.js → settings-types-B09BmpYe.js} +0 -0
- /package/public/dist/assets/{smalltalk-ChbxX23N.js → smalltalk-BLp5-jwC.js} +0 -0
- /package/public/dist/assets/{sparql-D9wgprRx.js → sparql-Dz-mlCAC.js} +0 -0
- /package/public/dist/assets/{spreadsheet-BySehl32.js → spreadsheet-CTIncYxj.js} +0 -0
- /package/public/dist/assets/{swift-DZwxTp-L.js → swift-DKB6_1j6.js} +0 -0
- /package/public/dist/assets/{tcl-BSOjIY_8.js → tcl-BGfruO1u.js} +0 -0
- /package/public/dist/assets/{tiddlywiki-B8jhOxrf.js → tiddlywiki-VlUiK86J.js} +0 -0
- /package/public/dist/assets/{troff-vE5gOX7Y.js → troff-C2dAgh7P.js} +0 -0
- /package/public/dist/assets/{vb-Cii5IQTv.js → vb-BthdM_4N.js} +0 -0
- /package/public/dist/assets/{vbscript-DcZWGZ_S.js → vbscript-D9f6rSsU.js} +0 -0
- /package/public/dist/assets/{velocity-BEag7EnK.js → velocity-CqftRsjg.js} +0 -0
- /package/public/dist/assets/{vendor-icons-Begb5v1n.js → vendor-icons-CNcMX6Ac.js} +0 -0
- /package/public/dist/assets/{w3c-keyname-hgmz1BF7.js → w3c-keyname-BOAvb0qz.js} +0 -0
- /package/public/dist/assets/{webidl-CjehKbx5.js → webidl-D5jiJvOU.js} +0 -0
- /package/public/dist/assets/{yacas-ClBNsli2.js → yacas-CXXgtw0p.js} +0 -0
|
@@ -1,151 +1,264 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* What it cannot see is a computed specifier — `import(someVariable)`. The
|
|
12
|
-
* authors knew, which is why RUNTIME_LOADED exists as a manual escape hatch
|
|
13
|
-
* with exactly one entry. Any future dynamic import that nobody remembers to
|
|
14
|
-
* register reproduces the incident in a new shape.
|
|
15
|
-
*
|
|
16
|
-
* This closes that by construction: after the bundle exists, actually import
|
|
17
|
-
* the modules whose failure was invisible last time. A dashboard returning 200
|
|
18
|
-
* never proved the Telegram bot could load; importing it does.
|
|
19
|
-
*
|
|
20
|
-
* Usage: node scripts/check-sidecar-smoke.mjs [--server-root <dir>]
|
|
21
|
-
*/
|
|
22
|
-
import { existsSync, mkdtempSync, rmSync } from 'node:fs';
|
|
23
|
-
import { join, resolve } from 'node:path';
|
|
24
|
-
import { pathToFileURL } from 'node:url';
|
|
25
|
-
import { spawnSync } from 'node:child_process';
|
|
26
|
-
import { tmpdir } from 'node:os';
|
|
2
|
+
/** Actual target-Node import/startup smoke; skipped, timed out and failed are distinct. */
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import http from 'node:http';
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
import { SMOKE_CASES } from './sidecar-smoke-probe.mjs';
|
|
27
11
|
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
console.error('❌ --server-root requires a directory argument');
|
|
36
|
-
process.exit(2);
|
|
37
|
-
}
|
|
38
|
-
const serverRoot = resolve(explicitServerRoot ? args[rootIndex + 1] : 'electron/sidecar/server');
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Entry surfaces whose load failure would be silent in a running app: each is
|
|
42
|
-
* reached only on a specific user action, so a healthy dashboard says nothing
|
|
43
|
-
* about them. `telegram/bot.js` is the exact module the v2.2.10 prune broke.
|
|
44
|
-
*/
|
|
45
|
-
const CRITICAL_MODULES = [
|
|
46
|
-
'dist/src/telegram/bot.js',
|
|
47
|
-
'dist/server.js',
|
|
48
|
-
'dist/src/manager/server.js',
|
|
49
|
-
];
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Exit code 3 = "nothing to check". The caller must NOT report this as a pass:
|
|
53
|
-
* a gate that says "imports verified" when it imported nothing is the same
|
|
54
|
-
* dishonest-green this script exists to eliminate.
|
|
55
|
-
*/
|
|
56
|
-
const EXIT_SKIPPED = 3;
|
|
12
|
+
const childEntry=fileURLToPath(new URL('./sidecar-smoke-probe.mjs',import.meta.url));
|
|
13
|
+
const MAX_OUTPUT=4*1024*1024;
|
|
14
|
+
const pause=ms=>new Promise(resolve=>setTimeout(resolve,ms));
|
|
15
|
+
function inside(root,file){const rel=path.relative(root,file);return !rel||(!rel.startsWith('..'+path.sep)&&rel!=='..'&&!path.isAbsolute(rel));}
|
|
16
|
+
function safeDirectory(value){const root=fs.realpathSync(value);if(!fs.statSync(root).isDirectory())throw Error('Server root is not a directory');return root;}
|
|
17
|
+
function redact(value){return value.replace(/\x1b\[[0-?]*[ -/]*[@-~]/g,'').replace(/(\bAuth:\s*)\S+/g,'$1[REDACTED]')
|
|
18
|
+
.replace(/(Bearer\s+)[A-Za-z0-9._~+/-]+/gi,'$1[REDACTED]').replace(/\b(?:sk-|ghp_|gho_)[A-Za-z0-9_-]{8,}/g,'[REDACTED]');}
|
|
57
19
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
20
|
+
async function treeIdentity(root){
|
|
21
|
+
const digest=createHash('sha256');let files=0,bytes=0;
|
|
22
|
+
async function walk(dir){
|
|
23
|
+
for(const name of fs.readdirSync(dir).sort()){
|
|
24
|
+
const file=path.join(dir,name),rel=path.relative(root,file),stat=fs.lstatSync(file);
|
|
25
|
+
if(stat.isSymbolicLink()){
|
|
26
|
+
const link=fs.readlinkSync(file);
|
|
27
|
+
if(path.isAbsolute(link)||!inside(root,path.resolve(path.dirname(file),link)))throw Error('Non-relocatable artifact symlink');
|
|
28
|
+
if(fs.existsSync(file)&&!inside(root,fs.realpathSync(file)))throw Error('Artifact symlink escapes root');
|
|
29
|
+
digest.update(`${rel}\0link\0${link}\0`);files++;continue;
|
|
30
|
+
}
|
|
31
|
+
if(stat.isDirectory()){await walk(file);continue;}
|
|
32
|
+
if(!stat.isFile())throw Error('Unsupported artifact file type');
|
|
33
|
+
const content=createHash('sha256');for await(const chunk of fs.createReadStream(file))content.update(chunk);
|
|
34
|
+
digest.update(`${rel}\0${stat.mode&0o777}\0${content.digest('hex')}\0`);files++;bytes+=stat.size;
|
|
35
|
+
}
|
|
65
36
|
}
|
|
66
|
-
|
|
67
|
-
process.exit(EXIT_SKIPPED);
|
|
37
|
+
await walk(root);return {sha256:digest.digest('hex'),files,bytes};
|
|
68
38
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
// Redirect the probe's home to a throwaway directory. Importing these modules
|
|
75
|
-
// regenerates AGENTS.md and touches the DB; a gate must not mutate the
|
|
76
|
-
// developer's real ~/.cli-jaw just by checking that the bundle loads.
|
|
77
|
-
const probeHome = mkdtempSync(join(tmpdir(), 'jaw-smoke-home-'));
|
|
78
|
-
|
|
79
|
-
for (const relative of CRITICAL_MODULES) {
|
|
80
|
-
const target = join(serverRoot, relative);
|
|
81
|
-
if (!existsSync(target)) {
|
|
82
|
-
failures.push(`${relative}: not present in the bundle`);
|
|
83
|
-
continue;
|
|
39
|
+
function noAncestorPackages(root){
|
|
40
|
+
for(let dir=path.dirname(root);;dir=path.dirname(dir)){
|
|
41
|
+
if(fs.existsSync(path.join(dir,'node_modules')))throw Error('Execution tree has a host node_modules ancestor');
|
|
42
|
+
if(path.dirname(dir)===dir)break;
|
|
84
43
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
44
|
+
}
|
|
45
|
+
function makeEnvironment(root,item,ports,node){
|
|
46
|
+
const roots={HOME:'home',TMPDIR:'tmp',CLI_JAW_HOME:item.role,CLI_JAW_DASHBOARD_HOME:'dashboard',
|
|
47
|
+
XDG_CONFIG_HOME:'xdg/config',XDG_CACHE_HOME:'xdg/cache',XDG_DATA_HOME:'xdg/data',XDG_STATE_HOME:'xdg/state',
|
|
48
|
+
CODEX_HOME:'providers/codex',CLAUDE_CONFIG_DIR:'providers/claude',PI_CODING_AGENT_DIR:'providers/pi',
|
|
49
|
+
USERPROFILE:'home',APPDATA:'xdg/data',LOCALAPPDATA:'xdg/cache',TEMP:'tmp',TMP:'tmp'};
|
|
50
|
+
for(const suffix of [...Object.values(roots),'worker','manager','project','electron/userData','electron/sessionData','electron/logs','electron/crashDumps'])
|
|
51
|
+
fs.mkdirSync(path.join(root,suffix),{recursive:true,mode:0o700});
|
|
52
|
+
const osPaths=process.platform==='win32'?[path.join(process.env['SystemRoot']??process.env['SYSTEMROOT']??'C:\\Windows','System32')]:['/usr/bin','/bin','/usr/sbin','/sbin'];
|
|
53
|
+
const env={PATH:[path.dirname(node),...osPaths].join(path.delimiter),LANG:'en_US.UTF-8',LC_ALL:'C',NO_COLOR:'1',
|
|
54
|
+
CLI_JAW_ISOLATED_QA_ROOT:root,DASHBOARD_SCAN_FROM:String(ports.worker),DASHBOARD_PORT:String(ports.manager),
|
|
55
|
+
DASHBOARD_PREVIEW_FROM:String(ports.preview),DASHBOARD_SCAN_COUNT:'1',PORT:String(ports.worker),HOST:'127.0.0.1',
|
|
56
|
+
CLI_JAW_SKIP_AUTOMATION_PRIME:'1',JAW_OPEN_BROWSER:'0',JAW_DASHBOARD_OPEN:'0',JAW_SKILLS_SOURCE:'local'};
|
|
57
|
+
for(const key of ['SystemRoot','SYSTEMROOT','WINDIR','ComSpec','COMSPEC','PATHEXT'])if(process.env[key]!==undefined)env[key]=process.env[key];
|
|
58
|
+
for(const [key,suffix] of Object.entries(roots))env[key]=path.join(root,suffix);
|
|
59
|
+
fs.writeFileSync(path.join(env.CLI_JAW_HOME,'settings.json'),JSON.stringify({workingDir:path.join(root,'project'),
|
|
60
|
+
permissions:'auto',messaging:{enabledChannels:[]},memory:{enabled:false}}),{mode:0o600});
|
|
61
|
+
fs.writeFileSync(path.join(env.CLI_JAW_HOME,'mcp.json'),'{"servers":{}}',{mode:0o600});
|
|
62
|
+
return env;
|
|
63
|
+
}
|
|
64
|
+
async function ownPort(onRequest){
|
|
65
|
+
const server=http.createServer(onRequest);await new Promise((resolve,reject)=>{server.once('error',reject);server.listen(0,'127.0.0.1',resolve);});
|
|
66
|
+
return {server,port:server.address().port};
|
|
67
|
+
}
|
|
68
|
+
async function closePort(slot){
|
|
69
|
+
slot.server.closeAllConnections();if(!slot.server.listening)return;
|
|
70
|
+
await new Promise((resolve,reject)=>{
|
|
71
|
+
const timer=setTimeout(()=>reject(Error('Owned listener did not close')),5000);
|
|
72
|
+
slot.server.close(error=>{clearTimeout(timer);error?reject(error):resolve();});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async function portAbsent(port){
|
|
76
|
+
const server=http.createServer();
|
|
77
|
+
try{await new Promise((resolve,reject)=>{server.once('error',reject);server.listen(port,'127.0.0.1',resolve);});return true;}
|
|
78
|
+
catch{return false;}finally{if(server.listening)await new Promise(resolve=>server.close(resolve));}
|
|
79
|
+
}
|
|
80
|
+
async function health(url){
|
|
81
|
+
const response=await fetch(url,{redirect:'error',signal:AbortSignal.timeout(2000)});
|
|
82
|
+
if(response.status!==200)throw Error(`Health HTTP ${response.status}`);
|
|
83
|
+
const reader=response.body?.getReader();if(!reader)throw Error('Health response has no body');
|
|
84
|
+
let bytes=0;const chunks=[];
|
|
85
|
+
try{while(true){const {done,value}=await reader.read();if(done)break;bytes+=value.length;if(bytes>32768)throw Error('Health body overflow');chunks.push(value);}}
|
|
86
|
+
finally{await reader.cancel().catch(()=>{});}
|
|
87
|
+
return JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
88
|
+
}
|
|
116
89
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
90
|
+
async function probe(executionRoot,runRoot,item,timeoutMs,shutdownMs){
|
|
91
|
+
const root=fs.realpathSync(fs.mkdtempSync(path.join(runRoot,`${item.id}-`)));
|
|
92
|
+
const row={id:item.id,kind:item.kind,root,ok:false,closed:false,imported:false,listening:false,httpReady:false,stopAcknowledged:false,issues:[]};
|
|
93
|
+
const slots=[];let child,retired=false,pid,code=null,signal=null,output='',outputBytes=0,messages=0,stopSent=false;
|
|
94
|
+
const fail=reason=>{if(!row.issues.includes(reason)&&row.issues.length<32)row.issues.push(reason);};
|
|
95
|
+
const sendSignal=name=>{
|
|
96
|
+
if(!child||retired||!pid||child.pid!==pid||child.exitCode!==null||child.signalCode!==null)return false;
|
|
97
|
+
try{if(!child.kill(name)){retired=true;return false;}return true;}catch{retired=true;fail('signal failure');return false;}
|
|
98
|
+
};
|
|
99
|
+
try{
|
|
100
|
+
for(const role of ['worker','manager','preview'])slots.push(await ownPort((req,res)=>{
|
|
101
|
+
// Only a Manager's intentionally offline worker-health fixture is expected.
|
|
102
|
+
const expected=item.id==='manager'&&role==='worker'&&req.method==='GET'&&req.url==='/api/health';
|
|
103
|
+
if(!expected)fail('unexpected auxiliary-port request');
|
|
104
|
+
res.writeHead(expected?503:404,{'content-type':'application/json'}).end('{"ok":false}');
|
|
105
|
+
}));
|
|
106
|
+
const ports={worker:slots[0].port,manager:slots[1].port,preview:slots[2].port};
|
|
107
|
+
const primary=item.role==='worker'?ports.worker:ports.manager;
|
|
108
|
+
const node=path.join(executionRoot,process.platform==='win32'?'node.exe':'node');
|
|
109
|
+
const env=makeEnvironment(root,item,ports,node),nonce=randomBytes(24).toString('hex');
|
|
110
|
+
await closePort(slots[item.role==='worker'?0:1]);
|
|
111
|
+
row.command=[node,childEntry,executionRoot,item.id,nonce];row.ports=ports;row.environmentKeys=Object.keys(env).sort();
|
|
112
|
+
child=spawn(node,[childEntry,executionRoot,item.id,nonce],{cwd:path.join(root,'project'),env,detached:process.platform!=='win32',stdio:['ignore','pipe','pipe','ipc']});
|
|
113
|
+
pid=child.pid;row.pid=pid??null;
|
|
114
|
+
child.once('error',error=>{retired=true;fail(`spawn/error:${error.code??'unknown'}`);});
|
|
115
|
+
child.once('exit',(value,sig)=>{retired=true;code=value;signal=sig;});
|
|
116
|
+
child.once('close',(value,sig)=>{retired=true;row.closed=true;code=value;signal=sig;});
|
|
117
|
+
child.on('message',value=>{
|
|
118
|
+
if(row.closed)return;
|
|
119
|
+
if(++messages>32||!value||typeof value!=='object'||Array.isArray(value)||Buffer.byteLength(JSON.stringify(value))>32768){fail('IPC bound/shape');return;}
|
|
120
|
+
const allowed=['version','caseId','nonce','kind','pid','node','executable','platform','arch','port','address','error'];
|
|
121
|
+
if(Object.keys(value).some(key=>!allowed.includes(key))||value.version!==1||value.caseId!==item.id||value.nonce!==nonce||value.pid!==pid){fail('IPC identity');return;}
|
|
122
|
+
if(value.kind==='error'){fail(`child:${String(value.error).slice(0,120)}`);return;}
|
|
123
|
+
if(value.kind==='imported'){
|
|
124
|
+
const key=file=>process.platform==='win32'?path.normalize(file).toLowerCase():path.normalize(file);
|
|
125
|
+
if(row.imported||typeof value.node!=='string'||typeof value.executable!=='string'||key(value.executable)!==key(node)){fail('duplicate/invalid import receipt');return;}
|
|
126
|
+
row.imported=true;row.node=value.node;row.executable=value.executable;row.platform=value.platform;row.arch=value.arch;
|
|
127
|
+
}else if(value.kind==='listening'){
|
|
128
|
+
if(row.listening||item.kind!=='server'||value.port!==primary||value.address!=='127.0.0.1'){fail('listener identity');return;}
|
|
129
|
+
row.listening=true;
|
|
130
|
+
}else if(value.kind==='stopping'){
|
|
131
|
+
if(!stopSent||row.stopAcknowledged){fail('unexpected stop receipt');return;}row.stopAcknowledged=true;
|
|
132
|
+
}else fail('unknown IPC kind');
|
|
133
|
+
});
|
|
134
|
+
const receive=chunk=>{outputBytes+=chunk.length;if(outputBytes>MAX_OUTPUT){fail('output overflow');return;}output+=chunk.toString();};
|
|
135
|
+
child.stdout.on('data',receive);child.stderr.on('data',receive);
|
|
136
|
+
const deadline=Date.now()+timeoutMs;let stopDeadline;
|
|
137
|
+
while(!row.closed&&!row.issues.length){
|
|
138
|
+
if(Date.now()>=(stopDeadline??deadline)){fail(stopSent?'stop timeout':'startup/completion timeout');break;}
|
|
139
|
+
if(item.kind==='server'&&row.imported&&row.listening&&!stopSent){
|
|
140
|
+
const body=await health(`http://127.0.0.1:${primary}${item.healthPath}`);
|
|
141
|
+
if(row.closed||body.ok!==true)throw Error('Health did not confirm a live application');
|
|
142
|
+
if(item.id==='manager'&&(body.pid!==pid||body.port!==primary||body.rangeFrom!==ports.worker||body.rangeTo!==ports.worker))throw Error('Manager health identity mismatch');
|
|
143
|
+
if(item.id==='worker'&&typeof body.version!=='string')throw Error('Worker health version missing');
|
|
144
|
+
row.httpReady=true;row.health=body;stopSent=true;stopDeadline=Date.now()+shutdownMs;
|
|
145
|
+
child.send({kind:'stop',caseId:item.id,nonce},error=>{if(error)fail('stop dispatch failed');});
|
|
146
|
+
}
|
|
147
|
+
await pause(10);
|
|
148
|
+
}
|
|
149
|
+
if(item.kind==='server'&&(!row.httpReady||!row.stopAcknowledged))fail('server exited before owned readiness/stop');
|
|
150
|
+
if(!row.imported)fail('no import completion');
|
|
151
|
+
}catch(error){fail(String(error.message??error).slice(0,240));}
|
|
152
|
+
finally{
|
|
153
|
+
if(child&&!row.closed){
|
|
154
|
+
sendSignal('SIGTERM');let until=Date.now()+shutdownMs;
|
|
155
|
+
while(!row.closed&&Date.now()<until)await pause(10);
|
|
156
|
+
if(!row.closed){fail('unproven cooperative cleanup');sendSignal('SIGKILL');until=Date.now()+shutdownMs;while(!row.closed&&Date.now()<until)await pause(10);}
|
|
157
|
+
if(!row.closed){fail('child close unproven');child.stdout?.destroy();child.stderr?.destroy();child.disconnect?.();child.unref();}
|
|
131
158
|
}
|
|
132
|
-
|
|
159
|
+
for(const slot of slots)try{await closePort(slot);}catch{fail('auxiliary close unproven');}
|
|
160
|
+
row.portsAbsent=[];for(const slot of slots)row.portsAbsent.push(await portAbsent(slot.port));
|
|
161
|
+
row.groupAbsent=process.platform==='win32'?null:false;
|
|
162
|
+
if(process.platform!=='win32'&&pid){try{process.kill(-pid,0);}catch(error){if(error.code==='ESRCH')row.groupAbsent=true;}}
|
|
163
|
+
const ledger=path.join(root,'boundary.jsonl');
|
|
164
|
+
try{
|
|
165
|
+
if(fs.existsSync(ledger)&&fs.statSync(ledger).size>1024*1024)throw Error('Boundary file overflow');
|
|
166
|
+
row.boundary=fs.existsSync(ledger)?fs.readFileSync(ledger,'utf8').trim().split('\n').filter(Boolean).map(line=>JSON.parse(line)):[];
|
|
167
|
+
}
|
|
168
|
+
catch{row.boundary=[];fail('boundary evidence unreadable');}
|
|
169
|
+
const pending=new Set();
|
|
170
|
+
for(const event of row.boundary){
|
|
171
|
+
if(!event||!['metadata','blocked-credential','unavailable-discovery','forbidden-process','forbidden-network','forbidden-listener','fetch','boundary-overflow'].includes(event.kind)){
|
|
172
|
+
fail('unknown boundary record');continue;
|
|
173
|
+
}
|
|
174
|
+
if(event.phase==='start')pending.add(event.ticket);if(event.phase==='closed')pending.delete(event.ticket);
|
|
175
|
+
if(['forbidden-process','forbidden-network','forbidden-listener','boundary-overflow'].includes(event.kind))fail(event.kind);
|
|
176
|
+
}
|
|
177
|
+
if(pending.size)fail('metadata child completion unproven');
|
|
178
|
+
row.exitCode=code;row.signal=signal;row.outputBytes=outputBytes;row.output=redact(output);row.rootRemoved=false;
|
|
179
|
+
if(!row.closed||code!==0||signal||row.groupAbsent===false||row.portsAbsent.some(value=>!value))fail('runtime cleanup not certified');
|
|
180
|
+
row.ok=row.issues.length===0;
|
|
133
181
|
}
|
|
134
|
-
|
|
182
|
+
return row;
|
|
135
183
|
}
|
|
136
184
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
185
|
+
export async function runSidecarSmoke(options){
|
|
186
|
+
const timeoutMs=options.timeoutMs??30000,shutdownMs=options.shutdownMs??5000;
|
|
187
|
+
if(!Number.isFinite(timeoutMs)||timeoutMs<=0||timeoutMs>30000||!Number.isFinite(shutdownMs)||shutdownMs<=0||shutdownMs>5000)throw Error('Invalid bounded smoke deadline');
|
|
188
|
+
const source=safeDirectory(options.serverRoot);
|
|
189
|
+
if(fs.existsSync(path.join(source,'.env')))throw Error('Artifact .env is forbidden');
|
|
190
|
+
let requestedReport;
|
|
191
|
+
if(options.reportPath!==undefined){
|
|
192
|
+
if(typeof options.reportPath!=='string'||!options.reportPath)throw Error('Invalid report path');
|
|
193
|
+
const candidate=path.resolve(options.reportPath);
|
|
194
|
+
requestedReport=path.join(fs.realpathSync(path.dirname(candidate)),path.basename(candidate));
|
|
195
|
+
if(inside(source,requestedReport))throw Error('Report destination must be outside the original artifact');
|
|
196
|
+
}
|
|
197
|
+
const temporary=fs.realpathSync(os.tmpdir());
|
|
198
|
+
if(inside(source,temporary))throw Error('Smoke temp directory must be outside the original artifact');
|
|
199
|
+
const node=path.join(source,process.platform==='win32'?'node.exe':'node');
|
|
200
|
+
for(const file of [node,path.join(source,'dist/src/shared/isolated-qa.js'),...SMOKE_CASES.map(item=>path.join(source,item.relative))])
|
|
201
|
+
if(!fs.statSync(file).isFile())throw Error('Required sidecar input is missing');
|
|
202
|
+
fs.accessSync(node,fs.constants.X_OK);
|
|
203
|
+
const runRoot=fs.realpathSync(fs.mkdtempSync(path.join(temporary,'jaw-sidecar-smoke-')));
|
|
204
|
+
const reportPath=requestedReport??path.join(runRoot,'report.json');
|
|
205
|
+
// Reserve before executing anything; never overwrite an existing result.
|
|
206
|
+
let reportFd;try{reportFd=fs.openSync(reportPath,'wx',0o600);}catch(error){fs.rmSync(runRoot,{recursive:true});throw error;}
|
|
207
|
+
const executionRoot=path.join(runRoot,'artifact');const result={ok:false,code:1,reportPath,runRoot,source,probes:[]};
|
|
208
|
+
try{
|
|
209
|
+
noAncestorPackages(executionRoot);
|
|
210
|
+
result.original=await treeIdentity(source);
|
|
211
|
+
await fs.promises.cp(source,executionRoot,{recursive:true,dereference:false,verbatimSymlinks:true,mode:fs.constants.COPYFILE_FICLONE});
|
|
212
|
+
const copied=await treeIdentity(executionRoot);
|
|
213
|
+
if(JSON.stringify(copied)!==JSON.stringify(result.original))throw Error('Artifact copy identity mismatch');
|
|
214
|
+
result.executionRoot=executionRoot;
|
|
215
|
+
for(const item of SMOKE_CASES){
|
|
216
|
+
const row=await probe(executionRoot,runRoot,item,timeoutMs,shutdownMs);result.probes.push(row);
|
|
217
|
+
if(JSON.stringify(await treeIdentity(executionRoot))!==JSON.stringify(copied)){row.ok=false;row.issues.push('artifact changed during execution');}
|
|
218
|
+
if(!row.closed||row.groupAbsent===false)break;
|
|
219
|
+
}
|
|
220
|
+
result.originalAfter=await treeIdentity(source);
|
|
221
|
+
if(JSON.stringify(result.originalAfter)!==JSON.stringify(result.original))throw Error('Original artifact changed during smoke');
|
|
222
|
+
result.ok=result.probes.length===SMOKE_CASES.length&&result.probes.every(row=>row.ok);result.code=result.ok?0:1;
|
|
223
|
+
}catch(error){result.error=String(error.message??error).slice(0,500);}
|
|
224
|
+
// Full evidence precedes payload deletion. Reports are intentionally retained.
|
|
225
|
+
try{fs.writeFileSync(reportFd,JSON.stringify(result,null,2));fs.fsyncSync(reportFd);}finally{fs.closeSync(reportFd);}
|
|
226
|
+
const cleanup={reportPath,removed:[],retained:[],ok:result.ok};
|
|
227
|
+
if(result.ok){
|
|
228
|
+
for(const dir of [...result.probes.map(row=>row.root),executionRoot]){
|
|
229
|
+
try{fs.rmSync(dir,{recursive:true});cleanup.removed.push(dir);}catch{cleanup.retained.push(dir);cleanup.ok=false;}
|
|
230
|
+
}
|
|
231
|
+
}else cleanup.retained=[...result.probes.map(row=>row.root),executionRoot];
|
|
232
|
+
fs.writeFileSync(reportPath+'.cleanup.json',JSON.stringify(cleanup,null,2),{flag:'wx',mode:0o600});
|
|
233
|
+
if(!cleanup.ok){result.ok=false;result.code=1;}
|
|
234
|
+
return {...result,probes:result.probes.map(row=>({...row,rootRemoved:!fs.existsSync(row.root)})),cleanup};
|
|
141
235
|
}
|
|
142
236
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
process.exit(1);
|
|
237
|
+
function parseArgs(args){
|
|
238
|
+
const options={};for(let i=0;i<args.length;i++){
|
|
239
|
+
const flag=args[i];if(!['--server-root','--report'].includes(flag)||options[flag]!==undefined||!args[i+1]||args[i+1].startsWith('--'))throw Error('Invalid sidecar smoke arguments');
|
|
240
|
+
options[flag]=args[++i];
|
|
241
|
+
}return options;
|
|
149
242
|
}
|
|
150
|
-
|
|
151
|
-
|
|
243
|
+
async function main(argv){
|
|
244
|
+
const usage='Usage: check-sidecar-smoke.mjs [--server-root DIR] [--report NEW_FILE]';
|
|
245
|
+
if(argv.length===1&&['--help','-h'].includes(argv[0])){console.log(usage);return;}
|
|
246
|
+
let args;
|
|
247
|
+
try{args=parseArgs(argv);}
|
|
248
|
+
catch(error){console.error(`${String(error.message??error)}\n${usage}`);process.exitCode=2;return;}
|
|
249
|
+
try{
|
|
250
|
+
const root=path.resolve(args['--server-root']??'electron/sidecar/server');
|
|
251
|
+
if(!fs.existsSync(root)){
|
|
252
|
+
if(args['--server-root']||process.env['JAW_GATE_REQUIRE_SIDECAR']==='1'){
|
|
253
|
+
console.error(`Sidecar not bundled at ${root}, but the caller required a real smoke test`);process.exitCode=1;
|
|
254
|
+
}else{
|
|
255
|
+
console.log(`Sidecar not bundled at ${root} — skipping smoke; SKIPPED (not verified, nothing imported)`);process.exitCode=3;
|
|
256
|
+
}
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
const result=await runSidecarSmoke({serverRoot:root,reportPath:args['--report']});
|
|
260
|
+
console.log(`Sidecar smoke ${result.ok?'PASS':'FAIL'}: ${result.probes.length} critical surfaces; report ${result.reportPath}`);
|
|
261
|
+
process.exitCode=result.code;
|
|
262
|
+
}catch(error){console.error(`Sidecar smoke failed: ${String(error.message??error)}`);process.exitCode=1;}
|
|
263
|
+
}
|
|
264
|
+
if(process.argv[1]&&path.resolve(process.argv[1])===fileURLToPath(import.meta.url))await main(process.argv.slice(2));
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/** Private child boundary of the sidecar smoke CLI; catalogue import is inert. */
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import net from 'node:net';
|
|
5
|
+
import childProcess from 'node:child_process';
|
|
6
|
+
import { syncBuiltinESMExports } from 'node:module';
|
|
7
|
+
import { promisify } from 'node:util';
|
|
8
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
9
|
+
|
|
10
|
+
export const SMOKE_CASES = Object.freeze([
|
|
11
|
+
Object.freeze({ id:'telegram', relative:'dist/src/telegram/bot.js', kind:'import', role:'worker', healthPath:null }),
|
|
12
|
+
Object.freeze({ id:'worker', relative:'dist/server.js', kind:'server', role:'worker', healthPath:'/api/health' }),
|
|
13
|
+
Object.freeze({ id:'manager', relative:'dist/src/manager/server.js', kind:'server', role:'manager', healthPath:'/api/dashboard/health' }),
|
|
14
|
+
]);
|
|
15
|
+
|
|
16
|
+
async function runChild() {
|
|
17
|
+
const [root, id, nonce] = process.argv.slice(2);
|
|
18
|
+
if (process.argv.length!==5 || !root || fs.realpathSync(root)!==root || !/^[a-f0-9]{48}$/.test(nonce??'')) throw Error('Invalid smoke child input');
|
|
19
|
+
const item=SMOKE_CASES.find(value=>value.id===id); if(!item)throw Error('Unknown smoke case');
|
|
20
|
+
if(!process.send || !process.connected)throw Error('Smoke requires its private IPC channel');
|
|
21
|
+
if(fs.existsSync(path.join(root,'.env')))throw Error('Artifact .env is forbidden');
|
|
22
|
+
const {readIsolatedQaPolicy,isolatedQaEnvironment}=await import(pathToFileURL(path.join(root,'dist/src/shared/isolated-qa.js')).href);
|
|
23
|
+
const policy=readIsolatedQaPolicy(process.env,item.role); if(!policy)throw Error('Missing isolated smoke policy');
|
|
24
|
+
const cleanEnv=isolatedQaEnvironment(policy,process.env);
|
|
25
|
+
cleanEnv['HOST']='127.0.0.1';
|
|
26
|
+
for(const key of Object.keys(process.env))delete process.env[key];
|
|
27
|
+
Object.assign(process.env,cleanEnv);
|
|
28
|
+
const ledger=path.join(policy.root,'boundary.jsonl');
|
|
29
|
+
let records=0, sequence=0, stopping=false, boundaryFailed=false;
|
|
30
|
+
const message=(kind,data={})=>{
|
|
31
|
+
if(process.connected)process.send({version:1,caseId:id,nonce,kind,pid:process.pid,...data});
|
|
32
|
+
};
|
|
33
|
+
const record=data=>{
|
|
34
|
+
try {
|
|
35
|
+
if(++records<=256)fs.appendFileSync(ledger,JSON.stringify(data)+'\n',{mode:0o600});
|
|
36
|
+
else if(records===257)fs.appendFileSync(ledger,'{"kind":"boundary-overflow"}\n');
|
|
37
|
+
} catch(error) { boundaryFailed=true;message('error',{error:'boundary-write-failed'});throw error; }
|
|
38
|
+
};
|
|
39
|
+
process.on('exit',()=>{if(boundaryFailed)process.exitCode=1;});
|
|
40
|
+
const original={...childProcess};
|
|
41
|
+
const absent=path.join(policy.root,`.unavailable-${nonce}`);
|
|
42
|
+
const sysRoot=cleanEnv['SystemRoot']??cleanEnv['SYSTEMROOT'];
|
|
43
|
+
const which=process.platform==='win32'?path.join(sysRoot??'','System32','where.exe'):'/usr/bin/which';
|
|
44
|
+
const ps=fs.existsSync('/bin/ps')?'/bin/ps':'/usr/bin/ps';
|
|
45
|
+
const powershell=path.join(sysRoot??'','System32','WindowsPowerShell','v1.0','powershell.exe');
|
|
46
|
+
function classify(command,args,opts) {
|
|
47
|
+
if(typeof command!=='string'||!args.every(value=>typeof value==='string')||opts.shell||opts.detached) return {kind:'forbidden-process'};
|
|
48
|
+
const base=path.basename(command).toLowerCase();
|
|
49
|
+
const name=/^[a-z0-9_-]+$/i;
|
|
50
|
+
if((command==='which'||command==='where.exe'||command===which)
|
|
51
|
+
&& ((args.length===1&&name.test(args[0]))||(args.length===2&&args[0]==='-a'&&name.test(args[1]))))
|
|
52
|
+
return {kind:'metadata',command:which,args:process.platform==='win32'?[args.at(-1)]:['-a',args.at(-1)]};
|
|
53
|
+
if((command==='ps'||command===ps)&&JSON.stringify(args)===JSON.stringify(['-o','lstart=','-p',String(process.pid)]))
|
|
54
|
+
return {kind:'metadata',command:ps,args};
|
|
55
|
+
if((command==='powershell.exe'||command===powershell)&&JSON.stringify(args)===JSON.stringify([
|
|
56
|
+
'-NoProfile','-NonInteractive','-Command',`(Get-Process -Id ${process.pid}).StartTime.ToFileTimeUtc()`]))
|
|
57
|
+
return {kind:'metadata',command:powershell,args};
|
|
58
|
+
if((command==='node'||(process.platform==='win32'&&command==='node.exe')||command===process.execPath)&&args.length===1&&args[0]==='--version')
|
|
59
|
+
return {kind:'metadata',command:process.execPath,args};
|
|
60
|
+
// Fresh memory bootstrap asks for these two owned-project facts. Keep
|
|
61
|
+
// them unavailable: no Git process, hooks, config or remote is consulted.
|
|
62
|
+
if(command==='git'&&args[0]==='-C'&&args[1]===path.join(policy.root,'project')
|
|
63
|
+
&& ((args.length===5&&args[2]==='remote'&&args[3]==='get-url'&&args[4]==='origin')
|
|
64
|
+
||(args.length===4&&args[2]==='branch'&&args[3]==='--show-current')))
|
|
65
|
+
return {kind:'unavailable-discovery'};
|
|
66
|
+
if((base==='security'&&['find-generic-password','find-internet-password'].includes(args[0]))
|
|
67
|
+
||(base==='gh'&&args[0]==='auth'&&args[1]==='token'))return {kind:'blocked-credential'};
|
|
68
|
+
if(args.length===1&&args[0]==='--version')return {kind:'unavailable-discovery'};
|
|
69
|
+
return {kind:'forbidden-process'};
|
|
70
|
+
}
|
|
71
|
+
function launch(method,command,args=[],opts={},callback,forcedKind) {
|
|
72
|
+
const choice=forcedKind?{kind:forcedKind}:classify(command,args,opts);
|
|
73
|
+
const ticket=++sequence;
|
|
74
|
+
record({kind:choice.kind,method,ticket,phase:'start'});
|
|
75
|
+
if(fs.existsSync(absent))throw Error('Unavailable executable path unexpectedly exists');
|
|
76
|
+
const selected=choice.command??absent;
|
|
77
|
+
const selectedArgs=choice.args??[];
|
|
78
|
+
const options={cwd:policy.home,env:{...cleanEnv},windowsHide:true,
|
|
79
|
+
timeout:Math.min(Number.isFinite(opts.timeout)&&opts.timeout>0?opts.timeout:3000,5000),
|
|
80
|
+
maxBuffer:Math.min(Number.isFinite(opts.maxBuffer)&&opts.maxBuffer>0?opts.maxBuffer:65536,262144),
|
|
81
|
+
...(opts.encoding===undefined?{}:{encoding:opts.encoding})};
|
|
82
|
+
if(method==='execFileSync'||method==='spawnSync') {
|
|
83
|
+
try {return original[method](selected,selectedArgs,options);}
|
|
84
|
+
finally {record({kind:choice.kind,method,ticket,phase:'closed'});}
|
|
85
|
+
}
|
|
86
|
+
const child=method==='spawn'?original.spawn(selected,selectedArgs,{...options,stdio:['ignore','pipe','pipe']})
|
|
87
|
+
:original.execFile(selected,selectedArgs,options,callback);
|
|
88
|
+
record({kind:choice.kind,method,ticket,phase:'spawned',pid:child.pid??null});
|
|
89
|
+
child.once('close',()=>record({kind:choice.kind,method,ticket,phase:'closed'}));
|
|
90
|
+
return child;
|
|
91
|
+
}
|
|
92
|
+
const unpack=rest=>{
|
|
93
|
+
const args=Array.isArray(rest[0])?rest.shift():[];
|
|
94
|
+
const callback=typeof rest.at(-1)==='function'?rest.pop():undefined;
|
|
95
|
+
const opts=rest[0]&&typeof rest[0]==='object'?rest[0]:{};
|
|
96
|
+
return {args,opts,callback};
|
|
97
|
+
};
|
|
98
|
+
for(const method of ['execFileSync','spawnSync','execFile','spawn']) childProcess[method]=function(command,...rest) {
|
|
99
|
+
const {args,opts,callback}=unpack(rest);return launch(method,command,args,opts,callback);
|
|
100
|
+
};
|
|
101
|
+
for(const method of ['execSync','exec']) childProcess[method]=function(command,...rest) {
|
|
102
|
+
const {opts,callback}=unpack(rest);
|
|
103
|
+
const lookup=typeof command==='string'?/^(?:command -v|which(?: -a)?) ([a-z0-9_-]+)(?: 2>\/dev\/null)?$/i.exec(command):null;
|
|
104
|
+
if(lookup)return launch(method==='execSync'?'execFileSync':'execFile',which,[lookup[1]],opts,callback);
|
|
105
|
+
const credential=typeof command==='string'&&(command==='gh auth token'
|
|
106
|
+
||(/^security find-(?:generic|internet)-password(?: |$)/.test(command)&&!/[;&|<>`$()\r\n]/.test(command)));
|
|
107
|
+
const kind=credential?'blocked-credential':'forbidden-process';
|
|
108
|
+
return launch(method==='execSync'?'execFileSync':'execFile',absent,[],opts,callback,kind);
|
|
109
|
+
};
|
|
110
|
+
for(const method of ['exec','execFile'])Object.defineProperty(childProcess[method],promisify.custom,{value:(...args)=>{
|
|
111
|
+
let child;
|
|
112
|
+
const promise=new Promise((resolve,reject)=>{child=childProcess[method](...args,(error,stdout,stderr)=>{
|
|
113
|
+
if(error){Object.assign(error,{stdout,stderr});reject(error);}else resolve({stdout,stderr});
|
|
114
|
+
});});
|
|
115
|
+
promise.child=child;return promise;
|
|
116
|
+
}});
|
|
117
|
+
childProcess.fork=function(){record({kind:'forbidden-process',method:'fork'});throw Error('Smoke cannot fork application work');};
|
|
118
|
+
syncBuiltinESMExports();
|
|
119
|
+
|
|
120
|
+
const primary=item.role==='worker'?policy.workerPort:policy.managerPort;
|
|
121
|
+
const listenOriginal=net.Server.prototype.listen;
|
|
122
|
+
net.Server.prototype.listen=function(...args) {
|
|
123
|
+
const options=typeof args[0]==='object'&&args[0]!==null?args[0]:{port:args[0],host:args[1]};
|
|
124
|
+
if(item.kind!=='server'||Number(options.port)!==primary||options.host!=='127.0.0.1') {
|
|
125
|
+
record({kind:'forbidden-listener'});throw Error('Smoke listener outside primary loopback port');
|
|
126
|
+
}
|
|
127
|
+
this.once('listening',()=>{
|
|
128
|
+
const address=this.address();
|
|
129
|
+
if(!address||typeof address==='string'||address.port!==primary||address.address!=='127.0.0.1') {
|
|
130
|
+
record({kind:'forbidden-listener'});throw Error('Unexpected listener identity');
|
|
131
|
+
}
|
|
132
|
+
message('listening',{port:address.port,address:address.address});
|
|
133
|
+
});
|
|
134
|
+
return listenOriginal.apply(this,args);
|
|
135
|
+
};
|
|
136
|
+
const fetchOriginal=globalThis.fetch.bind(globalThis);
|
|
137
|
+
globalThis.fetch=(input,init)=>{
|
|
138
|
+
let url;try{url=new URL(input instanceof Request?input.url:String(input));}
|
|
139
|
+
catch{record({kind:'forbidden-network'});return Promise.reject(Error('Malformed smoke URL'));}
|
|
140
|
+
const method=init?.method??(input instanceof Request?input.method:'GET');
|
|
141
|
+
const allowed=url.protocol==='http:'&&['127.0.0.1','localhost','[::1]'].includes(url.hostname)
|
|
142
|
+
&&[policy.workerPort,policy.managerPort,policy.previewPort].includes(Number(url.port))&&method==='GET';
|
|
143
|
+
record({kind:allowed?'fetch':'forbidden-network',method,port:Number(url.port),path:(url.pathname+url.search).slice(0,512)});
|
|
144
|
+
if(!allowed)return Promise.reject(Error('Smoke egress refused'));
|
|
145
|
+
return fetchOriginal(input,{...init,redirect:'error'});
|
|
146
|
+
};
|
|
147
|
+
process.on('message',value=>{
|
|
148
|
+
if(!value||value.kind!=='stop'||value.caseId!==id||value.nonce!==nonce||stopping)return;
|
|
149
|
+
stopping=true;
|
|
150
|
+
process.send({version:1,caseId:id,nonce,kind:'stopping',pid:process.pid},error=>{
|
|
151
|
+
if(error||boundaryFailed)process.exit(1);
|
|
152
|
+
process.kill(process.pid,'SIGTERM'); // This executing process owns itself.
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
const fatal=error=>{
|
|
156
|
+
message('error',{error:String(error?.code??error?.name??'startup-error').slice(0,120)});
|
|
157
|
+
fs.writeSync(2,`Sidecar smoke child error: ${String(error?.message??error).slice(0,1000)}\n`);
|
|
158
|
+
process.exit(1);
|
|
159
|
+
};
|
|
160
|
+
process.once('uncaughtException',fatal);process.once('unhandledRejection',fatal);
|
|
161
|
+
await import(pathToFileURL(path.join(root,item.relative)).href);
|
|
162
|
+
if(boundaryFailed)throw Error('Boundary evidence unavailable');
|
|
163
|
+
const data={version:1,caseId:id,nonce,kind:'imported',pid:process.pid,node:process.version,executable:process.execPath,platform:process.platform,arch:process.arch};
|
|
164
|
+
await new Promise((resolve,reject)=>process.send(data,error=>error?reject(error):resolve()));
|
|
165
|
+
// Finite imports must exit naturally: a lingering initializer is not success.
|
|
166
|
+
if(item.kind==='import'&&process.connected)process.disconnect();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if(process.argv[1]&&path.resolve(process.argv[1])===fileURLToPath(import.meta.url)) {
|
|
170
|
+
runChild().catch(error=>{fs.writeSync(2,`Sidecar smoke bootstrap failed: ${String(error?.message??error).slice(0,1000)}\n`);process.exitCode=1;if(process.connected)process.disconnect();});
|
|
171
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-XQCOJYun.js";import{n as t,t as n}from"./jsx-runtime-CYoNlHAD.js";import{t as r}from"./error-normalize-CLRJh19F.js";import{a as i,i as a,n as o,r as s,t as c}from"./page-shell-DZ1lls_P.js";var l=e(t(),1),u=n();function d(e,t){let n=new Blob([t],{type:`application/json`}),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=e,i.click(),URL.revokeObjectURL(r)}function f(e){let t;try{t=JSON.parse(e)}catch(e){return{ok:!1,error:`Invalid JSON: ${e.message}`}}return!t||typeof t!=`object`||Array.isArray(t)?{ok:!1,error:`Import payload must be a JSON object.`}:{ok:!0,value:p(t)}}function p(e){let{settingsSchemaVersion:t,runtimeDefaultMigration:n,multiSessionDefaultMigration:r,slackEnvironmentVariables:i,...a}=e;return a}function m({port:e,client:t,triggerDownload:n}){let{state:m}=i(t,`/api/settings`),[h,g]=(0,l.useState)(!1),[_,v]=(0,l.useState)(``),[y,b]=(0,l.useState)(null),[x,S]=(0,l.useState)(!1),[C,w]=(0,l.useState)(null),T=n||d;(0,l.useEffect)(()=>{v(``),b(null),w(null)},[e]);let E=(0,l.useCallback)(()=>{m.kind===`ready`&&T(`cli-jaw-settings-${e}.json`,JSON.stringify(p(m.data),null,2))},[m,e,T]),D=(0,l.useCallback)(async()=>{let e=f(_);if(!e.ok){b(e.error),w(null);return}b(null),w(null),S(!0);try{await t.put(`/api/settings`,e.value),w(`Imported. Reload the page to refresh other tabs.`)}catch(e){b(r(e))}finally{S(!1)}},[t,_]);return m.kind===`loading`?(0,u.jsx)(o,{}):m.kind===`offline`?(0,u.jsx)(s,{port:e}):m.kind===`error`?(0,u.jsx)(c,{message:m.message}):(0,u.jsxs)(`div`,{className:`settings-page-form`,children:[(0,u.jsx)(a,{title:`Export`,hint:`Download the resolved /i/${e}/api/settings document as JSON.`,children:(0,u.jsx)(`button`,{type:`button`,className:`settings-action settings-action-secondary`,onClick:E,children:`Download settings JSON`})}),(0,u.jsxs)(a,{title:`Import (advanced)`,hint:`Replaces matching keys via PUT. Only enable when you understand the impact.`,children:[(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`advanced-toggle`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Show import controls`}),(0,u.jsx)(`input`,{id:`advanced-toggle`,type:`checkbox`,checked:h,onChange:e=>g(e.target.checked)})]}),h?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsxs)(`label`,{className:`settings-field`,htmlFor:`advanced-import`,children:[(0,u.jsx)(`span`,{className:`settings-field-label`,children:`Settings JSON`}),(0,u.jsx)(`textarea`,{id:`advanced-import`,rows:8,value:_,placeholder:`{"cli":"codex","tui":{"themeSeed":"jaw-dark"}}`,onChange:e=>v(e.target.value),"aria-invalid":!!y}),y?(0,u.jsx)(`span`,{className:`settings-field-error`,role:`alert`,children:y}):null,C?(0,u.jsx)(`span`,{className:`settings-field-description`,role:`status`,children:C}):null]}),(0,u.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void D(),disabled:x||_.trim()===``,children:x?`Importing…`:`Apply import`})]}):null]})]})}export{m as default,p as stripServerOwnedSettingsFields,f as validateImportPayload};
|