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,113 @@
|
|
|
1
|
+
import type WebSocket from 'ws';
|
|
2
|
+
import type { RemoteAuditStore } from './remote-audit-store.js';
|
|
3
|
+
import type { RemoteConfigSource } from './remote-config-keys.js';
|
|
4
|
+
import type { DeviceSessionProvider } from './remote-device-session.js';
|
|
5
|
+
import type { RemoteDeviceRecord } from './remote-device-store.js';
|
|
6
|
+
import { type FrameBridgeContext } from './remote-frame-bridge.js';
|
|
7
|
+
import type { RemotePairing } from './remote-pairing.js';
|
|
8
|
+
import { type RemotePairingTunnel, type RemotePairingTunnelDeps } from './remote-pairing-tunnel.js';
|
|
9
|
+
export type { FrameBridge as RemoteFrameBridge, FrameBridgeContext, LoopbackTransports, } from './remote-frame-bridge.js';
|
|
10
|
+
export { createFrameBridge } from './remote-frame-bridge.js';
|
|
11
|
+
export type TunnelStatus = 'disabled' | 'loggedOut' | 'connecting' | 'online' | 'reconnecting' | 'revoked';
|
|
12
|
+
export interface TunnelStatusEvent {
|
|
13
|
+
status: TunnelStatus;
|
|
14
|
+
reason?: string;
|
|
15
|
+
/** Monotonic; the UI ignores out-of-order late events from a stale generation. */
|
|
16
|
+
generation: number;
|
|
17
|
+
/** Present in 'reconnecting'. */
|
|
18
|
+
nextRetryInMs?: number;
|
|
19
|
+
/** 'online' only. */
|
|
20
|
+
gatewayUrl?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface BackoffPolicy {
|
|
23
|
+
next(): number;
|
|
24
|
+
reset(): void;
|
|
25
|
+
}
|
|
26
|
+
export interface FrameBridge {
|
|
27
|
+
/** Wire the per-device opener/sealer + the outbound sink onto a freshly-opened socket. */
|
|
28
|
+
attachSocket(send: (frame: Uint8Array) => void): void;
|
|
29
|
+
/** An opaque binary frame arrived from the gateway. */
|
|
30
|
+
onInbound(frame: ArrayBuffer): void;
|
|
31
|
+
/**
|
|
32
|
+
* Tear down every in-flight stream. Socket-teardown paths (socket down / revoke / shutdown) call
|
|
33
|
+
* it without opts so the outbound sink is nulled too. The 'peer-offline' path passes
|
|
34
|
+
* `{ keepSink: true }`: the daemon socket stays up, so the streams are reset but the sink must
|
|
35
|
+
* survive for the phone to re-establish streams after 'peer-online'.
|
|
36
|
+
*/
|
|
37
|
+
resetAllStreams(reason: string, opts?: {
|
|
38
|
+
keepSink?: boolean;
|
|
39
|
+
}): void;
|
|
40
|
+
/** Close one device's in-flight streams (M4 revoke closed loop). Other devices + the sink survive. */
|
|
41
|
+
closeDevice(deviceId: string, reason: string): void;
|
|
42
|
+
}
|
|
43
|
+
export interface RemoteTunnelDeps {
|
|
44
|
+
/** Bound loopback port (passed post-listen). The bridge bridges to 127.0.0.1:<port>. */
|
|
45
|
+
loopbackPort: number;
|
|
46
|
+
config: RemoteConfigSource;
|
|
47
|
+
deviceSessions: DeviceSessionProvider;
|
|
48
|
+
/** Per-boot internal secret (store.getRemoteTunnelSecret()); stamped onto loopback requests. */
|
|
49
|
+
loopbackSecret: string;
|
|
50
|
+
audit: RemoteAuditStore;
|
|
51
|
+
onStatus: (e: TunnelStatusEvent) => void;
|
|
52
|
+
/**
|
|
53
|
+
* The daemon pairing engine. The tunnel carries pairing TEXT frames (phone↔daemon over the relay)
|
|
54
|
+
* alongside the binary data plane and drives the daemon handshake half + the desktop-confirm
|
|
55
|
+
* sequence through the pairing-tunnel driver. Optional so lifecycle/bridge tests that don't pair
|
|
56
|
+
* can omit it (pairing frames are then ignored).
|
|
57
|
+
*/
|
|
58
|
+
pairing?: RemotePairing;
|
|
59
|
+
WebSocketImpl?: typeof WebSocket;
|
|
60
|
+
now?: () => number;
|
|
61
|
+
setTimer?: (fn: () => void, ms: number) => NodeJS.Timeout;
|
|
62
|
+
clearTimer?: (h: NodeJS.Timeout) => void;
|
|
63
|
+
backoff?: BackoffPolicy;
|
|
64
|
+
heartbeatIntervalMs?: number;
|
|
65
|
+
heartbeatDeadlineMs?: number;
|
|
66
|
+
/** Build the per-socket bridge. Defaults to a no-op (lifecycle-only); the bridge stage wires E2E. */
|
|
67
|
+
createBridge?: (ctx: BridgeContext) => FrameBridge;
|
|
68
|
+
/** Build the pairing-tunnel driver. Defaults to the real createRemotePairingTunnel; tests inject. */
|
|
69
|
+
createPairingTunnel?: (deps: RemotePairingTunnelDeps) => RemotePairingTunnel;
|
|
70
|
+
/** D5 seam: POST /pair/confirm. Defaults to the real gateway client. */
|
|
71
|
+
postPairConfirm?: RemotePairingTunnelDeps['postPairConfirm'];
|
|
72
|
+
}
|
|
73
|
+
export interface BridgeContext {
|
|
74
|
+
loopbackPort: number;
|
|
75
|
+
loopbackSecret: string;
|
|
76
|
+
deviceSessions: DeviceSessionProvider;
|
|
77
|
+
audit: RemoteAuditStore;
|
|
78
|
+
/**
|
|
79
|
+
* The daemon's own id (M6.1). Bound into the per-connection HKDF info, so it MUST equal the value
|
|
80
|
+
* the phone stored in its HandshakeIds.daemonId — a mismatch diverges the info strings and EVERY
|
|
81
|
+
* Hello fails to open. Sourced from config.getDaemonId() at socket-open time (guarded non-null).
|
|
82
|
+
*/
|
|
83
|
+
daemonId: string;
|
|
84
|
+
/** Seam: deterministic-but-distinct daemon salts for tests. Defaults to the crypto export. */
|
|
85
|
+
generateConnSalt?: () => Uint8Array;
|
|
86
|
+
/** Observation hook for the no-reuse / no-downgrade invariant (NOT a mock). */
|
|
87
|
+
onSeal?: FrameBridgeContext['onSeal'];
|
|
88
|
+
}
|
|
89
|
+
export interface RemoteTunnel {
|
|
90
|
+
status(): TunnelStatus;
|
|
91
|
+
/** Reconcile desired (config) vs actual (socket). Idempotent; clears the revoked latch. */
|
|
92
|
+
refresh(): void;
|
|
93
|
+
/** Authoritative kill: latch revoked, drop everything, no reconnect until refresh(). */
|
|
94
|
+
revokeAndStop(reason: string): void;
|
|
95
|
+
/**
|
|
96
|
+
* Close ONE device's live streams (M4 revoke closed loop). No-op-safe when no bridge is attached
|
|
97
|
+
* (disabled/offline) — the persistent provider's revoke still rejects any NEW frame, so this is the
|
|
98
|
+
* best-effort liveness half that tears down an already-open stream the instant the device is revoked.
|
|
99
|
+
*/
|
|
100
|
+
closeDevice(deviceId: string, reason: string): void;
|
|
101
|
+
/**
|
|
102
|
+
* Desktop-confirm a pairing (the trust-root route delegates here, plan step 4 / D3): insert the
|
|
103
|
+
* local device row (engine), POST /pair/confirm to the gateway, then send `confirmed` to the phone
|
|
104
|
+
* over the tunnel. Returns the local device record (null if the engine wouldn't confirm). Rejects
|
|
105
|
+
* if the gateway POST fails or the boundJti is missing — the route surfaces it and the phone is NOT
|
|
106
|
+
* told confirmed. No-op-safe (returns null) when the tunnel was built without a pairing engine.
|
|
107
|
+
*/
|
|
108
|
+
confirmPairing(pairingId: string, name?: string): Promise<RemoteDeviceRecord | null>;
|
|
109
|
+
/** Graceful teardown (Ctrl+C). No status churn, no reconnect. */
|
|
110
|
+
close(): Promise<void>;
|
|
111
|
+
}
|
|
112
|
+
export declare const relayDaemonUrl: (gatewayUrl: string) => string;
|
|
113
|
+
export declare const createRemoteTunnel: (deps: RemoteTunnelDeps) => RemoteTunnel;
|
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
// Daemon-side remote tunnel — the OUTBOUND WebSocket controller.
|
|
2
|
+
//
|
|
3
|
+
// When remote access is ENABLED and the daemon is logged in, the runtime keeps a single outbound
|
|
4
|
+
// socket to the gateway relay (`wss://<gatewayUrl>/relay/daemon`, presenting `bearer.<daemonToken>`
|
|
5
|
+
// in Sec-WebSocket-Protocol — the exact M2 contract in gateway/src/relay-do.ts). After the 101 the
|
|
6
|
+
// socket carries:
|
|
7
|
+
// - opaque binary E2E frames (phone↔daemon, M1 crypto) — handed verbatim to the bridge
|
|
8
|
+
// - a thin string control band (sentinel-prefixed JSON) the gateway originates (peer presence,
|
|
9
|
+
// revocation) plus the 'hb:ping'/'hb:pong' keepalive
|
|
10
|
+
//
|
|
11
|
+
// THIS FILE owns the SOCKET LIFECYCLE: connect, exponential-backoff reconnect, heartbeat, status
|
|
12
|
+
// reporting, revoke latch, clean shutdown, and a generation guard so a zombie socket can never write
|
|
13
|
+
// onto a fresh one. The frame BRIDGE (E2E open/seal, mux demux, loopback request/ws) is a separate
|
|
14
|
+
// concern injected via `createBridge`; the controller only moves opaque bytes between the socket and
|
|
15
|
+
// `bridge.onInbound` / the outbound sink the bridge gets from `attachSocket`.
|
|
16
|
+
//
|
|
17
|
+
// SECURITY INVARIANTS enforced here:
|
|
18
|
+
// 3. Revocation: a gateway `revoked` control frame, a 4401/4410 close, or local revokeAndStop()
|
|
19
|
+
// tears the socket + all bridge streams down immediately and LATCHES — no reconnect until
|
|
20
|
+
// refresh() re-reads config.
|
|
21
|
+
// 4. Off = zero behavior change: refresh() with remote_enabled !== 'true' settles 'disabled'
|
|
22
|
+
// SYNCHRONOUSLY — WebSocketImpl is never invoked, no timer is scheduled, no listener is added.
|
|
23
|
+
import { WebSocket as NodeWebSocket } from 'ws';
|
|
24
|
+
import { GW_CONTROL_PREFIX, HB_PING, HB_PONG, isAuthFatalCloseCode, } from './remote-control-constants.js';
|
|
25
|
+
import { createFrameBridge } from './remote-frame-bridge.js';
|
|
26
|
+
import { postPairConfirm } from './remote-gateway-client.js';
|
|
27
|
+
import { createRemotePairingTunnel, } from './remote-pairing-tunnel.js';
|
|
28
|
+
// Re-export so the bridge stage's consumers (and tests) can import the E2E/mux bridge from the
|
|
29
|
+
// tunnel module — it is the bridge the controller pumps opaque bytes through.
|
|
30
|
+
export { createFrameBridge } from './remote-frame-bridge.js';
|
|
31
|
+
const DEFAULT_HB_INTERVAL_MS = 20_000;
|
|
32
|
+
const DEFAULT_HB_DEADLINE_MS = 10_000;
|
|
33
|
+
const CLOSE_GRACE_MS = 1_000;
|
|
34
|
+
const createDefaultBackoff = () => {
|
|
35
|
+
const base = 500;
|
|
36
|
+
const factor = 2;
|
|
37
|
+
const cap = 30_000;
|
|
38
|
+
let attempt = 0;
|
|
39
|
+
return {
|
|
40
|
+
next() {
|
|
41
|
+
const exp = Math.min(cap, base * factor ** attempt);
|
|
42
|
+
attempt += 1;
|
|
43
|
+
// full jitter: a random point in [0, exp]
|
|
44
|
+
return Math.floor(Math.random() * exp);
|
|
45
|
+
},
|
|
46
|
+
reset() {
|
|
47
|
+
attempt = 0;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
// Build the gateway relay URL. wss:// in prod; ws:// is allowed ONLY for a loopback host so the
|
|
52
|
+
// in-process fake-gateway fixture works without weakening production (a non-loopback ws:// is a
|
|
53
|
+
// downgrade and is rejected).
|
|
54
|
+
export const relayDaemonUrl = (gatewayUrl) => {
|
|
55
|
+
const u = new URL(gatewayUrl);
|
|
56
|
+
if (u.protocol === 'https:')
|
|
57
|
+
u.protocol = 'wss:';
|
|
58
|
+
else if (u.protocol === 'http:')
|
|
59
|
+
u.protocol = 'ws:';
|
|
60
|
+
if (u.protocol !== 'wss:' && u.protocol !== 'ws:') {
|
|
61
|
+
throw new Error(`unsupported gateway protocol: ${u.protocol}`);
|
|
62
|
+
}
|
|
63
|
+
// Numeric loopback literals ONLY — never the 'localhost' hostname. On Windows 'localhost' resolves
|
|
64
|
+
// via the resolver / hosts file (commonly ::1 first, or remapped on locked-down machines), so an
|
|
65
|
+
// insecure ws:// downgrade keyed on a hostname is not a guaranteed loopback. The IP literal is.
|
|
66
|
+
// URL.hostname keeps the brackets on an IPv6 literal ('[::1]'), so match that form too.
|
|
67
|
+
const isLoopback = u.hostname === '127.0.0.1' || u.hostname === '::1' || u.hostname === '[::1]';
|
|
68
|
+
if (u.protocol === 'ws:' && !isLoopback) {
|
|
69
|
+
throw new Error('insecure ws:// gateway is only allowed for a numeric loopback host');
|
|
70
|
+
}
|
|
71
|
+
// join, tolerating a trailing slash on the configured base
|
|
72
|
+
const base = u.toString().replace(/\/+$/, '');
|
|
73
|
+
return `${base}/relay/daemon`;
|
|
74
|
+
};
|
|
75
|
+
const toArrayBuffer = (data) => {
|
|
76
|
+
if (data instanceof ArrayBuffer)
|
|
77
|
+
return data;
|
|
78
|
+
const buf = Array.isArray(data) ? Buffer.concat(data) : data;
|
|
79
|
+
// Copy into a freshly-owned ArrayBuffer: buf.buffer may be a pooled/SharedArrayBuffer and the
|
|
80
|
+
// bridge keeps the bytes past this call, so a view-slice would risk aliasing the next frame.
|
|
81
|
+
const out = new ArrayBuffer(buf.byteLength);
|
|
82
|
+
new Uint8Array(out).set(buf);
|
|
83
|
+
return out;
|
|
84
|
+
};
|
|
85
|
+
export const createRemoteTunnel = (deps) => {
|
|
86
|
+
const WebSocketImpl = deps.WebSocketImpl ?? NodeWebSocket;
|
|
87
|
+
const setTimer = deps.setTimer ?? ((fn, ms) => setTimeout(fn, ms));
|
|
88
|
+
const clearTimer = deps.clearTimer ?? ((h) => clearTimeout(h));
|
|
89
|
+
const backoff = deps.backoff ?? createDefaultBackoff();
|
|
90
|
+
const hbInterval = deps.heartbeatIntervalMs ?? DEFAULT_HB_INTERVAL_MS;
|
|
91
|
+
const hbDeadline = deps.heartbeatDeadlineMs ?? DEFAULT_HB_DEADLINE_MS;
|
|
92
|
+
// Default to the real E2E/mux bridge; lifecycle tests inject a no-op/observing bridge to isolate
|
|
93
|
+
// the socket FSM. The controller only pumps opaque bytes either way. The FrameBridgeContext is built
|
|
94
|
+
// explicitly (only attaching the optional seams when present) so exactOptionalPropertyTypes stays
|
|
95
|
+
// happy — BridgeContext is the controller's view; createFrameBridge wants the full bridge context.
|
|
96
|
+
const createBridge = deps.createBridge ??
|
|
97
|
+
((ctx) => {
|
|
98
|
+
const fctx = {
|
|
99
|
+
loopbackPort: ctx.loopbackPort,
|
|
100
|
+
loopbackSecret: ctx.loopbackSecret,
|
|
101
|
+
deviceSessions: ctx.deviceSessions,
|
|
102
|
+
audit: ctx.audit,
|
|
103
|
+
daemonId: ctx.daemonId,
|
|
104
|
+
};
|
|
105
|
+
if (ctx.generateConnSalt)
|
|
106
|
+
fctx.generateConnSalt = ctx.generateConnSalt;
|
|
107
|
+
if (ctx.onSeal)
|
|
108
|
+
fctx.onSeal = ctx.onSeal;
|
|
109
|
+
return createFrameBridge(fctx);
|
|
110
|
+
});
|
|
111
|
+
let generation = 0;
|
|
112
|
+
let reported = 'disabled';
|
|
113
|
+
let revokedLatch = false;
|
|
114
|
+
let closing = false;
|
|
115
|
+
let socket = null;
|
|
116
|
+
let bridge = null;
|
|
117
|
+
// Pairing-over-tunnel driver (plan steps 2+4). Built ONCE and lives across socket generations: its
|
|
118
|
+
// active-pairing/boundJti state must survive a reconnect mid-pairing. `send` targets the CURRENT
|
|
119
|
+
// socket (via the `socket` closure) — the relay fans daemon→ text frames to the phone's pair socket.
|
|
120
|
+
// A tunnel built without a pairing engine has no driver; pairing text frames are then ignored.
|
|
121
|
+
const createPairingTunnel = deps.createPairingTunnel ?? createRemotePairingTunnel;
|
|
122
|
+
const pairingDriver = deps.pairing
|
|
123
|
+
? createPairingTunnel({
|
|
124
|
+
pairing: deps.pairing,
|
|
125
|
+
send: (frame) => {
|
|
126
|
+
try {
|
|
127
|
+
socket?.send(JSON.stringify(frame));
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// socket dying; the phone re-scans on failure (pairing is in-memory, no half-state to fix)
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
postPairConfirm: deps.postPairConfirm ?? postPairConfirm,
|
|
134
|
+
getGatewayUrl: deps.config.getGatewayUrl,
|
|
135
|
+
getDaemonToken: deps.config.getDaemonToken,
|
|
136
|
+
})
|
|
137
|
+
: null;
|
|
138
|
+
let reconnectTimer = null;
|
|
139
|
+
let hbIntervalTimer = null;
|
|
140
|
+
let hbDeadlineTimer = null;
|
|
141
|
+
const emit = (status, gen, extra = {}) => {
|
|
142
|
+
reported = status;
|
|
143
|
+
const event = { status, generation: gen };
|
|
144
|
+
if (extra.reason !== undefined)
|
|
145
|
+
event.reason = extra.reason;
|
|
146
|
+
if (extra.nextRetryInMs !== undefined)
|
|
147
|
+
event.nextRetryInMs = extra.nextRetryInMs;
|
|
148
|
+
if (extra.gatewayUrl !== undefined)
|
|
149
|
+
event.gatewayUrl = extra.gatewayUrl;
|
|
150
|
+
deps.onStatus(event);
|
|
151
|
+
};
|
|
152
|
+
// Late handlers from a superseded socket must no-op. Each handler captures its generation; if a
|
|
153
|
+
// newer (re)connect has bumped `generation`, the stale callback is dropped — this is what stops a
|
|
154
|
+
// zombie socket's late message/close from writing onto a fresh socket.
|
|
155
|
+
const guard = (gen, fn) => {
|
|
156
|
+
if (gen !== generation)
|
|
157
|
+
return;
|
|
158
|
+
fn();
|
|
159
|
+
};
|
|
160
|
+
const clearReconnect = () => {
|
|
161
|
+
if (reconnectTimer !== null) {
|
|
162
|
+
clearTimer(reconnectTimer);
|
|
163
|
+
reconnectTimer = null;
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
const stopHeartbeat = () => {
|
|
167
|
+
if (hbIntervalTimer !== null) {
|
|
168
|
+
clearTimer(hbIntervalTimer);
|
|
169
|
+
hbIntervalTimer = null;
|
|
170
|
+
}
|
|
171
|
+
if (hbDeadlineTimer !== null) {
|
|
172
|
+
clearTimer(hbDeadlineTimer);
|
|
173
|
+
hbDeadlineTimer = null;
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
const detachSocket = () => {
|
|
177
|
+
if (socket) {
|
|
178
|
+
// Drop our handlers so a teardown can't re-enter through a late event.
|
|
179
|
+
socket.removeAllListeners();
|
|
180
|
+
socket = null;
|
|
181
|
+
}
|
|
182
|
+
bridge = null;
|
|
183
|
+
};
|
|
184
|
+
const absorbIntentionalShutdownError = (s) => {
|
|
185
|
+
// `ws.close()`/`terminate()` aborts a CONNECTING handshake by emitting `error` asynchronously.
|
|
186
|
+
// After intentional teardown we have removed the lifecycle handlers, so keep one local sink for
|
|
187
|
+
// that expected shutdown event instead of letting Node treat it as unhandled.
|
|
188
|
+
s.once('error', () => { });
|
|
189
|
+
};
|
|
190
|
+
const wantConnected = () => deps.config.isEnabled() && deps.config.getDaemonToken() != null;
|
|
191
|
+
const armHeartbeat = (gen) => {
|
|
192
|
+
stopHeartbeat();
|
|
193
|
+
hbIntervalTimer = setTimer(function tick() {
|
|
194
|
+
guard(gen, () => {
|
|
195
|
+
const s = socket;
|
|
196
|
+
if (!s)
|
|
197
|
+
return;
|
|
198
|
+
try {
|
|
199
|
+
s.send(HB_PING);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
// socket already dying; the close handler will drive recovery
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
// Arm a deadline tracking the OLDEST unanswered ping. A pong (the DO's auto-response) clears
|
|
206
|
+
// it; the next pong-cleared interval re-arms a fresh one. We do NOT reset the deadline on each
|
|
207
|
+
// ping — otherwise an interval shorter than the deadline would mask a dead socket forever (a
|
|
208
|
+
// new ping would keep pushing the deadline out even with zero pongs coming back).
|
|
209
|
+
if (hbDeadlineTimer === null) {
|
|
210
|
+
hbDeadlineTimer = setTimer(() => {
|
|
211
|
+
hbDeadlineTimer = null;
|
|
212
|
+
guard(gen, () => onSocketDown(1006, 'heartbeat timeout'));
|
|
213
|
+
}, hbDeadline);
|
|
214
|
+
}
|
|
215
|
+
// re-arm the next ping
|
|
216
|
+
hbIntervalTimer = setTimer(tick, hbInterval);
|
|
217
|
+
});
|
|
218
|
+
}, hbInterval);
|
|
219
|
+
};
|
|
220
|
+
const onHeartbeatPong = () => {
|
|
221
|
+
if (hbDeadlineTimer !== null) {
|
|
222
|
+
clearTimer(hbDeadlineTimer);
|
|
223
|
+
hbDeadlineTimer = null;
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
const onControl = (raw) => {
|
|
227
|
+
let c;
|
|
228
|
+
try {
|
|
229
|
+
c = JSON.parse(raw.slice(GW_CONTROL_PREFIX.length));
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
switch (c.t) {
|
|
235
|
+
case 'revoked':
|
|
236
|
+
revokeAndStop(c.reason);
|
|
237
|
+
break;
|
|
238
|
+
case 'peer-offline':
|
|
239
|
+
// A pair peer-offline (the unpaired phone's /relay/pair socket closing — normal at the end of
|
|
240
|
+
// every pairing, on replace, or when the phone navigates away) is a CONTROL-PLANE event and must
|
|
241
|
+
// NOT touch the DATA tunnel — otherwise a pairing-socket churn would reset an already-paired
|
|
242
|
+
// phone's in-flight streams (the relay-do invariant: ignore role:'pair' for stream-reset). Only a
|
|
243
|
+
// device/daemon peer-offline resets streams: that DATA phone went away; reset the in-flight
|
|
244
|
+
// streams but KEEP the live socket + outbound sink so it can re-establish on 'peer-online'
|
|
245
|
+
// (nulling the sink would silently swallow every later response).
|
|
246
|
+
if (c.role !== 'pair')
|
|
247
|
+
bridge?.resetAllStreams('peer offline', { keepSink: true });
|
|
248
|
+
break;
|
|
249
|
+
case 'peer-online':
|
|
250
|
+
// A pair peer-online (an unpaired phone attached to relay /relay/pair for this daemon) carries
|
|
251
|
+
// the pairing session's jti (D2). Hand it to the pairing driver as the active boundJti; a NEW
|
|
252
|
+
// peer-online also resets the driver's active pairing (D1 replace race). daemon/device
|
|
253
|
+
// peer-online stay informational (the data plane needs no presence action here).
|
|
254
|
+
if (c.role === 'pair')
|
|
255
|
+
pairingDriver?.onPeerOnline(c.jti);
|
|
256
|
+
break;
|
|
257
|
+
case 'error':
|
|
258
|
+
onSocketDown(c.code, c.message);
|
|
259
|
+
break;
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
const onMessage = (data, isBinary) => {
|
|
263
|
+
if (!isBinary) {
|
|
264
|
+
const s = data.toString();
|
|
265
|
+
if (s === HB_PONG) {
|
|
266
|
+
onHeartbeatPong();
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
if (s.startsWith(GW_CONTROL_PREFIX)) {
|
|
270
|
+
onControl(s);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
// Pairing TEXT frames (phone↔daemon over the relay, plan step 2). They are NOT the binary data
|
|
274
|
+
// plane and NOT the gateway control band — the relay forwards them opaque from the pair socket.
|
|
275
|
+
// Route to the pairing driver; a non-pairing / junk string is ignored there (and below).
|
|
276
|
+
if (pairingDriver) {
|
|
277
|
+
pairingDriver.onPairingFrame(s);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
// unknown string: ignore (the relay never sends non-sentinel strings)
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
bridge?.onInbound(toArrayBuffer(data));
|
|
284
|
+
};
|
|
285
|
+
const onSocketDown = (code, reason) => {
|
|
286
|
+
stopHeartbeat();
|
|
287
|
+
bridge?.resetAllStreams(reason);
|
|
288
|
+
deps.audit.enqueue({ action: 'session_close', result: 'ok', rejectReason: reason });
|
|
289
|
+
const s = socket;
|
|
290
|
+
detachSocket();
|
|
291
|
+
if (s) {
|
|
292
|
+
absorbIntentionalShutdownError(s);
|
|
293
|
+
try {
|
|
294
|
+
s.terminate();
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// already gone
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
// Invalidate the generation so any further late event from this socket no-ops.
|
|
301
|
+
generation += 1;
|
|
302
|
+
if (closing)
|
|
303
|
+
return;
|
|
304
|
+
if (isAuthFatalCloseCode(code)) {
|
|
305
|
+
revokedLatch = true;
|
|
306
|
+
emit('revoked', generation, { reason });
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
if (!wantConnected()) {
|
|
310
|
+
emit(deps.config.isEnabled() ? 'loggedOut' : 'disabled', generation, { reason });
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
const delay = backoff.next();
|
|
314
|
+
emit('reconnecting', generation, { reason, nextRetryInMs: delay });
|
|
315
|
+
clearReconnect();
|
|
316
|
+
reconnectTimer = setTimer(() => {
|
|
317
|
+
reconnectTimer = null;
|
|
318
|
+
openSocket();
|
|
319
|
+
}, delay);
|
|
320
|
+
};
|
|
321
|
+
const openSocket = () => {
|
|
322
|
+
if (closing || revokedLatch)
|
|
323
|
+
return;
|
|
324
|
+
const gen = ++generation;
|
|
325
|
+
if (!deps.config.isEnabled()) {
|
|
326
|
+
emit('disabled', gen);
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
const gatewayUrl = deps.config.getGatewayUrl();
|
|
330
|
+
const token = deps.config.getDaemonToken();
|
|
331
|
+
if (!gatewayUrl || !token) {
|
|
332
|
+
emit('loggedOut', gen);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
let url;
|
|
336
|
+
try {
|
|
337
|
+
url = relayDaemonUrl(gatewayUrl);
|
|
338
|
+
}
|
|
339
|
+
catch (err) {
|
|
340
|
+
emit('reconnecting', gen, {
|
|
341
|
+
reason: err instanceof Error ? err.message : 'bad gateway url',
|
|
342
|
+
});
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
emit('connecting', gen);
|
|
346
|
+
let s;
|
|
347
|
+
try {
|
|
348
|
+
s = new WebSocketImpl(url, [`bearer.${token}`]);
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
// Construction itself failed (e.g. malformed url) — treat as a transient drop.
|
|
352
|
+
onSocketDown(1006, 'socket construction failed');
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
socket = s;
|
|
356
|
+
s.binaryType = 'arraybuffer';
|
|
357
|
+
s.on('open', () => guard(gen, () => {
|
|
358
|
+
// M6.1: the daemon id is bound into the per-connection HKDF info; it MUST match what the phone
|
|
359
|
+
// stored at pairing. Source it from config (the same value written to StoredDeviceSession),
|
|
360
|
+
// NOT from a non-existent deps.daemonId field. Guard null — the tunnel can't be online without
|
|
361
|
+
// a daemon id, but if it ever were, the bridge has no valid id to bind and we must not connect.
|
|
362
|
+
const daemonId = deps.config.getDaemonId();
|
|
363
|
+
if (!daemonId) {
|
|
364
|
+
onSocketDown(1006, 'missing daemon id');
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
const ctx = {
|
|
368
|
+
loopbackPort: deps.loopbackPort,
|
|
369
|
+
loopbackSecret: deps.loopbackSecret,
|
|
370
|
+
deviceSessions: deps.deviceSessions,
|
|
371
|
+
audit: deps.audit,
|
|
372
|
+
daemonId,
|
|
373
|
+
};
|
|
374
|
+
bridge = createBridge(ctx);
|
|
375
|
+
bridge.attachSocket((frame) => {
|
|
376
|
+
try {
|
|
377
|
+
s.send(frame);
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
// socket dying; close handler recovers
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
backoff.reset();
|
|
384
|
+
armHeartbeat(gen);
|
|
385
|
+
deps.audit.enqueue({ action: 'session_open', result: 'ok' });
|
|
386
|
+
emit('online', gen, { gatewayUrl });
|
|
387
|
+
}));
|
|
388
|
+
s.on('message', (data, isBinary) => guard(gen, () => onMessage(data, isBinary)));
|
|
389
|
+
s.on('close', (code, reasonBuf) => guard(gen, () => onSocketDown(code, reasonBuf.toString() || 'closed')));
|
|
390
|
+
s.on('error', () => guard(gen, () => onSocketDown(1006, 'socket error')));
|
|
391
|
+
// ws emits 'unexpected-response' for a non-101 upgrade (e.g. the gateway Worker's HTTP 401 when
|
|
392
|
+
// the token isn't live yet). This is TRANSIENT — back off and retry. The AUTHORITATIVE credential
|
|
393
|
+
// death is the post-handshake signal: a 4401/4410 close code or a `revoked` control frame. So a
|
|
394
|
+
// handshake rejection must NOT latch revoked (that would strand the daemon on a token that's
|
|
395
|
+
// merely mid-rotation); it falls through to onSocketDown's backoff path with 1006.
|
|
396
|
+
s.on('unexpected-response', (_req, res) => guard(gen, () => onSocketDown(1006, `unexpected response ${res.statusCode ?? '?'}`)));
|
|
397
|
+
};
|
|
398
|
+
const teardownSocket = (code, reason) => {
|
|
399
|
+
stopHeartbeat();
|
|
400
|
+
clearReconnect();
|
|
401
|
+
bridge?.resetAllStreams(reason);
|
|
402
|
+
const s = socket;
|
|
403
|
+
detachSocket();
|
|
404
|
+
if (s) {
|
|
405
|
+
absorbIntentionalShutdownError(s);
|
|
406
|
+
try {
|
|
407
|
+
s.close(code, reason);
|
|
408
|
+
}
|
|
409
|
+
catch {
|
|
410
|
+
try {
|
|
411
|
+
s.terminate();
|
|
412
|
+
}
|
|
413
|
+
catch {
|
|
414
|
+
// gone
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
function revokeAndStop(reason) {
|
|
420
|
+
if (revokedLatch && socket === null) {
|
|
421
|
+
// already revoked
|
|
422
|
+
revokedLatch = true;
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
revokedLatch = true;
|
|
426
|
+
teardownSocket(1000, reason);
|
|
427
|
+
generation += 1;
|
|
428
|
+
deps.audit.enqueue({
|
|
429
|
+
action: 'session_close',
|
|
430
|
+
result: 'rejected',
|
|
431
|
+
rejectReason: 'revoked',
|
|
432
|
+
});
|
|
433
|
+
emit('revoked', generation, { reason });
|
|
434
|
+
}
|
|
435
|
+
const refresh = () => {
|
|
436
|
+
if (closing)
|
|
437
|
+
return;
|
|
438
|
+
revokedLatch = false;
|
|
439
|
+
clearReconnect();
|
|
440
|
+
if (!deps.config.isEnabled()) {
|
|
441
|
+
if (socket)
|
|
442
|
+
teardownSocket(1000, 'disabled');
|
|
443
|
+
generation += 1;
|
|
444
|
+
emit('disabled', generation);
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
if (deps.config.getDaemonToken() == null) {
|
|
448
|
+
if (socket)
|
|
449
|
+
teardownSocket(1000, 'logged out');
|
|
450
|
+
generation += 1;
|
|
451
|
+
emit('loggedOut', generation);
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
// Desired = connected. If we already have a live socket, leave it; otherwise (re)open.
|
|
455
|
+
if (socket && (reported === 'online' || reported === 'connecting'))
|
|
456
|
+
return;
|
|
457
|
+
openSocket();
|
|
458
|
+
};
|
|
459
|
+
const close = async () => {
|
|
460
|
+
closing = true;
|
|
461
|
+
clearReconnect();
|
|
462
|
+
stopHeartbeat();
|
|
463
|
+
const s = socket;
|
|
464
|
+
bridge?.resetAllStreams('shutdown');
|
|
465
|
+
detachSocket();
|
|
466
|
+
generation += 1;
|
|
467
|
+
if (!s)
|
|
468
|
+
return;
|
|
469
|
+
absorbIntentionalShutdownError(s);
|
|
470
|
+
await new Promise((resolve) => {
|
|
471
|
+
let settled = false;
|
|
472
|
+
const done = () => {
|
|
473
|
+
if (settled)
|
|
474
|
+
return;
|
|
475
|
+
settled = true;
|
|
476
|
+
resolve();
|
|
477
|
+
};
|
|
478
|
+
const grace = setTimer(() => {
|
|
479
|
+
try {
|
|
480
|
+
s.terminate();
|
|
481
|
+
}
|
|
482
|
+
catch {
|
|
483
|
+
// gone
|
|
484
|
+
}
|
|
485
|
+
done();
|
|
486
|
+
}, CLOSE_GRACE_MS);
|
|
487
|
+
s.once('close', () => {
|
|
488
|
+
clearTimer(grace);
|
|
489
|
+
done();
|
|
490
|
+
});
|
|
491
|
+
try {
|
|
492
|
+
s.close(1000, 'shutdown');
|
|
493
|
+
}
|
|
494
|
+
catch {
|
|
495
|
+
clearTimer(grace);
|
|
496
|
+
try {
|
|
497
|
+
s.terminate();
|
|
498
|
+
}
|
|
499
|
+
catch {
|
|
500
|
+
// gone
|
|
501
|
+
}
|
|
502
|
+
done();
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
};
|
|
506
|
+
return {
|
|
507
|
+
status: () => reported,
|
|
508
|
+
refresh,
|
|
509
|
+
revokeAndStop,
|
|
510
|
+
closeDevice: (deviceId, reason) => bridge?.closeDevice(deviceId, reason),
|
|
511
|
+
confirmPairing: async (pairingId, name) => (await pairingDriver?.confirm(pairingId, name)) ?? null,
|
|
512
|
+
close,
|
|
513
|
+
};
|
|
514
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Database } from 'better-sqlite3';
|
|
2
|
+
/**
|
|
3
|
+
* Durable redelivery queue for worker reports the orchestrator could not
|
|
4
|
+
* receive. `team report` persists the dispatch as reported and forwards the
|
|
5
|
+
* report into the orchestrator's stdin best-effort; if that write fails (the
|
|
6
|
+
* PTY exited / is mid-restart, or the orchestrator was down at report time)
|
|
7
|
+
* the report would otherwise be lost — the ledger says "reported" yet the
|
|
8
|
+
* orchestrator waits forever, indistinguishable from a hang.
|
|
9
|
+
*
|
|
10
|
+
* Entries are keyed by dispatch id (UNIQUE) so a report enqueues at most once,
|
|
11
|
+
* and drain marks them delivered only after the orchestrator PTY write
|
|
12
|
+
* actually resolves, so a failed redelivery stays pending for the next drain.
|
|
13
|
+
*/
|
|
14
|
+
export interface ReportOutboxEntry {
|
|
15
|
+
id: number;
|
|
16
|
+
workspaceId: string;
|
|
17
|
+
targetAgentId: string;
|
|
18
|
+
dispatchId: string;
|
|
19
|
+
payload: string;
|
|
20
|
+
createdAt: number;
|
|
21
|
+
deliveredAt: number | null;
|
|
22
|
+
}
|
|
23
|
+
interface EnqueueInput {
|
|
24
|
+
workspaceId: string;
|
|
25
|
+
targetAgentId: string;
|
|
26
|
+
dispatchId: string;
|
|
27
|
+
payload: string;
|
|
28
|
+
}
|
|
29
|
+
export declare const createReportOutboxStore: (db: Database) => {
|
|
30
|
+
enqueue: (input: EnqueueInput) => void;
|
|
31
|
+
listPending: (workspaceId: string, targetAgentId: string) => ReportOutboxEntry[];
|
|
32
|
+
markDelivered: (id: number) => void;
|
|
33
|
+
pendingCount: (workspaceId: string, targetAgentId: string) => number;
|
|
34
|
+
};
|
|
35
|
+
export type ReportOutboxStore = ReturnType<typeof createReportOutboxStore>;
|
|
36
|
+
export {};
|