hivehq 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +592 -0
- package/LICENSE +208 -0
- package/LICENSE.BSL +101 -0
- package/NOTICE +15 -0
- package/README.en.md +451 -0
- package/README.md +329 -0
- package/SECURITY.md +59 -0
- package/TRADEMARK.md +41 -0
- package/assets/hive-hero.png +0 -0
- package/assets/hive-team-view.png +0 -0
- package/assets/logo.png +0 -0
- package/assets/qq-group.jpg +0 -0
- package/dist/bin/team +7 -0
- package/dist/bin/team.cmd +3 -0
- package/dist/src/cli/hive-remote.d.ts +46 -0
- package/dist/src/cli/hive-remote.js +257 -0
- package/dist/src/cli/hive-update.d.ts +75 -0
- package/dist/src/cli/hive-update.js +215 -0
- package/dist/src/cli/hive.d.ts +78 -0
- package/dist/src/cli/hive.js +336 -0
- package/dist/src/cli/team.d.ts +38 -0
- package/dist/src/cli/team.js +762 -0
- package/dist/src/server/agent-command-resolver.d.ts +17 -0
- package/dist/src/server/agent-command-resolver.js +106 -0
- package/dist/src/server/agent-exit-classification.d.ts +6 -0
- package/dist/src/server/agent-exit-classification.js +6 -0
- package/dist/src/server/agent-launch-cache.d.ts +20 -0
- package/dist/src/server/agent-launch-cache.js +75 -0
- package/dist/src/server/agent-launch-resolver.d.ts +4 -0
- package/dist/src/server/agent-launch-resolver.js +38 -0
- package/dist/src/server/agent-manager-support.d.ts +36 -0
- package/dist/src/server/agent-manager-support.js +318 -0
- package/dist/src/server/agent-manager.d.ts +54 -0
- package/dist/src/server/agent-manager.js +104 -0
- package/dist/src/server/agent-run-bootstrap.d.ts +83 -0
- package/dist/src/server/agent-run-bootstrap.js +101 -0
- package/dist/src/server/agent-run-exit-handler.d.ts +8 -0
- package/dist/src/server/agent-run-exit-handler.js +32 -0
- package/dist/src/server/agent-run-start-context.d.ts +24 -0
- package/dist/src/server/agent-run-start-context.js +1 -0
- package/dist/src/server/agent-run-starter.d.ts +30 -0
- package/dist/src/server/agent-run-starter.js +155 -0
- package/dist/src/server/agent-run-store.d.ts +51 -0
- package/dist/src/server/agent-run-store.js +137 -0
- package/dist/src/server/agent-run-sync.d.ts +10 -0
- package/dist/src/server/agent-run-sync.js +32 -0
- package/dist/src/server/agent-runtime-active-run.d.ts +3 -0
- package/dist/src/server/agent-runtime-active-run.js +10 -0
- package/dist/src/server/agent-runtime-close.d.ts +5 -0
- package/dist/src/server/agent-runtime-close.js +36 -0
- package/dist/src/server/agent-runtime-contract.d.ts +48 -0
- package/dist/src/server/agent-runtime-contract.js +1 -0
- package/dist/src/server/agent-runtime-flow-adapter.d.ts +10 -0
- package/dist/src/server/agent-runtime-flow-adapter.js +14 -0
- package/dist/src/server/agent-runtime-list-runs.d.ts +3 -0
- package/dist/src/server/agent-runtime-list-runs.js +18 -0
- package/dist/src/server/agent-runtime-ports.d.ts +22 -0
- package/dist/src/server/agent-runtime-ports.js +1 -0
- package/dist/src/server/agent-runtime-stop-run.d.ts +4 -0
- package/dist/src/server/agent-runtime-stop-run.js +19 -0
- package/dist/src/server/agent-runtime-types.d.ts +5 -0
- package/dist/src/server/agent-runtime-types.js +1 -0
- package/dist/src/server/agent-runtime.d.ts +10 -0
- package/dist/src/server/agent-runtime.js +143 -0
- package/dist/src/server/agent-session-store.d.ts +7 -0
- package/dist/src/server/agent-session-store.js +45 -0
- package/dist/src/server/agent-startup-instructions.d.ts +20 -0
- package/dist/src/server/agent-startup-instructions.js +36 -0
- package/dist/src/server/agent-stdin-dispatcher.d.ts +52 -0
- package/dist/src/server/agent-stdin-dispatcher.js +224 -0
- package/dist/src/server/agent-tokens.d.ts +15 -0
- package/dist/src/server/agent-tokens.js +25 -0
- package/dist/src/server/app-state-store.d.ts +10 -0
- package/dist/src/server/app-state-store.js +12 -0
- package/dist/src/server/app.d.ts +20 -0
- package/dist/src/server/app.js +211 -0
- package/dist/src/server/claude-command-defaults.d.ts +1 -0
- package/dist/src/server/claude-command-defaults.js +5 -0
- package/dist/src/server/claude-session-coordinator.d.ts +10 -0
- package/dist/src/server/claude-session-coordinator.js +68 -0
- package/dist/src/server/claude-session-support.d.ts +1 -0
- package/dist/src/server/claude-session-support.js +1 -0
- package/dist/src/server/command-preset-defaults.d.ts +11 -0
- package/dist/src/server/command-preset-defaults.js +63 -0
- package/dist/src/server/command-preset-store.d.ts +49 -0
- package/dist/src/server/command-preset-store.js +83 -0
- package/dist/src/server/cron-util.d.ts +7 -0
- package/dist/src/server/cron-util.js +19 -0
- package/dist/src/server/dispatch-ledger-serializer.d.ts +15 -0
- package/dist/src/server/dispatch-ledger-serializer.js +14 -0
- package/dist/src/server/dispatch-ledger-store.d.ts +108 -0
- package/dist/src/server/dispatch-ledger-store.js +241 -0
- package/dist/src/server/env-sync-message.d.ts +9 -0
- package/dist/src/server/env-sync-message.js +29 -0
- package/dist/src/server/feature-flags.d.ts +42 -0
- package/dist/src/server/feature-flags.js +24 -0
- package/dist/src/server/fs-browse.d.ts +40 -0
- package/dist/src/server/fs-browse.js +306 -0
- package/dist/src/server/fs-pick-folder.d.ts +25 -0
- package/dist/src/server/fs-pick-folder.js +115 -0
- package/dist/src/server/fs-sandbox.d.ts +15 -0
- package/dist/src/server/fs-sandbox.js +56 -0
- package/dist/src/server/hive-team-guidance.d.ts +39 -0
- package/dist/src/server/hive-team-guidance.js +295 -0
- package/dist/src/server/http-errors.d.ts +22 -0
- package/dist/src/server/http-errors.js +44 -0
- package/dist/src/server/live-run-registry.d.ts +22 -0
- package/dist/src/server/live-run-registry.js +52 -0
- package/dist/src/server/local-request-guard.d.ts +3 -0
- package/dist/src/server/local-request-guard.js +41 -0
- package/dist/src/server/machine-name.d.ts +2 -0
- package/dist/src/server/machine-name.js +13 -0
- package/dist/src/server/marketplace-store.d.ts +38 -0
- package/dist/src/server/marketplace-store.js +85 -0
- package/dist/src/server/message-log-store.d.ts +51 -0
- package/dist/src/server/message-log-store.js +90 -0
- package/dist/src/server/open-target-commands.d.ts +54 -0
- package/dist/src/server/open-target-commands.js +204 -0
- package/dist/src/server/orchestrator-autostart.d.ts +42 -0
- package/dist/src/server/orchestrator-autostart.js +114 -0
- package/dist/src/server/orchestrator-launch.d.ts +24 -0
- package/dist/src/server/orchestrator-launch.js +71 -0
- package/dist/src/server/package-version.d.ts +17 -0
- package/dist/src/server/package-version.js +32 -0
- package/dist/src/server/path-canonicalization.d.ts +3 -0
- package/dist/src/server/path-canonicalization.js +29 -0
- package/dist/src/server/platform-path.d.ts +4 -0
- package/dist/src/server/platform-path.js +26 -0
- package/dist/src/server/post-start-input-writer.d.ts +6 -0
- package/dist/src/server/post-start-input-writer.js +242 -0
- package/dist/src/server/preset-launch-support.d.ts +6 -0
- package/dist/src/server/preset-launch-support.js +98 -0
- package/dist/src/server/pty-output-bus.d.ts +8 -0
- package/dist/src/server/pty-output-bus.js +32 -0
- package/dist/src/server/recovery-summary.d.ts +15 -0
- package/dist/src/server/recovery-summary.js +92 -0
- package/dist/src/server/remote-audit-store.d.ts +51 -0
- package/dist/src/server/remote-audit-store.js +108 -0
- package/dist/src/server/remote-config-keys.d.ts +17 -0
- package/dist/src/server/remote-config-keys.js +27 -0
- package/dist/src/server/remote-control-constants.d.ts +30 -0
- package/dist/src/server/remote-control-constants.js +29 -0
- package/dist/src/server/remote-device-session.d.ts +40 -0
- package/dist/src/server/remote-device-session.js +22 -0
- package/dist/src/server/remote-device-store.d.ts +36 -0
- package/dist/src/server/remote-device-store.js +67 -0
- package/dist/src/server/remote-frame-bridge.d.ts +102 -0
- package/dist/src/server/remote-frame-bridge.js +791 -0
- package/dist/src/server/remote-gateway-client.d.ts +14 -0
- package/dist/src/server/remote-gateway-client.js +36 -0
- package/dist/src/server/remote-loopback-auth.d.ts +6 -0
- package/dist/src/server/remote-loopback-auth.js +112 -0
- package/dist/src/server/remote-pairing-tunnel.d.ts +59 -0
- package/dist/src/server/remote-pairing-tunnel.js +146 -0
- package/dist/src/server/remote-pairing.d.ts +58 -0
- package/dist/src/server/remote-pairing.js +237 -0
- package/dist/src/server/remote-tunnel.d.ts +113 -0
- package/dist/src/server/remote-tunnel.js +514 -0
- package/dist/src/server/report-outbox-store.d.ts +36 -0
- package/dist/src/server/report-outbox-store.js +33 -0
- package/dist/src/server/restart-policy-support.d.ts +30 -0
- package/dist/src/server/restart-policy-support.js +21 -0
- package/dist/src/server/restart-policy.d.ts +18 -0
- package/dist/src/server/restart-policy.js +77 -0
- package/dist/src/server/role-template-store.d.ts +45 -0
- package/dist/src/server/role-template-store.js +76 -0
- package/dist/src/server/role-templates.d.ts +7 -0
- package/dist/src/server/role-templates.js +54 -0
- package/dist/src/server/route-helpers.d.ts +9 -0
- package/dist/src/server/route-helpers.js +61 -0
- package/dist/src/server/route-types.d.ts +121 -0
- package/dist/src/server/route-types.js +1 -0
- package/dist/src/server/routes-dispatches.d.ts +2 -0
- package/dist/src/server/routes-dispatches.js +54 -0
- package/dist/src/server/routes-fs.d.ts +2 -0
- package/dist/src/server/routes-fs.js +24 -0
- package/dist/src/server/routes-marketplace.d.ts +2 -0
- package/dist/src/server/routes-marketplace.js +54 -0
- package/dist/src/server/routes-open-workspace.d.ts +2 -0
- package/dist/src/server/routes-open-workspace.js +47 -0
- package/dist/src/server/routes-remote.d.ts +2 -0
- package/dist/src/server/routes-remote.js +166 -0
- package/dist/src/server/routes-runtime.d.ts +2 -0
- package/dist/src/server/routes-runtime.js +79 -0
- package/dist/src/server/routes-settings.d.ts +2 -0
- package/dist/src/server/routes-settings.js +213 -0
- package/dist/src/server/routes-tasks.d.ts +2 -0
- package/dist/src/server/routes-tasks.js +47 -0
- package/dist/src/server/routes-team-memory.d.ts +2 -0
- package/dist/src/server/routes-team-memory.js +154 -0
- package/dist/src/server/routes-team-recall.d.ts +2 -0
- package/dist/src/server/routes-team-recall.js +119 -0
- package/dist/src/server/routes-team.d.ts +2 -0
- package/dist/src/server/routes-team.js +351 -0
- package/dist/src/server/routes-ui.d.ts +2 -0
- package/dist/src/server/routes-ui.js +17 -0
- package/dist/src/server/routes-version.d.ts +2 -0
- package/dist/src/server/routes-version.js +6 -0
- package/dist/src/server/routes-workflow-schedules.d.ts +2 -0
- package/dist/src/server/routes-workflow-schedules.js +58 -0
- package/dist/src/server/routes-workflows.d.ts +2 -0
- package/dist/src/server/routes-workflows.js +83 -0
- package/dist/src/server/routes-workspace-memory-dreams.d.ts +2 -0
- package/dist/src/server/routes-workspace-memory-dreams.js +105 -0
- package/dist/src/server/routes-workspace-memory.d.ts +2 -0
- package/dist/src/server/routes-workspace-memory.js +215 -0
- package/dist/src/server/routes-workspaces.d.ts +2 -0
- package/dist/src/server/routes-workspaces.js +177 -0
- package/dist/src/server/routes.d.ts +6 -0
- package/dist/src/server/routes.js +55 -0
- package/dist/src/server/runtime-database.d.ts +3 -0
- package/dist/src/server/runtime-database.js +41 -0
- package/dist/src/server/runtime-message-builders.d.ts +7 -0
- package/dist/src/server/runtime-message-builders.js +60 -0
- package/dist/src/server/runtime-restart-policy.d.ts +18 -0
- package/dist/src/server/runtime-restart-policy.js +12 -0
- package/dist/src/server/runtime-store-contract.d.ts +162 -0
- package/dist/src/server/runtime-store-contract.js +1 -0
- package/dist/src/server/runtime-store-dream.d.ts +23 -0
- package/dist/src/server/runtime-store-dream.js +16 -0
- package/dist/src/server/runtime-store-helpers.d.ts +115 -0
- package/dist/src/server/runtime-store-helpers.js +411 -0
- package/dist/src/server/runtime-store-memory.d.ts +33 -0
- package/dist/src/server/runtime-store-memory.js +37 -0
- package/dist/src/server/runtime-store-remote.d.ts +5 -0
- package/dist/src/server/runtime-store-remote.js +45 -0
- package/dist/src/server/runtime-store-workflows.d.ts +6 -0
- package/dist/src/server/runtime-store-workflows.js +108 -0
- package/dist/src/server/runtime-store.d.ts +4 -0
- package/dist/src/server/runtime-store.js +165 -0
- package/dist/src/server/session-capture-claude.d.ts +34 -0
- package/dist/src/server/session-capture-claude.js +103 -0
- package/dist/src/server/session-capture-codex.d.ts +6 -0
- package/dist/src/server/session-capture-codex.js +108 -0
- package/dist/src/server/session-capture-gemini.d.ts +5 -0
- package/dist/src/server/session-capture-gemini.js +81 -0
- package/dist/src/server/session-capture-opencode.d.ts +22 -0
- package/dist/src/server/session-capture-opencode.js +75 -0
- package/dist/src/server/session-capture.d.ts +77 -0
- package/dist/src/server/session-capture.js +123 -0
- package/dist/src/server/settings-store.d.ts +22 -0
- package/dist/src/server/settings-store.js +22 -0
- package/dist/src/server/sqlite-schema-v10.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v10.js +13 -0
- package/dist/src/server/sqlite-schema-v11.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v11.js +10 -0
- package/dist/src/server/sqlite-schema-v12.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v12.js +21 -0
- package/dist/src/server/sqlite-schema-v13.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v13.js +4 -0
- package/dist/src/server/sqlite-schema-v14.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v14.js +84 -0
- package/dist/src/server/sqlite-schema-v15.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v15.js +73 -0
- package/dist/src/server/sqlite-schema-v16.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v16.js +6 -0
- package/dist/src/server/sqlite-schema-v17.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v17.js +15 -0
- package/dist/src/server/sqlite-schema-v18.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v18.js +6 -0
- package/dist/src/server/sqlite-schema-v19.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v19.js +17 -0
- package/dist/src/server/sqlite-schema-v20.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v20.js +20 -0
- package/dist/src/server/sqlite-schema-v21.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v21.js +20 -0
- package/dist/src/server/sqlite-schema-v22.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v22.js +27 -0
- package/dist/src/server/sqlite-schema-v23.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v23.js +43 -0
- package/dist/src/server/sqlite-schema-v24.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v24.js +34 -0
- package/dist/src/server/sqlite-schema-v25.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v25.js +127 -0
- package/dist/src/server/sqlite-schema-v26.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v26.js +56 -0
- package/dist/src/server/sqlite-schema-v27.d.ts +6 -0
- package/dist/src/server/sqlite-schema-v27.js +92 -0
- package/dist/src/server/sqlite-schema-v28.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v28.js +19 -0
- package/dist/src/server/sqlite-schema-v5.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v5.js +61 -0
- package/dist/src/server/sqlite-schema-v7.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v7.js +70 -0
- package/dist/src/server/sqlite-schema-v8.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v8.js +6 -0
- package/dist/src/server/sqlite-schema-v9.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v9.js +6 -0
- package/dist/src/server/sqlite-schema.d.ts +3 -0
- package/dist/src/server/sqlite-schema.js +353 -0
- package/dist/src/server/startup-command-parser.d.ts +20 -0
- package/dist/src/server/startup-command-parser.js +72 -0
- package/dist/src/server/system-message.d.ts +8 -0
- package/dist/src/server/system-message.js +8 -0
- package/dist/src/server/task-deps.d.ts +32 -0
- package/dist/src/server/task-deps.js +40 -0
- package/dist/src/server/tasks-file-watcher.d.ts +47 -0
- package/dist/src/server/tasks-file-watcher.js +200 -0
- package/dist/src/server/tasks-file.d.ts +23 -0
- package/dist/src/server/tasks-file.js +101 -0
- package/dist/src/server/tasks-websocket-server.d.ts +8 -0
- package/dist/src/server/tasks-websocket-server.js +95 -0
- package/dist/src/server/team-authz.d.ts +13 -0
- package/dist/src/server/team-authz.js +53 -0
- package/dist/src/server/team-autostaff.d.ts +16 -0
- package/dist/src/server/team-autostaff.js +16 -0
- package/dist/src/server/team-list-enrichment.d.ts +22 -0
- package/dist/src/server/team-list-enrichment.js +40 -0
- package/dist/src/server/team-list-serializer.d.ts +2 -0
- package/dist/src/server/team-list-serializer.js +11 -0
- package/dist/src/server/team-memory-digest.d.ts +52 -0
- package/dist/src/server/team-memory-digest.js +200 -0
- package/dist/src/server/team-memory-dream-applier.d.ts +5 -0
- package/dist/src/server/team-memory-dream-applier.js +234 -0
- package/dist/src/server/team-memory-dream-http-serializers.d.ts +13 -0
- package/dist/src/server/team-memory-dream-http-serializers.js +12 -0
- package/dist/src/server/team-memory-dream-ops.d.ts +40 -0
- package/dist/src/server/team-memory-dream-ops.js +153 -0
- package/dist/src/server/team-memory-dream-reverter.d.ts +22 -0
- package/dist/src/server/team-memory-dream-reverter.js +221 -0
- package/dist/src/server/team-memory-dream-run-store.d.ts +23 -0
- package/dist/src/server/team-memory-dream-run-store.js +211 -0
- package/dist/src/server/team-memory-dream-runner.d.ts +37 -0
- package/dist/src/server/team-memory-dream-runner.js +178 -0
- package/dist/src/server/team-memory-dream-scheduler.d.ts +32 -0
- package/dist/src/server/team-memory-dream-scheduler.js +115 -0
- package/dist/src/server/team-memory-dream-store.d.ts +19 -0
- package/dist/src/server/team-memory-dream-store.js +16 -0
- package/dist/src/server/team-memory-dream-types.d.ts +104 -0
- package/dist/src/server/team-memory-dream-types.js +23 -0
- package/dist/src/server/team-memory-export.d.ts +22 -0
- package/dist/src/server/team-memory-export.js +220 -0
- package/dist/src/server/team-memory-feature.d.ts +12 -0
- package/dist/src/server/team-memory-feature.js +12 -0
- package/dist/src/server/team-memory-http-serializers.d.ts +102 -0
- package/dist/src/server/team-memory-http-serializers.js +46 -0
- package/dist/src/server/team-memory-injection.d.ts +31 -0
- package/dist/src/server/team-memory-injection.js +49 -0
- package/dist/src/server/team-memory-store.d.ts +116 -0
- package/dist/src/server/team-memory-store.js +513 -0
- package/dist/src/server/team-operations.d.ts +102 -0
- package/dist/src/server/team-operations.js +387 -0
- package/dist/src/server/team-recall-store.d.ts +38 -0
- package/dist/src/server/team-recall-store.js +205 -0
- package/dist/src/server/terminal-flow-control.d.ts +19 -0
- package/dist/src/server/terminal-flow-control.js +116 -0
- package/dist/src/server/terminal-input-profile.d.ts +10 -0
- package/dist/src/server/terminal-input-profile.js +9 -0
- package/dist/src/server/terminal-protocol.d.ts +29 -0
- package/dist/src/server/terminal-protocol.js +47 -0
- package/dist/src/server/terminal-state-mirror.d.ts +21 -0
- package/dist/src/server/terminal-state-mirror.js +67 -0
- package/dist/src/server/terminal-stream-hub.d.ts +9 -0
- package/dist/src/server/terminal-stream-hub.js +192 -0
- package/dist/src/server/terminal-ws-server.d.ts +6 -0
- package/dist/src/server/terminal-ws-server.js +115 -0
- package/dist/src/server/ui-auth-helpers.d.ts +4 -0
- package/dist/src/server/ui-auth-helpers.js +28 -0
- package/dist/src/server/ui-auth.d.ts +8 -0
- package/dist/src/server/ui-auth.js +32 -0
- package/dist/src/server/version-service.d.ts +16 -0
- package/dist/src/server/version-service.js +72 -0
- package/dist/src/server/webhook-notifier.d.ts +34 -0
- package/dist/src/server/webhook-notifier.js +47 -0
- package/dist/src/server/websocket-upgrade-safety.d.ts +10 -0
- package/dist/src/server/websocket-upgrade-safety.js +35 -0
- package/dist/src/server/windows-command-line.d.ts +3 -0
- package/dist/src/server/windows-command-line.js +9 -0
- package/dist/src/server/windows-filename.d.ts +2 -0
- package/dist/src/server/windows-filename.js +33 -0
- package/dist/src/server/worker-output-tracker.d.ts +14 -0
- package/dist/src/server/worker-output-tracker.js +50 -0
- package/dist/src/server/workflow-cli-policy.d.ts +60 -0
- package/dist/src/server/workflow-cli-policy.js +110 -0
- package/dist/src/server/workflow-dispatch-awaiter.d.ts +12 -0
- package/dist/src/server/workflow-dispatch-awaiter.js +80 -0
- package/dist/src/server/workflow-feature.d.ts +15 -0
- package/dist/src/server/workflow-feature.js +15 -0
- package/dist/src/server/workflow-http-serializers.d.ts +64 -0
- package/dist/src/server/workflow-http-serializers.js +58 -0
- package/dist/src/server/workflow-output-schema.d.ts +18 -0
- package/dist/src/server/workflow-output-schema.js +41 -0
- package/dist/src/server/workflow-run-log-store.d.ts +19 -0
- package/dist/src/server/workflow-run-log-store.js +45 -0
- package/dist/src/server/workflow-run-store.d.ts +50 -0
- package/dist/src/server/workflow-run-store.js +103 -0
- package/dist/src/server/workflow-runner.d.ts +147 -0
- package/dist/src/server/workflow-runner.js +411 -0
- package/dist/src/server/workflow-schedule-create.d.ts +14 -0
- package/dist/src/server/workflow-schedule-create.js +41 -0
- package/dist/src/server/workflow-schedule-store.d.ts +43 -0
- package/dist/src/server/workflow-schedule-store.js +112 -0
- package/dist/src/server/workflow-scheduler.d.ts +36 -0
- package/dist/src/server/workflow-scheduler.js +97 -0
- package/dist/src/server/workflow-script-loader.d.ts +34 -0
- package/dist/src/server/workflow-script-loader.js +106 -0
- package/dist/src/server/workspace-path-validation.d.ts +1 -0
- package/dist/src/server/workspace-path-validation.js +42 -0
- package/dist/src/server/workspace-shell-runtime.d.ts +35 -0
- package/dist/src/server/workspace-shell-runtime.js +228 -0
- package/dist/src/server/workspace-store-contract.d.ts +32 -0
- package/dist/src/server/workspace-store-contract.js +1 -0
- package/dist/src/server/workspace-store-hydration.d.ts +5 -0
- package/dist/src/server/workspace-store-hydration.js +76 -0
- package/dist/src/server/workspace-store-mutations.d.ts +14 -0
- package/dist/src/server/workspace-store-mutations.js +48 -0
- package/dist/src/server/workspace-store-support.d.ts +33 -0
- package/dist/src/server/workspace-store-support.js +36 -0
- package/dist/src/server/workspace-store.d.ts +5 -0
- package/dist/src/server/workspace-store.js +153 -0
- package/dist/src/shared/fs-browse.d.ts +1 -0
- package/dist/src/shared/fs-browse.js +1 -0
- package/dist/src/shared/open-targets.d.ts +20 -0
- package/dist/src/shared/open-targets.js +36 -0
- package/dist/src/shared/path-input.d.ts +12 -0
- package/dist/src/shared/path-input.js +22 -0
- package/dist/src/shared/remote-bridge-routing.d.ts +19 -0
- package/dist/src/shared/remote-bridge-routing.js +141 -0
- package/dist/src/shared/remote-crypto.d.ts +138 -0
- package/dist/src/shared/remote-crypto.js +427 -0
- package/dist/src/shared/remote-pairing-code.d.ts +7 -0
- package/dist/src/shared/remote-pairing-code.js +47 -0
- package/dist/src/shared/remote-protocol.d.ts +160 -0
- package/dist/src/shared/remote-protocol.js +526 -0
- package/dist/src/shared/team-memory.d.ts +11 -0
- package/dist/src/shared/team-memory.js +10 -0
- package/dist/src/shared/team-recall.d.ts +1 -0
- package/dist/src/shared/team-recall.js +1 -0
- package/dist/src/shared/types.d.ts +66 -0
- package/dist/src/shared/types.js +1 -0
- package/dist/vendor/marketplace/en/LICENSE +21 -0
- package/dist/vendor/marketplace/en/SOURCES.md +12 -0
- package/dist/vendor/marketplace/en/academic/academic-anthropologist.md +125 -0
- package/dist/vendor/marketplace/en/academic/academic-geographer.md +127 -0
- package/dist/vendor/marketplace/en/academic/academic-historian.md +123 -0
- package/dist/vendor/marketplace/en/academic/academic-narratologist.md +118 -0
- package/dist/vendor/marketplace/en/academic/academic-psychologist.md +118 -0
- package/dist/vendor/marketplace/en/design/design-brand-guardian.md +322 -0
- package/dist/vendor/marketplace/en/design/design-image-prompt-engineer.md +236 -0
- package/dist/vendor/marketplace/en/design/design-inclusive-visuals-specialist.md +71 -0
- package/dist/vendor/marketplace/en/design/design-ui-designer.md +383 -0
- package/dist/vendor/marketplace/en/design/design-ux-architect.md +469 -0
- package/dist/vendor/marketplace/en/design/design-ux-researcher.md +329 -0
- package/dist/vendor/marketplace/en/design/design-visual-storyteller.md +149 -0
- package/dist/vendor/marketplace/en/design/design-whimsy-injector.md +438 -0
- package/dist/vendor/marketplace/en/engineering/engineering-ai-data-remediation-engineer.md +211 -0
- package/dist/vendor/marketplace/en/engineering/engineering-ai-engineer.md +146 -0
- package/dist/vendor/marketplace/en/engineering/engineering-autonomous-optimization-architect.md +107 -0
- package/dist/vendor/marketplace/en/engineering/engineering-backend-architect.md +235 -0
- package/dist/vendor/marketplace/en/engineering/engineering-cms-developer.md +536 -0
- package/dist/vendor/marketplace/en/engineering/engineering-code-reviewer.md +76 -0
- package/dist/vendor/marketplace/en/engineering/engineering-codebase-onboarding-engineer.md +173 -0
- package/dist/vendor/marketplace/en/engineering/engineering-data-engineer.md +306 -0
- package/dist/vendor/marketplace/en/engineering/engineering-database-optimizer.md +176 -0
- package/dist/vendor/marketplace/en/engineering/engineering-devops-automator.md +376 -0
- package/dist/vendor/marketplace/en/engineering/engineering-email-intelligence-engineer.md +353 -0
- package/dist/vendor/marketplace/en/engineering/engineering-embedded-firmware-engineer.md +173 -0
- package/dist/vendor/marketplace/en/engineering/engineering-feishu-integration-developer.md +598 -0
- package/dist/vendor/marketplace/en/engineering/engineering-filament-optimization-specialist.md +283 -0
- package/dist/vendor/marketplace/en/engineering/engineering-frontend-developer.md +225 -0
- package/dist/vendor/marketplace/en/engineering/engineering-git-workflow-master.md +84 -0
- package/dist/vendor/marketplace/en/engineering/engineering-incident-response-commander.md +444 -0
- package/dist/vendor/marketplace/en/engineering/engineering-minimal-change-engineer.md +207 -0
- package/dist/vendor/marketplace/en/engineering/engineering-mobile-app-builder.md +493 -0
- package/dist/vendor/marketplace/en/engineering/engineering-rapid-prototyper.md +462 -0
- package/dist/vendor/marketplace/en/engineering/engineering-security-engineer.md +304 -0
- package/dist/vendor/marketplace/en/engineering/engineering-senior-developer.md +176 -0
- package/dist/vendor/marketplace/en/engineering/engineering-software-architect.md +81 -0
- package/dist/vendor/marketplace/en/engineering/engineering-solidity-smart-contract-engineer.md +522 -0
- package/dist/vendor/marketplace/en/engineering/engineering-sre.md +90 -0
- package/dist/vendor/marketplace/en/engineering/engineering-technical-writer.md +393 -0
- package/dist/vendor/marketplace/en/engineering/engineering-threat-detection-engineer.md +534 -0
- package/dist/vendor/marketplace/en/engineering/engineering-voice-ai-integration-engineer.md +561 -0
- package/dist/vendor/marketplace/en/engineering/engineering-wechat-mini-program-developer.md +350 -0
- package/dist/vendor/marketplace/en/finance/finance-bookkeeper-controller.md +260 -0
- package/dist/vendor/marketplace/en/finance/finance-financial-analyst.md +234 -0
- package/dist/vendor/marketplace/en/finance/finance-fpa-analyst.md +263 -0
- package/dist/vendor/marketplace/en/finance/finance-investment-researcher.md +272 -0
- package/dist/vendor/marketplace/en/finance/finance-tax-strategist.md +239 -0
- package/dist/vendor/marketplace/en/game-development/blender/blender-addon-engineer.md +234 -0
- package/dist/vendor/marketplace/en/game-development/game-audio-engineer.md +264 -0
- package/dist/vendor/marketplace/en/game-development/game-designer.md +167 -0
- package/dist/vendor/marketplace/en/game-development/godot/godot-gameplay-scripter.md +334 -0
- package/dist/vendor/marketplace/en/game-development/godot/godot-multiplayer-engineer.md +297 -0
- package/dist/vendor/marketplace/en/game-development/godot/godot-shader-developer.md +266 -0
- package/dist/vendor/marketplace/en/game-development/level-designer.md +208 -0
- package/dist/vendor/marketplace/en/game-development/narrative-designer.md +243 -0
- package/dist/vendor/marketplace/en/game-development/roblox-studio/roblox-avatar-creator.md +297 -0
- package/dist/vendor/marketplace/en/game-development/roblox-studio/roblox-experience-designer.md +305 -0
- package/dist/vendor/marketplace/en/game-development/roblox-studio/roblox-systems-scripter.md +325 -0
- package/dist/vendor/marketplace/en/game-development/technical-artist.md +229 -0
- package/dist/vendor/marketplace/en/game-development/unity/unity-architect.md +271 -0
- package/dist/vendor/marketplace/en/game-development/unity/unity-editor-tool-developer.md +310 -0
- package/dist/vendor/marketplace/en/game-development/unity/unity-multiplayer-engineer.md +321 -0
- package/dist/vendor/marketplace/en/game-development/unity/unity-shader-graph-artist.md +269 -0
- package/dist/vendor/marketplace/en/game-development/unreal-engine/unreal-multiplayer-architect.md +313 -0
- package/dist/vendor/marketplace/en/game-development/unreal-engine/unreal-systems-engineer.md +310 -0
- package/dist/vendor/marketplace/en/game-development/unreal-engine/unreal-technical-artist.md +256 -0
- package/dist/vendor/marketplace/en/game-development/unreal-engine/unreal-world-builder.md +273 -0
- package/dist/vendor/marketplace/en/integrations/mcp-memory/backend-architect-with-memory.md +247 -0
- package/dist/vendor/marketplace/en/manifest.json +1869 -0
- package/dist/vendor/marketplace/en/marketing/marketing-agentic-search-optimizer.md +311 -0
- package/dist/vendor/marketplace/en/marketing/marketing-ai-citation-strategist.md +170 -0
- package/dist/vendor/marketplace/en/marketing/marketing-app-store-optimizer.md +321 -0
- package/dist/vendor/marketplace/en/marketing/marketing-baidu-seo-specialist.md +226 -0
- package/dist/vendor/marketplace/en/marketing/marketing-bilibili-content-strategist.md +199 -0
- package/dist/vendor/marketplace/en/marketing/marketing-book-co-author.md +110 -0
- package/dist/vendor/marketplace/en/marketing/marketing-carousel-growth-engine.md +199 -0
- package/dist/vendor/marketplace/en/marketing/marketing-china-ecommerce-operator.md +283 -0
- package/dist/vendor/marketplace/en/marketing/marketing-china-market-localization-strategist.md +283 -0
- package/dist/vendor/marketplace/en/marketing/marketing-content-creator.md +54 -0
- package/dist/vendor/marketplace/en/marketing/marketing-cross-border-ecommerce.md +259 -0
- package/dist/vendor/marketplace/en/marketing/marketing-douyin-strategist.md +149 -0
- package/dist/vendor/marketplace/en/marketing/marketing-growth-hacker.md +54 -0
- package/dist/vendor/marketplace/en/marketing/marketing-instagram-curator.md +113 -0
- package/dist/vendor/marketplace/en/marketing/marketing-kuaishou-strategist.md +223 -0
- package/dist/vendor/marketplace/en/marketing/marketing-linkedin-content-creator.md +214 -0
- package/dist/vendor/marketplace/en/marketing/marketing-livestream-commerce-coach.md +305 -0
- package/dist/vendor/marketplace/en/marketing/marketing-podcast-strategist.md +277 -0
- package/dist/vendor/marketplace/en/marketing/marketing-private-domain-operator.md +308 -0
- package/dist/vendor/marketplace/en/marketing/marketing-reddit-community-builder.md +123 -0
- package/dist/vendor/marketplace/en/marketing/marketing-seo-specialist.md +321 -0
- package/dist/vendor/marketplace/en/marketing/marketing-short-video-editing-coach.md +412 -0
- package/dist/vendor/marketplace/en/marketing/marketing-social-media-strategist.md +125 -0
- package/dist/vendor/marketplace/en/marketing/marketing-tiktok-strategist.md +125 -0
- package/dist/vendor/marketplace/en/marketing/marketing-twitter-engager.md +126 -0
- package/dist/vendor/marketplace/en/marketing/marketing-video-optimization-specialist.md +119 -0
- package/dist/vendor/marketplace/en/marketing/marketing-wechat-official-account.md +145 -0
- package/dist/vendor/marketplace/en/marketing/marketing-weibo-strategist.md +240 -0
- package/dist/vendor/marketplace/en/marketing/marketing-xiaohongshu-specialist.md +138 -0
- package/dist/vendor/marketplace/en/marketing/marketing-zhihu-strategist.md +162 -0
- package/dist/vendor/marketplace/en/paid-media/paid-media-auditor.md +71 -0
- package/dist/vendor/marketplace/en/paid-media/paid-media-creative-strategist.md +71 -0
- package/dist/vendor/marketplace/en/paid-media/paid-media-paid-social-strategist.md +71 -0
- package/dist/vendor/marketplace/en/paid-media/paid-media-ppc-strategist.md +71 -0
- package/dist/vendor/marketplace/en/paid-media/paid-media-programmatic-buyer.md +71 -0
- package/dist/vendor/marketplace/en/paid-media/paid-media-search-query-analyst.md +71 -0
- package/dist/vendor/marketplace/en/paid-media/paid-media-tracking-specialist.md +71 -0
- package/dist/vendor/marketplace/en/product/product-behavioral-nudge-engine.md +80 -0
- package/dist/vendor/marketplace/en/product/product-feedback-synthesizer.md +119 -0
- package/dist/vendor/marketplace/en/product/product-manager.md +469 -0
- package/dist/vendor/marketplace/en/product/product-sprint-prioritizer.md +154 -0
- package/dist/vendor/marketplace/en/product/product-trend-researcher.md +159 -0
- package/dist/vendor/marketplace/en/project-management/project-management-experiment-tracker.md +198 -0
- package/dist/vendor/marketplace/en/project-management/project-management-jira-workflow-steward.md +230 -0
- package/dist/vendor/marketplace/en/project-management/project-management-project-shepherd.md +194 -0
- package/dist/vendor/marketplace/en/project-management/project-management-studio-operations.md +200 -0
- package/dist/vendor/marketplace/en/project-management/project-management-studio-producer.md +203 -0
- package/dist/vendor/marketplace/en/project-management/project-manager-senior.md +135 -0
- package/dist/vendor/marketplace/en/sales/sales-account-strategist.md +227 -0
- package/dist/vendor/marketplace/en/sales/sales-coach.md +271 -0
- package/dist/vendor/marketplace/en/sales/sales-deal-strategist.md +180 -0
- package/dist/vendor/marketplace/en/sales/sales-discovery-coach.md +225 -0
- package/dist/vendor/marketplace/en/sales/sales-engineer.md +182 -0
- package/dist/vendor/marketplace/en/sales/sales-outbound-strategist.md +201 -0
- package/dist/vendor/marketplace/en/sales/sales-pipeline-analyst.md +267 -0
- package/dist/vendor/marketplace/en/sales/sales-proposal-strategist.md +217 -0
- package/dist/vendor/marketplace/en/spatial-computing/macos-spatial-metal-engineer.md +337 -0
- package/dist/vendor/marketplace/en/spatial-computing/terminal-integration-specialist.md +70 -0
- package/dist/vendor/marketplace/en/spatial-computing/visionos-spatial-engineer.md +54 -0
- package/dist/vendor/marketplace/en/spatial-computing/xr-cockpit-interaction-specialist.md +32 -0
- package/dist/vendor/marketplace/en/spatial-computing/xr-immersive-developer.md +32 -0
- package/dist/vendor/marketplace/en/spatial-computing/xr-interface-architect.md +32 -0
- package/dist/vendor/marketplace/en/specialized/accounts-payable-agent.md +185 -0
- package/dist/vendor/marketplace/en/specialized/agentic-identity-trust.md +387 -0
- package/dist/vendor/marketplace/en/specialized/agents-orchestrator.md +367 -0
- package/dist/vendor/marketplace/en/specialized/automation-governance-architect.md +216 -0
- package/dist/vendor/marketplace/en/specialized/blockchain-security-auditor.md +463 -0
- package/dist/vendor/marketplace/en/specialized/compliance-auditor.md +158 -0
- package/dist/vendor/marketplace/en/specialized/corporate-training-designer.md +192 -0
- package/dist/vendor/marketplace/en/specialized/customer-service.md +398 -0
- package/dist/vendor/marketplace/en/specialized/data-consolidation-agent.md +60 -0
- package/dist/vendor/marketplace/en/specialized/government-digital-presales-consultant.md +363 -0
- package/dist/vendor/marketplace/en/specialized/healthcare-customer-service.md +389 -0
- package/dist/vendor/marketplace/en/specialized/healthcare-marketing-compliance.md +395 -0
- package/dist/vendor/marketplace/en/specialized/hospitality-guest-services.md +603 -0
- package/dist/vendor/marketplace/en/specialized/hr-onboarding.md +451 -0
- package/dist/vendor/marketplace/en/specialized/identity-graph-operator.md +260 -0
- package/dist/vendor/marketplace/en/specialized/language-translator.md +264 -0
- package/dist/vendor/marketplace/en/specialized/legal-billing-time-tracking.md +569 -0
- package/dist/vendor/marketplace/en/specialized/legal-client-intake.md +492 -0
- package/dist/vendor/marketplace/en/specialized/legal-document-review.md +454 -0
- package/dist/vendor/marketplace/en/specialized/loan-officer-assistant.md +555 -0
- package/dist/vendor/marketplace/en/specialized/lsp-index-engineer.md +314 -0
- package/dist/vendor/marketplace/en/specialized/real-estate-buyer-seller.md +596 -0
- package/dist/vendor/marketplace/en/specialized/recruitment-specialist.md +509 -0
- package/dist/vendor/marketplace/en/specialized/report-distribution-agent.md +65 -0
- package/dist/vendor/marketplace/en/specialized/retail-customer-returns.md +566 -0
- package/dist/vendor/marketplace/en/specialized/sales-data-extraction-agent.md +67 -0
- package/dist/vendor/marketplace/en/specialized/sales-outreach.md +425 -0
- package/dist/vendor/marketplace/en/specialized/specialized-chief-of-staff.md +279 -0
- package/dist/vendor/marketplace/en/specialized/specialized-civil-engineer.md +356 -0
- package/dist/vendor/marketplace/en/specialized/specialized-cultural-intelligence-strategist.md +88 -0
- package/dist/vendor/marketplace/en/specialized/specialized-developer-advocate.md +317 -0
- package/dist/vendor/marketplace/en/specialized/specialized-document-generator.md +55 -0
- package/dist/vendor/marketplace/en/specialized/specialized-french-consulting-market.md +192 -0
- package/dist/vendor/marketplace/en/specialized/specialized-korean-business-navigator.md +216 -0
- package/dist/vendor/marketplace/en/specialized/specialized-mcp-builder.md +248 -0
- package/dist/vendor/marketplace/en/specialized/specialized-model-qa.md +488 -0
- package/dist/vendor/marketplace/en/specialized/specialized-salesforce-architect.md +180 -0
- package/dist/vendor/marketplace/en/specialized/specialized-workflow-architect.md +597 -0
- package/dist/vendor/marketplace/en/specialized/study-abroad-advisor.md +282 -0
- package/dist/vendor/marketplace/en/specialized/supply-chain-strategist.md +582 -0
- package/dist/vendor/marketplace/en/support/support-analytics-reporter.md +365 -0
- package/dist/vendor/marketplace/en/support/support-executive-summary-generator.md +212 -0
- package/dist/vendor/marketplace/en/support/support-finance-tracker.md +442 -0
- package/dist/vendor/marketplace/en/support/support-infrastructure-maintainer.md +618 -0
- package/dist/vendor/marketplace/en/support/support-legal-compliance-checker.md +588 -0
- package/dist/vendor/marketplace/en/support/support-support-responder.md +585 -0
- package/dist/vendor/marketplace/en/testing/testing-accessibility-auditor.md +316 -0
- package/dist/vendor/marketplace/en/testing/testing-api-tester.md +306 -0
- package/dist/vendor/marketplace/en/testing/testing-evidence-collector.md +210 -0
- package/dist/vendor/marketplace/en/testing/testing-performance-benchmarker.md +268 -0
- package/dist/vendor/marketplace/en/testing/testing-reality-checker.md +236 -0
- package/dist/vendor/marketplace/en/testing/testing-test-results-analyzer.md +305 -0
- package/dist/vendor/marketplace/en/testing/testing-tool-evaluator.md +394 -0
- package/dist/vendor/marketplace/en/testing/testing-workflow-optimizer.md +450 -0
- package/dist/vendor/marketplace/zh/LICENSE +22 -0
- package/dist/vendor/marketplace/zh/SOURCES.md +12 -0
- package/dist/vendor/marketplace/zh/academic/academic-anthropologist.md +124 -0
- package/dist/vendor/marketplace/zh/academic/academic-geographer.md +126 -0
- package/dist/vendor/marketplace/zh/academic/academic-historian.md +122 -0
- package/dist/vendor/marketplace/zh/academic/academic-narratologist.md +117 -0
- package/dist/vendor/marketplace/zh/academic/academic-psychologist.md +117 -0
- package/dist/vendor/marketplace/zh/academic/academic-study-planner.md +214 -0
- package/dist/vendor/marketplace/zh/design/design-brand-guardian.md +321 -0
- package/dist/vendor/marketplace/zh/design/design-image-prompt-engineer.md +255 -0
- package/dist/vendor/marketplace/zh/design/design-inclusive-visuals-specialist.md +177 -0
- package/dist/vendor/marketplace/zh/design/design-ui-designer.md +382 -0
- package/dist/vendor/marketplace/zh/design/design-ux-architect.md +482 -0
- package/dist/vendor/marketplace/zh/design/design-ux-researcher.md +328 -0
- package/dist/vendor/marketplace/zh/design/design-visual-storyteller.md +159 -0
- package/dist/vendor/marketplace/zh/design/design-whimsy-injector.md +453 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-ai-data-remediation-engineer.md +209 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-ai-engineer.md +161 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-autonomous-optimization-architect.md +115 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-backend-architect.md +234 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-cms-developer.md +534 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-code-reviewer.md +172 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-codebase-onboarding-engineer.md +172 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-data-engineer.md +324 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-database-optimizer.md +175 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-devops-automator.md +375 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-dingtalk-integration-developer.md +574 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-email-intelligence-engineer.md +349 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-embedded-firmware-engineer.md +168 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-embedded-linux-driver-engineer.md +255 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-feishu-integration-developer.md +597 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-filament-optimization-specialist.md +283 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-fpga-digital-design-engineer.md +227 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-frontend-developer.md +224 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-git-workflow-master.md +220 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-incident-response-commander.md +465 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-iot-solution-architect.md +220 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-mechanical-design-engineer.md +311 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-minimal-change-engineer.md +206 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-mobile-app-builder.md +434 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-pc-host-engineer.md +231 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-rapid-prototyper.md +461 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-security-engineer.md +303 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-senior-developer.md +177 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-software-architect.md +200 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-solidity-smart-contract-engineer.md +541 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-sre.md +233 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-technical-writer.md +409 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-threat-detection-engineer.md +553 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-voice-ai-integration-engineer.md +560 -0
- package/dist/vendor/marketplace/zh/engineering/engineering-wechat-mini-program-developer.md +288 -0
- package/dist/vendor/marketplace/zh/finance/finance-bookkeeper-controller.md +271 -0
- package/dist/vendor/marketplace/zh/finance/finance-financial-analyst.md +244 -0
- package/dist/vendor/marketplace/zh/finance/finance-financial-forecaster.md +213 -0
- package/dist/vendor/marketplace/zh/finance/finance-fpa-analyst.md +272 -0
- package/dist/vendor/marketplace/zh/finance/finance-fraud-detector.md +241 -0
- package/dist/vendor/marketplace/zh/finance/finance-investment-researcher.md +283 -0
- package/dist/vendor/marketplace/zh/finance/finance-invoice-manager.md +242 -0
- package/dist/vendor/marketplace/zh/finance/finance-tax-strategist.md +250 -0
- package/dist/vendor/marketplace/zh/game-development/blender/blender-addon-engineer.md +233 -0
- package/dist/vendor/marketplace/zh/game-development/game-audio-engineer.md +265 -0
- package/dist/vendor/marketplace/zh/game-development/game-designer.md +168 -0
- package/dist/vendor/marketplace/zh/game-development/godot/godot-gameplay-scripter.md +335 -0
- package/dist/vendor/marketplace/zh/game-development/godot/godot-multiplayer-engineer.md +296 -0
- package/dist/vendor/marketplace/zh/game-development/godot/godot-shader-developer.md +267 -0
- package/dist/vendor/marketplace/zh/game-development/level-designer.md +209 -0
- package/dist/vendor/marketplace/zh/game-development/narrative-designer.md +244 -0
- package/dist/vendor/marketplace/zh/game-development/roblox-studio/roblox-avatar-creator.md +298 -0
- package/dist/vendor/marketplace/zh/game-development/roblox-studio/roblox-experience-designer.md +306 -0
- package/dist/vendor/marketplace/zh/game-development/roblox-studio/roblox-systems-scripter.md +325 -0
- package/dist/vendor/marketplace/zh/game-development/technical-artist.md +230 -0
- package/dist/vendor/marketplace/zh/game-development/unity/unity-architect.md +272 -0
- package/dist/vendor/marketplace/zh/game-development/unity/unity-editor-tool-developer.md +300 -0
- package/dist/vendor/marketplace/zh/game-development/unity/unity-multiplayer-engineer.md +238 -0
- package/dist/vendor/marketplace/zh/game-development/unity/unity-shader-graph-artist.md +270 -0
- package/dist/vendor/marketplace/zh/game-development/unreal-engine/unreal-multiplayer-architect.md +314 -0
- package/dist/vendor/marketplace/zh/game-development/unreal-engine/unreal-systems-engineer.md +311 -0
- package/dist/vendor/marketplace/zh/game-development/unreal-engine/unreal-technical-artist.md +256 -0
- package/dist/vendor/marketplace/zh/game-development/unreal-engine/unreal-world-builder.md +274 -0
- package/dist/vendor/marketplace/zh/hr/hr-performance-reviewer.md +248 -0
- package/dist/vendor/marketplace/zh/hr/hr-recruiter.md +232 -0
- package/dist/vendor/marketplace/zh/legal/legal-contract-reviewer.md +240 -0
- package/dist/vendor/marketplace/zh/legal/legal-policy-writer.md +308 -0
- package/dist/vendor/marketplace/zh/manifest.json +2181 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-agentic-search-optimizer.md +312 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-ai-citation-strategist.md +169 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-app-store-optimizer.md +319 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-baidu-seo-specialist.md +220 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-bilibili-strategist.md +194 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-book-co-author.md +109 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-carousel-growth-engine.md +215 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-china-ecommerce-operator.md +277 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-china-market-localization-strategist.md +282 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-content-creator.md +145 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-cross-border-ecommerce.md +260 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-daily-news-briefing.md +303 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-douyin-strategist.md +150 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-ecommerce-operator.md +216 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-growth-hacker.md +121 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-instagram-curator.md +179 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-knowledge-commerce-strategist.md +384 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-kuaishou-strategist.md +182 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-linkedin-content-creator.md +232 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-livestream-commerce-coach.md +303 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-podcast-strategist.md +278 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-private-domain-operator.md +309 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-reddit-community-builder.md +127 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-seo-specialist.md +298 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-short-video-editing-coach.md +413 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-social-media-strategist.md +118 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-tiktok-strategist.md +124 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-twitter-engager.md +132 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-video-optimization-specialist.md +128 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-wechat-official-account.md +158 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-wechat-operator.md +156 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-weibo-strategist.md +241 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-weixin-channels-strategist.md +297 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-xiaohongshu-operator.md +139 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-xiaohongshu-specialist.md +151 -0
- package/dist/vendor/marketplace/zh/marketing/marketing-zhihu-strategist.md +175 -0
- package/dist/vendor/marketplace/zh/paid-media/paid-media-auditor.md +170 -0
- package/dist/vendor/marketplace/zh/paid-media/paid-media-creative-strategist.md +173 -0
- package/dist/vendor/marketplace/zh/paid-media/paid-media-paid-social-strategist.md +180 -0
- package/dist/vendor/marketplace/zh/paid-media/paid-media-ppc-strategist.md +180 -0
- package/dist/vendor/marketplace/zh/paid-media/paid-media-programmatic-buyer.md +177 -0
- package/dist/vendor/marketplace/zh/paid-media/paid-media-search-query-analyst.md +182 -0
- package/dist/vendor/marketplace/zh/paid-media/paid-media-tracking-specialist.md +199 -0
- package/dist/vendor/marketplace/zh/product/product-behavioral-nudge-engine.md +246 -0
- package/dist/vendor/marketplace/zh/product/product-feedback-synthesizer.md +175 -0
- package/dist/vendor/marketplace/zh/product/product-manager.md +474 -0
- package/dist/vendor/marketplace/zh/product/product-sprint-prioritizer.md +133 -0
- package/dist/vendor/marketplace/zh/product/product-trend-researcher.md +143 -0
- package/dist/vendor/marketplace/zh/project-management/project-management-experiment-tracker.md +206 -0
- package/dist/vendor/marketplace/zh/project-management/project-management-jira-workflow-steward.md +249 -0
- package/dist/vendor/marketplace/zh/project-management/project-management-project-shepherd.md +202 -0
- package/dist/vendor/marketplace/zh/project-management/project-management-studio-operations.md +208 -0
- package/dist/vendor/marketplace/zh/project-management/project-management-studio-producer.md +211 -0
- package/dist/vendor/marketplace/zh/project-management/project-manager-senior.md +135 -0
- package/dist/vendor/marketplace/zh/sales/sales-account-strategist.md +243 -0
- package/dist/vendor/marketplace/zh/sales/sales-coach.md +291 -0
- package/dist/vendor/marketplace/zh/sales/sales-deal-strategist.md +204 -0
- package/dist/vendor/marketplace/zh/sales/sales-discovery-coach.md +230 -0
- package/dist/vendor/marketplace/zh/sales/sales-engineer.md +200 -0
- package/dist/vendor/marketplace/zh/sales/sales-outbound-strategist.md +208 -0
- package/dist/vendor/marketplace/zh/sales/sales-pipeline-analyst.md +284 -0
- package/dist/vendor/marketplace/zh/sales/sales-proposal-strategist.md +233 -0
- package/dist/vendor/marketplace/zh/spatial-computing/macos-spatial-metal-engineer.md +337 -0
- package/dist/vendor/marketplace/zh/spatial-computing/terminal-integration-specialist.md +236 -0
- package/dist/vendor/marketplace/zh/spatial-computing/visionos-spatial-engineer.md +282 -0
- package/dist/vendor/marketplace/zh/spatial-computing/xr-cockpit-interaction-specialist.md +220 -0
- package/dist/vendor/marketplace/zh/spatial-computing/xr-immersive-developer.md +229 -0
- package/dist/vendor/marketplace/zh/spatial-computing/xr-interface-architect.md +253 -0
- package/dist/vendor/marketplace/zh/specialized/accounts-payable-agent.md +212 -0
- package/dist/vendor/marketplace/zh/specialized/agentic-identity-trust.md +388 -0
- package/dist/vendor/marketplace/zh/specialized/agents-orchestrator.md +366 -0
- package/dist/vendor/marketplace/zh/specialized/automation-governance-architect.md +215 -0
- package/dist/vendor/marketplace/zh/specialized/blockchain-security-auditor.md +484 -0
- package/dist/vendor/marketplace/zh/specialized/compliance-auditor.md +172 -0
- package/dist/vendor/marketplace/zh/specialized/corporate-training-designer.md +191 -0
- package/dist/vendor/marketplace/zh/specialized/data-consolidation-agent.md +327 -0
- package/dist/vendor/marketplace/zh/specialized/gaokao-college-advisor.md +333 -0
- package/dist/vendor/marketplace/zh/specialized/government-digital-presales-consultant.md +362 -0
- package/dist/vendor/marketplace/zh/specialized/healthcare-customer-service.md +388 -0
- package/dist/vendor/marketplace/zh/specialized/healthcare-marketing-compliance.md +394 -0
- package/dist/vendor/marketplace/zh/specialized/hospitality-guest-services.md +597 -0
- package/dist/vendor/marketplace/zh/specialized/hr-onboarding.md +450 -0
- package/dist/vendor/marketplace/zh/specialized/identity-graph-operator.md +270 -0
- package/dist/vendor/marketplace/zh/specialized/language-translator.md +275 -0
- package/dist/vendor/marketplace/zh/specialized/legal-billing-time-tracking.md +566 -0
- package/dist/vendor/marketplace/zh/specialized/legal-client-intake.md +487 -0
- package/dist/vendor/marketplace/zh/specialized/legal-document-review.md +452 -0
- package/dist/vendor/marketplace/zh/specialized/livestock-archive-auditor.md +135 -0
- package/dist/vendor/marketplace/zh/specialized/loan-officer-assistant.md +549 -0
- package/dist/vendor/marketplace/zh/specialized/lsp-index-engineer.md +334 -0
- package/dist/vendor/marketplace/zh/specialized/prompt-engineer.md +176 -0
- package/dist/vendor/marketplace/zh/specialized/real-estate-buyer-seller.md +594 -0
- package/dist/vendor/marketplace/zh/specialized/recruitment-specialist.md +508 -0
- package/dist/vendor/marketplace/zh/specialized/report-distribution-agent.md +354 -0
- package/dist/vendor/marketplace/zh/specialized/retail-customer-returns.md +564 -0
- package/dist/vendor/marketplace/zh/specialized/sales-data-extraction-agent.md +159 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-ai-policy-writer.md +217 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-chief-of-staff.md +278 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-civil-engineer.md +355 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-cultural-intelligence-strategist.md +168 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-developer-advocate.md +334 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-document-generator.md +346 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-french-consulting-market.md +191 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-korean-business-navigator.md +215 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-mcp-builder.md +351 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-meeting-assistant.md +236 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-model-qa.md +507 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-pricing-optimizer.md +254 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-risk-assessor.md +240 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-salesforce-architect.md +179 -0
- package/dist/vendor/marketplace/zh/specialized/specialized-workflow-architect.md +596 -0
- package/dist/vendor/marketplace/zh/specialized/study-abroad-advisor.md +281 -0
- package/dist/vendor/marketplace/zh/specialized/technical-translator-agent.md +167 -0
- package/dist/vendor/marketplace/zh/specialized/zk-steward.md +228 -0
- package/dist/vendor/marketplace/zh/supply-chain/supply-chain-inventory-forecaster.md +212 -0
- package/dist/vendor/marketplace/zh/supply-chain/supply-chain-route-optimizer.md +224 -0
- package/dist/vendor/marketplace/zh/supply-chain/supply-chain-strategist.md +581 -0
- package/dist/vendor/marketplace/zh/supply-chain/supply-chain-vendor-evaluator.md +232 -0
- package/dist/vendor/marketplace/zh/support/support-analytics-reporter.md +364 -0
- package/dist/vendor/marketplace/zh/support/support-executive-summary-generator.md +217 -0
- package/dist/vendor/marketplace/zh/support/support-finance-tracker.md +447 -0
- package/dist/vendor/marketplace/zh/support/support-infrastructure-maintainer.md +623 -0
- package/dist/vendor/marketplace/zh/support/support-legal-compliance-checker.md +587 -0
- package/dist/vendor/marketplace/zh/support/support-recruitment-specialist.md +508 -0
- package/dist/vendor/marketplace/zh/support/support-support-responder.md +584 -0
- package/dist/vendor/marketplace/zh/testing/testing-accessibility-auditor.md +329 -0
- package/dist/vendor/marketplace/zh/testing/testing-api-tester.md +305 -0
- package/dist/vendor/marketplace/zh/testing/testing-embedded-qa-engineer.md +258 -0
- package/dist/vendor/marketplace/zh/testing/testing-evidence-collector.md +153 -0
- package/dist/vendor/marketplace/zh/testing/testing-performance-benchmarker.md +196 -0
- package/dist/vendor/marketplace/zh/testing/testing-reality-checker.md +235 -0
- package/dist/vendor/marketplace/zh/testing/testing-test-results-analyzer.md +313 -0
- package/dist/vendor/marketplace/zh/testing/testing-tool-evaluator.md +402 -0
- package/dist/vendor/marketplace/zh/testing/testing-workflow-optimizer.md +458 -0
- package/package.json +131 -0
- package/scripts/postinstall-native-artifacts.mjs +113 -0
- package/web/dist/assets/AddWorkerDialog-BU2Fn-Mx.js +2 -0
- package/web/dist/assets/AddWorkspaceFlow-BV04MkRt.js +1 -0
- package/web/dist/assets/FirstRunWizard-DS4IYOrd.js +1 -0
- package/web/dist/assets/MarketplaceDrawer-CIQ2B6Fx.js +76 -0
- package/web/dist/assets/TaskGraphDrawer-BPMcRocd.js +1 -0
- package/web/dist/assets/WhatsNewDialog-DEgVY_LD.js +1 -0
- package/web/dist/assets/WorkerModal-DiCcTPpc.js +1 -0
- package/web/dist/assets/WorkflowsDrawer-M2CgAJWK.js +1 -0
- package/web/dist/assets/WorkspaceMemoryDrawer-ClJIqWck.js +1 -0
- package/web/dist/assets/WorkspaceTaskDrawer-gjvXuZ2K.js +1 -0
- package/web/dist/assets/addon-clipboard-wHJhZAA4.js +1 -0
- package/web/dist/assets/addon-fit-DX4qG4td.js +1 -0
- package/web/dist/assets/addon-unicode11-Bt8F3D7-.js +7 -0
- package/web/dist/assets/addon-web-links-DIbG5aQx.js +1 -0
- package/web/dist/assets/addon-webgl-DCtw1yLn.js +64 -0
- package/web/dist/assets/finder-C4Jmsb0B.png +0 -0
- package/web/dist/assets/ghostty-D-Js4rdm.png +0 -0
- package/web/dist/assets/index-bOMtwrkA.js +73 -0
- package/web/dist/assets/index-i9YgsMdD.css +1 -0
- package/web/dist/assets/path-join-7MR1s7b1.js +1 -0
- package/web/dist/assets/search-CmzeVhy0.js +1 -0
- package/web/dist/assets/xterm-B-qIQCd3.js +16 -0
- package/web/dist/assets/zed-C5BQT8X3.png +0 -0
- package/web/dist/bilibili.ico +0 -0
- package/web/dist/cli-icons/claude.png +0 -0
- package/web/dist/cli-icons/codex.png +0 -0
- package/web/dist/cli-icons/gemini.png +0 -0
- package/web/dist/cli-icons/hermes.png +0 -0
- package/web/dist/cli-icons/opencode.svg +18 -0
- package/web/dist/icons/apple-touch-icon-180.png +0 -0
- package/web/dist/icons/icon-192.png +0 -0
- package/web/dist/icons/icon-32.png +0 -0
- package/web/dist/icons/icon-512-maskable.png +0 -0
- package/web/dist/icons/icon-512.png +0 -0
- package/web/dist/index.html +39 -0
- package/web/dist/logo.png +0 -0
- package/web/dist/manifest.webmanifest +60 -0
- package/web/dist/screenshots/wide-overview.png +0 -0
- package/web/dist/sounds/LICENSE-KENNEY.txt +22 -0
- package/web/dist/sounds/hive-beacon.ogg +0 -0
- package/web/dist/sounds/hive-cascade.ogg +0 -0
- package/web/dist/sounds/hive-chime.ogg +0 -0
- package/web/dist/sounds/hive-ping.ogg +0 -0
- package/web/dist/sounds/hive-resolve.ogg +0 -0
- package/web/dist/sounds/hive-soft.ogg +0 -0
- package/web/dist/sw.js +99 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { doesCapturedSessionExist } from './session-capture.js';
|
|
2
|
+
const appendUniqueArgs = (prefix, args) => {
|
|
3
|
+
const seen = new Set(prefix);
|
|
4
|
+
return prefix.concat(args.filter((arg) => !seen.has(arg)));
|
|
5
|
+
};
|
|
6
|
+
const unquoteExecutable = (command) => command.trim().replace(/^"(.+)"$/, '$1');
|
|
7
|
+
const isNodeExecutable = (command) => {
|
|
8
|
+
if (!command)
|
|
9
|
+
return false;
|
|
10
|
+
return /(?:^|[\\/])node(?:\.exe)?$/iu.test(unquoteExecutable(command));
|
|
11
|
+
};
|
|
12
|
+
const isCodexNpmEntrypoint = (arg) => {
|
|
13
|
+
if (!arg)
|
|
14
|
+
return false;
|
|
15
|
+
const normalized = arg.replace(/\\/gu, '/');
|
|
16
|
+
return /(?:^|\/)@openai\/codex\/bin\/codex\.js$/iu.test(normalized);
|
|
17
|
+
};
|
|
18
|
+
const isCodexPreset = (preset) => preset?.id === 'codex' ||
|
|
19
|
+
preset?.command === 'codex' ||
|
|
20
|
+
preset?.sessionIdCapture?.source === 'codex_session_jsonl_dir';
|
|
21
|
+
const normalizeCodexNodeEntrypoint = (config, preset) => {
|
|
22
|
+
if (!isCodexPreset(preset) || !isNodeExecutable(config.command))
|
|
23
|
+
return config;
|
|
24
|
+
const args = config.args ?? [];
|
|
25
|
+
if (!isCodexNpmEntrypoint(args[0]))
|
|
26
|
+
return config;
|
|
27
|
+
return {
|
|
28
|
+
...config,
|
|
29
|
+
args: args.slice(1),
|
|
30
|
+
command: preset?.command ?? 'codex',
|
|
31
|
+
interactiveCommand: isNodeExecutable(config.interactiveCommand)
|
|
32
|
+
? 'codex'
|
|
33
|
+
: (config.interactiveCommand ?? 'codex'),
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
const getEffectiveCapture = (config, preset) => config.sessionIdCapture ?? preset?.sessionIdCapture ?? null;
|
|
37
|
+
const getEffectiveResumeTemplate = (config, preset) => config.resumeArgsTemplate ?? preset?.resumeArgsTemplate ?? null;
|
|
38
|
+
const withPresetYoloArgs = (config, preset) => {
|
|
39
|
+
const yoloArgs = preset?.yoloArgsTemplate;
|
|
40
|
+
if (!yoloArgs?.length)
|
|
41
|
+
return config;
|
|
42
|
+
const nextArgs = appendUniqueArgs(yoloArgs, config.args ?? []);
|
|
43
|
+
if (nextArgs.length === (config.args ?? []).length &&
|
|
44
|
+
nextArgs.every((arg, index) => arg === (config.args ?? [])[index])) {
|
|
45
|
+
return config;
|
|
46
|
+
}
|
|
47
|
+
return { ...config, args: nextArgs };
|
|
48
|
+
};
|
|
49
|
+
const getPresetYoloArgs = (preset) => preset?.yoloArgsTemplate ?? [];
|
|
50
|
+
const hasResumeArgs = (args) => args.includes('--resume') ||
|
|
51
|
+
args.includes('-r') ||
|
|
52
|
+
args.includes('--continue') ||
|
|
53
|
+
args.includes('-c') ||
|
|
54
|
+
args.includes('--session') ||
|
|
55
|
+
args.includes('-s') ||
|
|
56
|
+
args[0] === 'resume';
|
|
57
|
+
const shouldVerifySessionBeforeResume = (capture) => {
|
|
58
|
+
// Claude is a cheap project-dir existence check; OpenCode is a direct DB query.
|
|
59
|
+
// Codex/Gemini require broad session-store scans, so trust the persisted id and
|
|
60
|
+
// let the CLI fail fast if it is stale.
|
|
61
|
+
return capture?.source === 'claude_project_jsonl_dir' || capture?.source === 'opencode_session_db';
|
|
62
|
+
};
|
|
63
|
+
const supportsPresetResume = (capture) => capture?.source === 'claude_project_jsonl_dir' ||
|
|
64
|
+
capture?.source === 'codex_session_jsonl_dir' ||
|
|
65
|
+
capture?.source === 'gemini_session_json_dir' ||
|
|
66
|
+
capture?.source === 'opencode_session_db' ||
|
|
67
|
+
capture?.source === 'stdout_regex';
|
|
68
|
+
export const withPresetResumeArgs = (config, preset, lastSessionId, cwd, discriminator, onInvalidSessionId) => {
|
|
69
|
+
const launchConfig = normalizeCodexNodeEntrypoint(config, preset);
|
|
70
|
+
let nextConfig = withPresetYoloArgs(launchConfig, preset);
|
|
71
|
+
const sessionIdCapture = getEffectiveCapture(nextConfig, preset);
|
|
72
|
+
if (sessionIdCapture && sessionIdCapture !== nextConfig.sessionIdCapture) {
|
|
73
|
+
nextConfig = { ...nextConfig, sessionIdCapture };
|
|
74
|
+
}
|
|
75
|
+
const resumeArgsTemplate = getEffectiveResumeTemplate(nextConfig, preset);
|
|
76
|
+
if (!lastSessionId || !resumeArgsTemplate)
|
|
77
|
+
return nextConfig;
|
|
78
|
+
if (sessionIdCapture && !supportsPresetResume(sessionIdCapture))
|
|
79
|
+
return nextConfig;
|
|
80
|
+
if (cwd &&
|
|
81
|
+
sessionIdCapture &&
|
|
82
|
+
shouldVerifySessionBeforeResume(sessionIdCapture) &&
|
|
83
|
+
!doesCapturedSessionExist(cwd, sessionIdCapture, lastSessionId, discriminator)) {
|
|
84
|
+
onInvalidSessionId?.(lastSessionId);
|
|
85
|
+
return nextConfig;
|
|
86
|
+
}
|
|
87
|
+
const args = launchConfig.args ?? [];
|
|
88
|
+
if (hasResumeArgs(args))
|
|
89
|
+
return nextConfig;
|
|
90
|
+
const yoloArgs = getPresetYoloArgs(preset);
|
|
91
|
+
const resumeArgs = resumeArgsTemplate.replace('{session_id}', lastSessionId).trim().split(/\s+/);
|
|
92
|
+
return {
|
|
93
|
+
...nextConfig,
|
|
94
|
+
args: appendUniqueArgs(yoloArgs, resumeArgs.concat(args)),
|
|
95
|
+
resumeArgsTemplate,
|
|
96
|
+
resumedSessionId: lastSessionId,
|
|
97
|
+
};
|
|
98
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type OutputListener = (chunk: string) => void;
|
|
2
|
+
export interface PtyOutputBus {
|
|
3
|
+
clear: (runId: string) => void;
|
|
4
|
+
publish: (runId: string, chunk: string) => void;
|
|
5
|
+
subscribe: (runId: string, listener: OutputListener) => () => void;
|
|
6
|
+
}
|
|
7
|
+
export declare const createPtyOutputBus: () => PtyOutputBus;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export const createPtyOutputBus = () => {
|
|
2
|
+
const listenersByRunId = new Map();
|
|
3
|
+
const getListeners = (runId) => {
|
|
4
|
+
let listeners = listenersByRunId.get(runId);
|
|
5
|
+
if (!listeners) {
|
|
6
|
+
listeners = new Set();
|
|
7
|
+
listenersByRunId.set(runId, listeners);
|
|
8
|
+
}
|
|
9
|
+
return listeners;
|
|
10
|
+
};
|
|
11
|
+
return {
|
|
12
|
+
clear(runId) {
|
|
13
|
+
listenersByRunId.delete(runId);
|
|
14
|
+
},
|
|
15
|
+
publish(runId, chunk) {
|
|
16
|
+
const listeners = listenersByRunId.get(runId);
|
|
17
|
+
if (!listeners)
|
|
18
|
+
return;
|
|
19
|
+
for (const listener of listeners)
|
|
20
|
+
listener(chunk);
|
|
21
|
+
},
|
|
22
|
+
subscribe(runId, listener) {
|
|
23
|
+
const listeners = getListeners(runId);
|
|
24
|
+
listeners.add(listener);
|
|
25
|
+
return () => {
|
|
26
|
+
listeners.delete(listener);
|
|
27
|
+
if (listeners.size === 0)
|
|
28
|
+
listenersByRunId.delete(runId);
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AgentSummary, WorkspaceSummary } from '../shared/types.js';
|
|
2
|
+
import { type FeatureFlags } from './feature-flags.js';
|
|
3
|
+
import type { RecoveryMessage } from './message-log-store.js';
|
|
4
|
+
export declare const buildRecoverySummary: ({ agent, allTaskMessages, memoryDigest, messages, tasksContent, workers, workspace, flags, }: {
|
|
5
|
+
agent: AgentSummary;
|
|
6
|
+
allTaskMessages?: RecoveryMessage[];
|
|
7
|
+
memoryDigest?: string | null | undefined;
|
|
8
|
+
messages: RecoveryMessage[];
|
|
9
|
+
tasksContent: string;
|
|
10
|
+
workers: AgentSummary[];
|
|
11
|
+
workspace: WorkspaceSummary;
|
|
12
|
+
/** Live experimental flags — keep the recovered handover prompt consistent
|
|
13
|
+
* with what a fresh startup would inject (workflow + team-sizing rules). */
|
|
14
|
+
flags?: FeatureFlags;
|
|
15
|
+
}) => string;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { FEATURE_FLAGS_ALL_OFF } from './feature-flags.js';
|
|
2
|
+
import { getHiveTeamRules } from './hive-team-guidance.js';
|
|
3
|
+
import { wrapSystemMessage } from './system-message.js';
|
|
4
|
+
import { TASKS_RELATIVE_PATH } from './tasks-file.js';
|
|
5
|
+
const TASKS_HEAD_LIMIT = 1536;
|
|
6
|
+
const formatUserInputs = (messages) => {
|
|
7
|
+
const userInputs = messages.filter((message) => message.type === 'user_input');
|
|
8
|
+
return userInputs.length > 0
|
|
9
|
+
? userInputs.slice(-5).map((message) => `- user: ${message.text}`)
|
|
10
|
+
: ['- (no new user_input in the last hour)'];
|
|
11
|
+
};
|
|
12
|
+
const formatTaskEvents = (messages, agent) => {
|
|
13
|
+
const taskEvents = messages.filter((message) => {
|
|
14
|
+
if (agent.role === 'orchestrator') {
|
|
15
|
+
if (message.type === 'send')
|
|
16
|
+
return message.from === agent.id;
|
|
17
|
+
return message.type === 'report' || message.type === 'status';
|
|
18
|
+
}
|
|
19
|
+
if (message.type === 'send')
|
|
20
|
+
return message.to === agent.id || message.from === agent.id;
|
|
21
|
+
return (message.type === 'report' || message.type === 'status') && message.from === agent.id;
|
|
22
|
+
});
|
|
23
|
+
return taskEvents.length > 0
|
|
24
|
+
? taskEvents.slice(-8).map((message) => {
|
|
25
|
+
if (message.type === 'send')
|
|
26
|
+
return `- send -> ${message.to}: ${message.text}`;
|
|
27
|
+
if (message.type === 'status')
|
|
28
|
+
return `- status <- ${message.from}: ${message.text}`;
|
|
29
|
+
const status = message.status ? ` [${message.status}]` : '';
|
|
30
|
+
return `- report <- ${message.from}${status}: ${message.text}`;
|
|
31
|
+
})
|
|
32
|
+
: ['- (no recent task events)'];
|
|
33
|
+
};
|
|
34
|
+
const getOpenTaskTargets = (agent, workers) => agent.role === 'orchestrator' ? workers : [agent];
|
|
35
|
+
const formatOpenTasks = (messages, agent, workers) => {
|
|
36
|
+
const targetAgents = getOpenTaskTargets(agent, workers).filter((target) => target.role !== 'orchestrator');
|
|
37
|
+
const targetIds = new Set(targetAgents.map((target) => target.id));
|
|
38
|
+
const queues = new Map();
|
|
39
|
+
for (const message of messages) {
|
|
40
|
+
if (message.type === 'send' && targetIds.has(message.to)) {
|
|
41
|
+
const queue = queues.get(message.to) ?? [];
|
|
42
|
+
queue.push(message);
|
|
43
|
+
queues.set(message.to, queue);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (message.type === 'report' && targetIds.has(message.from)) {
|
|
47
|
+
queues.get(message.from)?.shift();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const lines = [];
|
|
51
|
+
for (const target of targetAgents) {
|
|
52
|
+
const queue = queues.get(target.id) ?? [];
|
|
53
|
+
for (const task of queue.slice(-8)) {
|
|
54
|
+
lines.push(`- ${target.name}: ${task.text}`);
|
|
55
|
+
}
|
|
56
|
+
if (target.pendingTaskCount > queue.length) {
|
|
57
|
+
lines.push(`- ${target.name}: ${target.pendingTaskCount - queue.length} pending with no recoverable detail`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return lines.length > 0 ? lines : ['- (no open tasks right now)'];
|
|
61
|
+
};
|
|
62
|
+
const formatWorkers = (workers) => {
|
|
63
|
+
if (workers.length === 0)
|
|
64
|
+
return ['- (no other workers)'];
|
|
65
|
+
return workers.map((worker) => `- ${worker.name} (${worker.role}, ${worker.status}, pending_task_count: ${worker.pendingTaskCount})`);
|
|
66
|
+
};
|
|
67
|
+
const getTaskSectionTitle = (agent) => agent.role === 'orchestrator' ? '## Tasks you dispatched' : '## Tasks recently sent to you';
|
|
68
|
+
export const buildRecoverySummary = ({ agent, allTaskMessages, memoryDigest, messages, tasksContent, workers, workspace, flags = FEATURE_FLAGS_ALL_OFF, }) => wrapSystemMessage([
|
|
69
|
+
`You are ${agent.name} (${agent.role}) in workspace ${workspace.name}.`,
|
|
70
|
+
'Hive just restarted you and could not recover via native session resume. Here is the handover context.',
|
|
71
|
+
'',
|
|
72
|
+
'## Conversation with the user in the last hour',
|
|
73
|
+
...formatUserInputs(messages),
|
|
74
|
+
'',
|
|
75
|
+
getTaskSectionTitle(agent),
|
|
76
|
+
...formatTaskEvents(messages, agent),
|
|
77
|
+
'',
|
|
78
|
+
'## Open tasks',
|
|
79
|
+
...formatOpenTasks(allTaskMessages ?? messages, agent, workers),
|
|
80
|
+
'',
|
|
81
|
+
`## Current ${TASKS_RELATIVE_PATH}`,
|
|
82
|
+
tasksContent.slice(0, TASKS_HEAD_LIMIT) || '(empty)',
|
|
83
|
+
'',
|
|
84
|
+
'## Active workers',
|
|
85
|
+
...formatWorkers(workers),
|
|
86
|
+
'',
|
|
87
|
+
...(memoryDigest ? ['## Hive memory digest', memoryDigest, ''] : []),
|
|
88
|
+
agent.role === 'orchestrator' ? '## Hive worker dispatch rules' : '## Hive worker boundaries',
|
|
89
|
+
...getHiveTeamRules(agent, flags),
|
|
90
|
+
'',
|
|
91
|
+
'Continue from here. If unsure, ask the user.',
|
|
92
|
+
].join('\n'));
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Database } from 'better-sqlite3';
|
|
2
|
+
export type RemoteAuditResult = 'ok' | 'rejected' | 'error';
|
|
3
|
+
export type RemoteAuditAction = 'http' | 'ws_input' | 'ws_open' | 'session_open' | 'session_close' | 'revoke' | 'reject';
|
|
4
|
+
export interface RemoteAuditEvent {
|
|
5
|
+
/** M1 session device id. Audit/revocation tag only — never a permission branch. */
|
|
6
|
+
deviceId?: string | null;
|
|
7
|
+
/** Coarse category (see RemoteAuditAction). */
|
|
8
|
+
action: RemoteAuditAction;
|
|
9
|
+
/** Whitelisted path for http/ws actions (`/api/...`, `/ws/...`); omit otherwise. */
|
|
10
|
+
endpoint?: string | null;
|
|
11
|
+
/** Affected workspace, when the action is scoped to one. */
|
|
12
|
+
workspaceId?: string | null;
|
|
13
|
+
result: RemoteAuditResult;
|
|
14
|
+
/** Required-in-spirit on a rejection: the concrete reason (off-whitelist, revoked, …). */
|
|
15
|
+
rejectReason?: string | null;
|
|
16
|
+
/** WS-input byte count. The full chunk is NEVER stored. */
|
|
17
|
+
byteCount?: number | null;
|
|
18
|
+
/** Short truncated preview of WS input. Bounded here, not by the caller. */
|
|
19
|
+
preview?: string | null;
|
|
20
|
+
}
|
|
21
|
+
export interface RemoteAuditRecord {
|
|
22
|
+
id: number;
|
|
23
|
+
deviceId: string | null;
|
|
24
|
+
ts: number;
|
|
25
|
+
workspaceId: string | null;
|
|
26
|
+
action: string;
|
|
27
|
+
endpoint: string | null;
|
|
28
|
+
result: string;
|
|
29
|
+
rejectReason: string | null;
|
|
30
|
+
byteCount: number | null;
|
|
31
|
+
preview: string | null;
|
|
32
|
+
}
|
|
33
|
+
export declare const AUDIT_PREVIEW_MAX = 120;
|
|
34
|
+
export declare const createRemoteAuditStore: (db: Database) => {
|
|
35
|
+
/**
|
|
36
|
+
* Record an audit event. Returns immediately; the row is written on a
|
|
37
|
+
* later microtask. This is the ONLY method the tunnel calls on the hot path.
|
|
38
|
+
*/
|
|
39
|
+
enqueue(event: RemoteAuditEvent, ts?: number): void;
|
|
40
|
+
/**
|
|
41
|
+
* Drain the buffer synchronously and await the pending write. Tests await
|
|
42
|
+
* this to assert rows deterministically; shutdown calls it to avoid losing
|
|
43
|
+
* the tail of the buffer. Idempotent when there's nothing pending.
|
|
44
|
+
*/
|
|
45
|
+
flush(): Promise<void>;
|
|
46
|
+
/** Newest-first audit rows, capped at `limit`. Backs the Settings stream. */
|
|
47
|
+
list(limit?: number): RemoteAuditRecord[];
|
|
48
|
+
/** Newest-first rows for one device. Used by the device-detail view. */
|
|
49
|
+
listForDevice(deviceId: string, limit?: number): RemoteAuditRecord[];
|
|
50
|
+
};
|
|
51
|
+
export type RemoteAuditStore = ReturnType<typeof createRemoteAuditStore>;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// stdin previews are bounded so a paste of a megabyte of secrets can't end up in
|
|
2
|
+
// the audit table. byte_count carries the real size; preview is just enough to
|
|
3
|
+
// recognise the input in the Settings stream.
|
|
4
|
+
export const AUDIT_PREVIEW_MAX = 120;
|
|
5
|
+
const truncatePreview = (preview) => {
|
|
6
|
+
if (preview === null || preview === undefined)
|
|
7
|
+
return null;
|
|
8
|
+
if (preview.length <= AUDIT_PREVIEW_MAX)
|
|
9
|
+
return preview;
|
|
10
|
+
return `${preview.slice(0, AUDIT_PREVIEW_MAX)}…`;
|
|
11
|
+
};
|
|
12
|
+
export const createRemoteAuditStore = (db) => {
|
|
13
|
+
const insert = db.prepare(`INSERT INTO remote_audit
|
|
14
|
+
(remote_device_id, ts, workspace_id, action, endpoint, result, reject_reason, byte_count, preview)
|
|
15
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
16
|
+
const listStmt = db.prepare(`SELECT id, remote_device_id, ts, workspace_id, action, endpoint, result, reject_reason, byte_count, preview
|
|
17
|
+
FROM remote_audit
|
|
18
|
+
ORDER BY id DESC
|
|
19
|
+
LIMIT ?`);
|
|
20
|
+
const listForDeviceStmt = db.prepare(`SELECT id, remote_device_id, ts, workspace_id, action, endpoint, result, reject_reason, byte_count, preview
|
|
21
|
+
FROM remote_audit
|
|
22
|
+
WHERE remote_device_id = ?
|
|
23
|
+
ORDER BY id DESC
|
|
24
|
+
LIMIT ?`);
|
|
25
|
+
// Pending events buffered between flushes. enqueue() never touches SQLite
|
|
26
|
+
// directly — it appends here and arms a single microtask drain, so a burst of
|
|
27
|
+
// terminal keystrokes coalesces into one transaction instead of N.
|
|
28
|
+
const pending = [];
|
|
29
|
+
let flushScheduled = false;
|
|
30
|
+
let draining = null;
|
|
31
|
+
const writePending = () => {
|
|
32
|
+
if (pending.length === 0)
|
|
33
|
+
return;
|
|
34
|
+
const batch = pending.splice(0, pending.length);
|
|
35
|
+
const tx = db.transaction((events) => {
|
|
36
|
+
for (const e of events) {
|
|
37
|
+
insert.run(e.deviceId ?? null, e.ts, e.workspaceId ?? null, e.action, e.endpoint ?? null, e.result, e.rejectReason ?? null, typeof e.byteCount === 'number' ? e.byteCount : null, truncatePreview(e.preview));
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
tx(batch);
|
|
41
|
+
};
|
|
42
|
+
const scheduleFlush = () => {
|
|
43
|
+
if (flushScheduled)
|
|
44
|
+
return;
|
|
45
|
+
flushScheduled = true;
|
|
46
|
+
draining = new Promise((resolve) => {
|
|
47
|
+
// queueMicrotask keeps the write off the forwarding call stack while
|
|
48
|
+
// still landing before the event loop yields to I/O, so audit rows for a
|
|
49
|
+
// request are durable well before the response round-trips.
|
|
50
|
+
queueMicrotask(() => {
|
|
51
|
+
flushScheduled = false;
|
|
52
|
+
try {
|
|
53
|
+
writePending();
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// A failed audit write must not crash the tunnel. Drop the batch and
|
|
57
|
+
// keep forwarding; losing an audit row is strictly better than
|
|
58
|
+
// dropping a user's terminal input.
|
|
59
|
+
}
|
|
60
|
+
resolve();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
const mapRow = (row) => ({
|
|
65
|
+
id: row.id,
|
|
66
|
+
deviceId: row.remote_device_id,
|
|
67
|
+
ts: row.ts,
|
|
68
|
+
workspaceId: row.workspace_id,
|
|
69
|
+
action: row.action,
|
|
70
|
+
endpoint: row.endpoint,
|
|
71
|
+
result: row.result,
|
|
72
|
+
rejectReason: row.reject_reason,
|
|
73
|
+
byteCount: row.byte_count,
|
|
74
|
+
preview: row.preview,
|
|
75
|
+
});
|
|
76
|
+
return {
|
|
77
|
+
/**
|
|
78
|
+
* Record an audit event. Returns immediately; the row is written on a
|
|
79
|
+
* later microtask. This is the ONLY method the tunnel calls on the hot path.
|
|
80
|
+
*/
|
|
81
|
+
enqueue(event, ts = Date.now()) {
|
|
82
|
+
pending.push({ ...event, ts });
|
|
83
|
+
scheduleFlush();
|
|
84
|
+
},
|
|
85
|
+
/**
|
|
86
|
+
* Drain the buffer synchronously and await the pending write. Tests await
|
|
87
|
+
* this to assert rows deterministically; shutdown calls it to avoid losing
|
|
88
|
+
* the tail of the buffer. Idempotent when there's nothing pending.
|
|
89
|
+
*/
|
|
90
|
+
async flush() {
|
|
91
|
+
// Settle any already-scheduled drain first, then force-write whatever the
|
|
92
|
+
// caller enqueued after it was scheduled (or never scheduled at all).
|
|
93
|
+
if (draining)
|
|
94
|
+
await draining;
|
|
95
|
+
writePending();
|
|
96
|
+
},
|
|
97
|
+
/** Newest-first audit rows, capped at `limit`. Backs the Settings stream. */
|
|
98
|
+
list(limit = 100) {
|
|
99
|
+
writePending();
|
|
100
|
+
return listStmt.all(limit).map(mapRow);
|
|
101
|
+
},
|
|
102
|
+
/** Newest-first rows for one device. Used by the device-detail view. */
|
|
103
|
+
listForDevice(deviceId, limit = 100) {
|
|
104
|
+
writePending();
|
|
105
|
+
return listForDeviceStmt.all(deviceId, limit).map(mapRow);
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const REMOTE_GATEWAY_URL_KEY = "remote_gateway_url";
|
|
2
|
+
export declare const REMOTE_DAEMON_TOKEN_KEY = "remote_daemon_token";
|
|
3
|
+
export declare const REMOTE_DAEMON_ID_KEY = "remote_daemon_id";
|
|
4
|
+
export declare const REMOTE_ENABLED_KEY = "remote_enabled";
|
|
5
|
+
export declare const DEFAULT_GATEWAY_URL = "https://app.hivehq.dev";
|
|
6
|
+
export interface RemoteAppStateReader {
|
|
7
|
+
get(key: string): {
|
|
8
|
+
value: string | null;
|
|
9
|
+
} | undefined;
|
|
10
|
+
}
|
|
11
|
+
export interface RemoteConfigSource {
|
|
12
|
+
isEnabled(): boolean;
|
|
13
|
+
getGatewayUrl(): string | null;
|
|
14
|
+
getDaemonToken(): string | null;
|
|
15
|
+
getDaemonId(): string | null;
|
|
16
|
+
}
|
|
17
|
+
export declare const createRemoteConfigSource: (store: RemoteAppStateReader) => RemoteConfigSource;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Remote-access config lives in the existing app_state KV. These are the
|
|
2
|
+
// canonical key literals — the single source of truth for BOTH sides of the
|
|
3
|
+
// feature: `hive remote login/logout` (src/cli/hive-remote.ts) writes them, and
|
|
4
|
+
// the daemon-side tunnel reads them. The CLI re-exports these so there is one
|
|
5
|
+
// definition, not two that can drift (a rename on only one side would silently
|
|
6
|
+
// stop login from reaching the tunnel).
|
|
7
|
+
//
|
|
8
|
+
// snake_case to match the existing app_state keys (active_workspace_id, …).
|
|
9
|
+
export const REMOTE_GATEWAY_URL_KEY = 'remote_gateway_url';
|
|
10
|
+
export const REMOTE_DAEMON_TOKEN_KEY = 'remote_daemon_token';
|
|
11
|
+
export const REMOTE_DAEMON_ID_KEY = 'remote_daemon_id';
|
|
12
|
+
export const REMOTE_ENABLED_KEY = 'remote_enabled';
|
|
13
|
+
export const DEFAULT_GATEWAY_URL = 'https://app.hivehq.dev';
|
|
14
|
+
// remote_enabled is ON only when it is exactly the string 'true'. Everything
|
|
15
|
+
// else — absent, '', 'false', '1', 'yes' — is OFF. This is invariant 4 (off ==
|
|
16
|
+
// zero behavior change): a truthy check would let a stray value silently arm
|
|
17
|
+
// the outbound tunnel, so the test pins the exact-string semantics.
|
|
18
|
+
const ENABLED_VALUE = 'true';
|
|
19
|
+
export const createRemoteConfigSource = (store) => {
|
|
20
|
+
const read = (key) => store.get(key)?.value ?? null;
|
|
21
|
+
return {
|
|
22
|
+
isEnabled: () => read(REMOTE_ENABLED_KEY) === ENABLED_VALUE,
|
|
23
|
+
getGatewayUrl: () => read(REMOTE_GATEWAY_URL_KEY),
|
|
24
|
+
getDaemonToken: () => read(REMOTE_DAEMON_TOKEN_KEY),
|
|
25
|
+
getDaemonId: () => read(REMOTE_DAEMON_ID_KEY),
|
|
26
|
+
};
|
|
27
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const GW_CONTROL_PREFIX = "\0gw:";
|
|
2
|
+
export declare const RelayCloseCode: {
|
|
3
|
+
readonly Normal: 1000;
|
|
4
|
+
readonly ProtocolError: 4400;
|
|
5
|
+
readonly Unauthorized: 4401;
|
|
6
|
+
readonly Forbidden: 4403;
|
|
7
|
+
readonly DaemonOffline: 4404;
|
|
8
|
+
readonly Replaced: 4409;
|
|
9
|
+
readonly Revoked: 4410;
|
|
10
|
+
readonly InternalError: 4500;
|
|
11
|
+
};
|
|
12
|
+
export type RelayCloseCode = (typeof RelayCloseCode)[keyof typeof RelayCloseCode];
|
|
13
|
+
export type GatewayControl = {
|
|
14
|
+
t: 'peer-online';
|
|
15
|
+
role: 'daemon' | 'device' | 'pair';
|
|
16
|
+
jti?: string;
|
|
17
|
+
} | {
|
|
18
|
+
t: 'peer-offline';
|
|
19
|
+
role: 'daemon' | 'device' | 'pair';
|
|
20
|
+
} | {
|
|
21
|
+
t: 'revoked';
|
|
22
|
+
reason: string;
|
|
23
|
+
} | {
|
|
24
|
+
t: 'error';
|
|
25
|
+
code: number;
|
|
26
|
+
message: string;
|
|
27
|
+
};
|
|
28
|
+
export declare const HB_PING = "hb:ping";
|
|
29
|
+
export declare const HB_PONG = "hb:pong";
|
|
30
|
+
export declare const isAuthFatalCloseCode: (code: number) => boolean;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Daemon-side re-declaration of the gateway's control-band wire contract.
|
|
2
|
+
//
|
|
3
|
+
// The gateway lives in gateway/src/relay-do.ts — a separate Cloudflare-Workers package that is NOT
|
|
4
|
+
// import-reachable from src/ (importing it would drag in cloudflare:workers). So the daemon mirrors
|
|
5
|
+
// the few values it has to agree on, and tests/unit/remote-control-constants.test.ts pins each one
|
|
6
|
+
// to the literal gateway value so the wire format can never silently drift between the two sides.
|
|
7
|
+
// Control-frame sentinel. The gateway prefixes every control message (peer presence, revocation)
|
|
8
|
+
// with this so it can never be confused with an opaque binary E2E frame. relay-do.ts:29.
|
|
9
|
+
export const GW_CONTROL_PREFIX = '\x00gw:';
|
|
10
|
+
// WebSocket close codes (4xxx app range). relay-do.ts:32-41.
|
|
11
|
+
export const RelayCloseCode = {
|
|
12
|
+
Normal: 1000,
|
|
13
|
+
ProtocolError: 4400,
|
|
14
|
+
Unauthorized: 4401,
|
|
15
|
+
Forbidden: 4403,
|
|
16
|
+
DaemonOffline: 4404,
|
|
17
|
+
Replaced: 4409,
|
|
18
|
+
Revoked: 4410,
|
|
19
|
+
InternalError: 4500,
|
|
20
|
+
};
|
|
21
|
+
// Idle keepalive: the daemon SENDS this app-level string and the DO auto-replies HB_PONG WITHOUT
|
|
22
|
+
// waking (setWebSocketAutoResponse, relay-do.ts:144). A protocol-level ws.ping() would wake the DO
|
|
23
|
+
// and burn duration — the heartbeat MUST be this string, never ws.ping().
|
|
24
|
+
export const HB_PING = 'hb:ping';
|
|
25
|
+
export const HB_PONG = 'hb:pong';
|
|
26
|
+
// Only these two close codes are authoritative credential death: the daemon must LATCH (stop
|
|
27
|
+
// retrying until refresh() re-reads config). Every other close — including 4404 DaemonOffline,
|
|
28
|
+
// 4409 Replaced, and the transport 1006 — is transient and backs off + retries.
|
|
29
|
+
export const isAuthFatalCloseCode = (code) => code === RelayCloseCode.Unauthorized || code === RelayCloseCode.Revoked;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Direction } from '../shared/remote-crypto.js';
|
|
2
|
+
export interface DeviceSession {
|
|
3
|
+
deviceId: string;
|
|
4
|
+
/**
|
|
5
|
+
* 32-byte directional ROOT keys from M1 deriveDaemonSession. M6.1: these are ROOTS — the bridge
|
|
6
|
+
* derives the per-connection AEAD keys from them via deriveConnectionKeys + the bilateral connection
|
|
7
|
+
* salts, and seals/opens ONLY under those connKeys. These bytes are NEVER passed to sealNext/openNext
|
|
8
|
+
* directly; that is what makes resetting seq to 0 per connection safe (the AEAD key is fresh per
|
|
9
|
+
* connection even though the root is persisted/reused).
|
|
10
|
+
*/
|
|
11
|
+
keys: {
|
|
12
|
+
d2p: Uint8Array;
|
|
13
|
+
p2d: Uint8Array;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface DeviceSessionProvider {
|
|
17
|
+
/**
|
|
18
|
+
* null => unknown / revoked / no established session. The tunnel resets the stream and audits
|
|
19
|
+
* 'no_session'; it never bridges a frame for a device it has no key for.
|
|
20
|
+
*/
|
|
21
|
+
get(deviceId: string): DeviceSession | null;
|
|
22
|
+
/**
|
|
23
|
+
* Every established session. Used ONLY to resolve which device a CHANNEL_STREAM_ID Hello came
|
|
24
|
+
* from: the relay does not tag the source device, so the daemon trial-opens the Hello against
|
|
25
|
+
* each candidate's p2d key until one authenticates (AEAD makes a wrong key fail cleanly). After
|
|
26
|
+
* the Hello opens, the daemon binds (deviceId, streamId)->device and never trial-opens that
|
|
27
|
+
* stream again. deviceId is therefore only ever the result of a successful open (invariant 5).
|
|
28
|
+
*/
|
|
29
|
+
candidates(): DeviceSession[];
|
|
30
|
+
}
|
|
31
|
+
export declare const DAEMON_OPEN_DIRECTION: Direction;
|
|
32
|
+
export declare const DAEMON_SEAL_DIRECTION: Direction;
|
|
33
|
+
export declare class InMemoryDeviceSessionProvider implements DeviceSessionProvider {
|
|
34
|
+
private readonly sessions;
|
|
35
|
+
set(session: DeviceSession): void;
|
|
36
|
+
/** Models a revoke: the key is gone, so the next frame for this device fails 'no_session'. */
|
|
37
|
+
remove(deviceId: string): void;
|
|
38
|
+
get(deviceId: string): DeviceSession | null;
|
|
39
|
+
candidates(): DeviceSession[];
|
|
40
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Daemon directions — the mirror of the device's. Exported so the tunnel, the bridge and the tests
|
|
2
|
+
// all agree on ONE source of truth for which key opens/seals which way.
|
|
3
|
+
// - the daemon OPENS inbound phone→daemon frames with p2d
|
|
4
|
+
// - the daemon SEALS outbound daemon→phone frames with d2p
|
|
5
|
+
export const DAEMON_OPEN_DIRECTION = 'p2d';
|
|
6
|
+
export const DAEMON_SEAL_DIRECTION = 'd2p';
|
|
7
|
+
export class InMemoryDeviceSessionProvider {
|
|
8
|
+
sessions = new Map();
|
|
9
|
+
set(session) {
|
|
10
|
+
this.sessions.set(session.deviceId, session);
|
|
11
|
+
}
|
|
12
|
+
/** Models a revoke: the key is gone, so the next frame for this device fails 'no_session'. */
|
|
13
|
+
remove(deviceId) {
|
|
14
|
+
this.sessions.delete(deviceId);
|
|
15
|
+
}
|
|
16
|
+
get(deviceId) {
|
|
17
|
+
return this.sessions.get(deviceId) ?? null;
|
|
18
|
+
}
|
|
19
|
+
candidates() {
|
|
20
|
+
return [...this.sessions.values()];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Database } from 'better-sqlite3';
|
|
2
|
+
import type { DeviceSession, DeviceSessionProvider } from './remote-device-session.js';
|
|
3
|
+
export interface RemoteDeviceRecord {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
createdAt: number;
|
|
7
|
+
lastActive: number | null;
|
|
8
|
+
revokedAt: number | null;
|
|
9
|
+
}
|
|
10
|
+
export interface PersistDeviceInput {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
/** The M3 DeviceSession.keys — a stored secret. */
|
|
14
|
+
keys: {
|
|
15
|
+
d2p: Uint8Array;
|
|
16
|
+
p2d: Uint8Array;
|
|
17
|
+
};
|
|
18
|
+
devicePublicKey: Uint8Array;
|
|
19
|
+
}
|
|
20
|
+
export interface RemoteDeviceStore {
|
|
21
|
+
/** TRUST-ROOT write. ONLY remote-pairing.confirmPairing calls this, ONLY on desktop confirm. */
|
|
22
|
+
insert(input: PersistDeviceInput, now?: number): RemoteDeviceRecord;
|
|
23
|
+
/** Provider read path (returns key material). null if absent OR revoked. INTERNAL. */
|
|
24
|
+
getLiveSession(deviceId: string): DeviceSession | null;
|
|
25
|
+
/** Active (non-revoked) sessions only — backs DeviceSessionProvider.candidates(). */
|
|
26
|
+
liveSessions(): DeviceSession[];
|
|
27
|
+
/** Device-management read path — metadata ONLY, no keys. Newest first. */
|
|
28
|
+
list(includeRevoked?: boolean): RemoteDeviceRecord[];
|
|
29
|
+
get(deviceId: string): RemoteDeviceRecord | null;
|
|
30
|
+
/** Local half of the revocation closed loop. Idempotent; false if unknown / already revoked. */
|
|
31
|
+
revoke(deviceId: string, now?: number): boolean;
|
|
32
|
+
/** Best-effort last_active bump. Never resurrects a revoked row. */
|
|
33
|
+
touchActive(deviceId: string, now?: number): void;
|
|
34
|
+
}
|
|
35
|
+
export declare const createRemoteDeviceStore: (db: Database) => RemoteDeviceStore;
|
|
36
|
+
export declare const createPersistentDeviceSessionProvider: (store: RemoteDeviceStore) => DeviceSessionProvider;
|