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,14 @@
|
|
|
1
|
+
import type { AgentSummary, WorkerRole } from '../shared/types.js';
|
|
2
|
+
import type { WorkspaceRecord } from './workspace-store-contract.js';
|
|
3
|
+
type WorkspaceMap = Map<string, WorkspaceRecord>;
|
|
4
|
+
export declare const getAgentRecord: (workspaces: WorkspaceMap, workspaceId: string, agentId: string) => AgentSummary;
|
|
5
|
+
export declare const getWorkerRecord: (workspaces: WorkspaceMap, workspaceId: string, workerId: string) => AgentSummary & {
|
|
6
|
+
role: WorkerRole;
|
|
7
|
+
};
|
|
8
|
+
export declare const getWorkerByNameRecord: (workspaces: WorkspaceMap, workspaceId: string, workerName: string) => AgentSummary;
|
|
9
|
+
export declare const markAgentStarted: (workspaces: WorkspaceMap, workspaceId: string, agentId: string) => void;
|
|
10
|
+
export declare const markAgentStopped: (workspaces: WorkspaceMap, workspaceId: string, agentId: string) => void;
|
|
11
|
+
export declare const markTaskDispatched: (workspaces: WorkspaceMap, workspaceId: string, workerId: string) => void;
|
|
12
|
+
export declare const markTaskReported: (workspaces: WorkspaceMap, workspaceId: string, workerId: string) => void;
|
|
13
|
+
export declare const markTaskCancelled: (workspaces: WorkspaceMap, workspaceId: string, workerId: string) => void;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { getStatusFromPendingCount, isWorkerAgent } from './workspace-store-support.js';
|
|
2
|
+
const getWorkspaceRecord = (workspaces, workspaceId) => {
|
|
3
|
+
const workspace = workspaces.get(workspaceId);
|
|
4
|
+
if (!workspace)
|
|
5
|
+
throw new Error(`Workspace not found: ${workspaceId}`);
|
|
6
|
+
return workspace;
|
|
7
|
+
};
|
|
8
|
+
export const getAgentRecord = (workspaces, workspaceId, agentId) => {
|
|
9
|
+
const agent = getWorkspaceRecord(workspaces, workspaceId).agents.find((item) => item.id === agentId);
|
|
10
|
+
if (!agent)
|
|
11
|
+
throw new Error(`Agent not found: ${agentId}`);
|
|
12
|
+
return agent;
|
|
13
|
+
};
|
|
14
|
+
export const getWorkerRecord = (workspaces, workspaceId, workerId) => {
|
|
15
|
+
const worker = getAgentRecord(workspaces, workspaceId, workerId);
|
|
16
|
+
if (!isWorkerAgent(worker))
|
|
17
|
+
throw new Error(`Worker not found: ${workerId}`);
|
|
18
|
+
return worker;
|
|
19
|
+
};
|
|
20
|
+
export const getWorkerByNameRecord = (workspaces, workspaceId, workerName) => {
|
|
21
|
+
const worker = getWorkspaceRecord(workspaces, workspaceId).agents.find((item) => item.name === workerName && isWorkerAgent(item));
|
|
22
|
+
if (!worker)
|
|
23
|
+
throw new Error(`Worker not found: ${workerName}`);
|
|
24
|
+
return worker;
|
|
25
|
+
};
|
|
26
|
+
export const markAgentStarted = (workspaces, workspaceId, agentId) => {
|
|
27
|
+
const agent = getAgentRecord(workspaces, workspaceId, agentId);
|
|
28
|
+
agent.status = isWorkerAgent(agent) ? getStatusFromPendingCount(agent.pendingTaskCount) : 'idle';
|
|
29
|
+
};
|
|
30
|
+
export const markAgentStopped = (workspaces, workspaceId, agentId) => {
|
|
31
|
+
getAgentRecord(workspaces, workspaceId, agentId).status = 'stopped';
|
|
32
|
+
};
|
|
33
|
+
export const markTaskDispatched = (workspaces, workspaceId, workerId) => {
|
|
34
|
+
const worker = getWorkerRecord(workspaces, workspaceId, workerId);
|
|
35
|
+
worker.pendingTaskCount += 1;
|
|
36
|
+
// spec §3.6.4: a stopped worker may accumulate queued tasks; PTY isn't
|
|
37
|
+
// running so it can't be `working`. Stay stopped until restart (mirrors
|
|
38
|
+
// markTaskReported's stopped guard below).
|
|
39
|
+
if (worker.status !== 'stopped')
|
|
40
|
+
worker.status = getStatusFromPendingCount(worker.pendingTaskCount);
|
|
41
|
+
};
|
|
42
|
+
export const markTaskReported = (workspaces, workspaceId, workerId) => {
|
|
43
|
+
const worker = getWorkerRecord(workspaces, workspaceId, workerId);
|
|
44
|
+
worker.pendingTaskCount = Math.max(0, worker.pendingTaskCount - 1);
|
|
45
|
+
if (worker.status !== 'stopped')
|
|
46
|
+
worker.status = getStatusFromPendingCount(worker.pendingTaskCount);
|
|
47
|
+
};
|
|
48
|
+
export const markTaskCancelled = markTaskReported;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AgentStatus, AgentSummary, WorkerRole } from '../shared/types.js';
|
|
2
|
+
export interface MessageKindRecord {
|
|
3
|
+
type: 'send' | 'report';
|
|
4
|
+
worker_id: string;
|
|
5
|
+
workspace_id: string;
|
|
6
|
+
}
|
|
7
|
+
export interface WorkspaceRow {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
path: string;
|
|
11
|
+
}
|
|
12
|
+
export interface WorkerRow {
|
|
13
|
+
id: string;
|
|
14
|
+
workspace_id: string;
|
|
15
|
+
name: string;
|
|
16
|
+
description: string | null;
|
|
17
|
+
role: WorkerRole;
|
|
18
|
+
ephemeral: number;
|
|
19
|
+
spawned_by: string | null;
|
|
20
|
+
}
|
|
21
|
+
export interface WorkspaceSummaryRow extends WorkspaceRow {
|
|
22
|
+
}
|
|
23
|
+
export declare const getOrchestratorId: (workspaceId: string) => string;
|
|
24
|
+
export declare const createOrchestrator: (workspaceId: string) => AgentSummary;
|
|
25
|
+
export declare const getWorkflowAgentId: (workspaceId: string) => string;
|
|
26
|
+
export declare const createWorkflowAgent: (workspaceId: string) => AgentSummary;
|
|
27
|
+
export declare const isWorkerAgent: (agent: AgentSummary) => agent is AgentSummary & {
|
|
28
|
+
role: WorkerRole;
|
|
29
|
+
};
|
|
30
|
+
export declare const getStatusFromPendingCount: (pendingTaskCount: number) => AgentStatus;
|
|
31
|
+
export declare const applyPendingTaskCount: (worker: AgentSummary & {
|
|
32
|
+
role: WorkerRole;
|
|
33
|
+
}, type: MessageKindRecord["type"], preserveStoppedStatus: boolean) => void;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { getDefaultRoleDescription } from './role-templates.js';
|
|
2
|
+
export const getOrchestratorId = (workspaceId) => `${workspaceId}:orchestrator`;
|
|
3
|
+
export const createOrchestrator = (workspaceId) => ({
|
|
4
|
+
id: getOrchestratorId(workspaceId),
|
|
5
|
+
workspaceId,
|
|
6
|
+
name: 'Orchestrator',
|
|
7
|
+
description: getDefaultRoleDescription('orchestrator'),
|
|
8
|
+
role: 'orchestrator',
|
|
9
|
+
status: 'stopped',
|
|
10
|
+
pendingTaskCount: 0,
|
|
11
|
+
});
|
|
12
|
+
export const getWorkflowAgentId = (workspaceId) => `${workspaceId}:__workflow__`;
|
|
13
|
+
// In-memory pseudo-agent (no DB row, no PTY) that gives the deterministic
|
|
14
|
+
// workflow runner a dispatch identity — mirrors the orchestrator pseudo-agent.
|
|
15
|
+
export const createWorkflowAgent = (workspaceId) => ({
|
|
16
|
+
id: getWorkflowAgentId(workspaceId),
|
|
17
|
+
workspaceId,
|
|
18
|
+
name: 'Workflow',
|
|
19
|
+
description: 'Hive workflow runner — deterministic multi-agent orchestration driver.',
|
|
20
|
+
role: 'workflow',
|
|
21
|
+
status: 'stopped',
|
|
22
|
+
pendingTaskCount: 0,
|
|
23
|
+
});
|
|
24
|
+
export const isWorkerAgent = (agent) => {
|
|
25
|
+
return agent.role !== 'orchestrator' && agent.role !== 'workflow';
|
|
26
|
+
};
|
|
27
|
+
export const getStatusFromPendingCount = (pendingTaskCount) => {
|
|
28
|
+
return pendingTaskCount > 0 ? 'working' : 'idle';
|
|
29
|
+
};
|
|
30
|
+
export const applyPendingTaskCount = (worker, type, preserveStoppedStatus) => {
|
|
31
|
+
worker.pendingTaskCount =
|
|
32
|
+
type === 'send' ? worker.pendingTaskCount + 1 : Math.max(0, worker.pendingTaskCount - 1);
|
|
33
|
+
if (!preserveStoppedStatus) {
|
|
34
|
+
worker.status = getStatusFromPendingCount(worker.pendingTaskCount);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Database } from 'better-sqlite3';
|
|
2
|
+
import type { WorkerInput, WorkspaceRecord, WorkspaceStore } from './workspace-store-contract.js';
|
|
3
|
+
import { type MessageKindRecord } from './workspace-store-support.js';
|
|
4
|
+
export type { WorkerInput, WorkspaceRecord, WorkspaceStore };
|
|
5
|
+
export declare const createWorkspaceStore: (db: Database, messageKinds: MessageKindRecord[]) => WorkspaceStore;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { ConflictError } from './http-errors.js';
|
|
3
|
+
import { sameFilesystemPath } from './path-canonicalization.js';
|
|
4
|
+
import { getDefaultRoleDescription } from './role-templates.js';
|
|
5
|
+
import { hydrateWorkspaceFromDb, seedWorkspacesFromDb } from './workspace-store-hydration.js';
|
|
6
|
+
import { getAgentRecord, getWorkerByNameRecord, getWorkerRecord, markAgentStarted, markAgentStopped, markTaskCancelled, markTaskDispatched, markTaskReported, } from './workspace-store-mutations.js';
|
|
7
|
+
import { createOrchestrator, createWorkflowAgent, isWorkerAgent, } from './workspace-store-support.js';
|
|
8
|
+
const normalizeWorkerName = (name) => {
|
|
9
|
+
const trimmed = name.trim();
|
|
10
|
+
if (!trimmed)
|
|
11
|
+
throw new Error('Worker name must not be empty');
|
|
12
|
+
if (trimmed.length > 64)
|
|
13
|
+
throw new Error('Worker name must be 64 characters or fewer');
|
|
14
|
+
return trimmed;
|
|
15
|
+
};
|
|
16
|
+
export const createWorkspaceStore = (db, messageKinds) => {
|
|
17
|
+
const workspaces = new Map();
|
|
18
|
+
seedWorkspacesFromDb(db, workspaces, messageKinds);
|
|
19
|
+
const getWorkspace = (workspaceId) => {
|
|
20
|
+
hydrateWorkspaceFromDb(db, workspaces, messageKinds, workspaceId);
|
|
21
|
+
const workspace = workspaces.get(workspaceId);
|
|
22
|
+
if (!workspace)
|
|
23
|
+
throw new Error(`Workspace not found: ${workspaceId}`);
|
|
24
|
+
return workspace;
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
addWorker(workspaceId, input) {
|
|
28
|
+
const workspace = getWorkspace(workspaceId);
|
|
29
|
+
const name = normalizeWorkerName(input.name);
|
|
30
|
+
if (workspace.agents.some((agent) => agent.name === name && isWorkerAgent(agent))) {
|
|
31
|
+
throw new ConflictError(`Worker name already exists: ${name}`);
|
|
32
|
+
}
|
|
33
|
+
const worker = {
|
|
34
|
+
id: randomUUID(),
|
|
35
|
+
workspaceId,
|
|
36
|
+
name,
|
|
37
|
+
description: input.description ?? getDefaultRoleDescription(input.role),
|
|
38
|
+
role: input.role,
|
|
39
|
+
status: 'stopped',
|
|
40
|
+
pendingTaskCount: 0,
|
|
41
|
+
ephemeral: input.ephemeral ?? false,
|
|
42
|
+
spawnedBy: input.spawnedBy ?? null,
|
|
43
|
+
};
|
|
44
|
+
db.prepare('INSERT INTO workers (id, workspace_id, name, description, role, ephemeral, spawned_by, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)').run(worker.id, workspaceId, worker.name, worker.description, worker.role, worker.ephemeral ? 1 : 0, worker.spawnedBy, Date.now());
|
|
45
|
+
workspace.agents.push(worker);
|
|
46
|
+
return worker;
|
|
47
|
+
},
|
|
48
|
+
createWorkspace(path, name) {
|
|
49
|
+
const existing = Array.from(workspaces.values()).find((workspace) => sameFilesystemPath(workspace.summary.path, path));
|
|
50
|
+
if (existing)
|
|
51
|
+
throw new ConflictError(`Workspace path already exists: ${path}`);
|
|
52
|
+
const summary = { id: randomUUID(), name, path };
|
|
53
|
+
db.prepare('INSERT INTO workspaces (id, name, path, created_at) VALUES (?, ?, ?, ?)').run(summary.id, name, path, Date.now());
|
|
54
|
+
workspaces.set(summary.id, {
|
|
55
|
+
summary,
|
|
56
|
+
agents: [createOrchestrator(summary.id), createWorkflowAgent(summary.id)],
|
|
57
|
+
});
|
|
58
|
+
return summary;
|
|
59
|
+
},
|
|
60
|
+
deleteWorkspace(workspaceId) {
|
|
61
|
+
const workspace = getWorkspace(workspaceId);
|
|
62
|
+
const agentIds = workspace.agents.map((agent) => agent.id);
|
|
63
|
+
db.transaction(() => {
|
|
64
|
+
db.prepare('DELETE FROM messages WHERE workspace_id = ?').run(workspaceId);
|
|
65
|
+
db.prepare('DELETE FROM agent_launch_configs WHERE workspace_id = ?').run(workspaceId);
|
|
66
|
+
db.prepare('DELETE FROM agent_sessions WHERE workspace_id = ?').run(workspaceId);
|
|
67
|
+
const deleteAgentRuns = db.prepare('DELETE FROM agent_runs WHERE agent_id = ?');
|
|
68
|
+
for (const agentId of agentIds)
|
|
69
|
+
deleteAgentRuns.run(agentId);
|
|
70
|
+
db.prepare('DELETE FROM workers WHERE workspace_id = ?').run(workspaceId);
|
|
71
|
+
// TIER 1 #4 — cascade workflow tables. Without this, the scheduler's
|
|
72
|
+
// listDueSchedules keeps firing schedules for the dead workspace
|
|
73
|
+
// every minute (the startWorkflow then crashes in
|
|
74
|
+
// getWorkflowAgentId / addWorkerWithLaunch and `nextRunAt` is
|
|
75
|
+
// rewritten to fire again next tick — a permanent error-spam
|
|
76
|
+
// loop). Orphan workflow_runs / dispatches would otherwise also
|
|
77
|
+
// accumulate forever. The dispatches DELETE in particular hits the
|
|
78
|
+
// workflow-tagged subset; non-workflow dispatches were already
|
|
79
|
+
// cleared via the deleteWorker cascade above.
|
|
80
|
+
db.prepare('DELETE FROM workflow_schedules WHERE workspace_id = ?').run(workspaceId);
|
|
81
|
+
// TIER 2 #3 — also wipe the log table; FK is on run_id, so we
|
|
82
|
+
// have to clear it BEFORE deleting workflow_runs (the lookup
|
|
83
|
+
// would otherwise miss the rows we're about to delete).
|
|
84
|
+
db.prepare(`DELETE FROM workflow_run_logs
|
|
85
|
+
WHERE run_id IN (SELECT id FROM workflow_runs WHERE workspace_id = ?)`).run(workspaceId);
|
|
86
|
+
db.prepare('DELETE FROM workflow_runs WHERE workspace_id = ?').run(workspaceId);
|
|
87
|
+
db.prepare('DELETE FROM dispatches WHERE workspace_id = ?').run(workspaceId);
|
|
88
|
+
db.prepare('DELETE FROM workspaces WHERE id = ?').run(workspaceId);
|
|
89
|
+
})();
|
|
90
|
+
workspaces.delete(workspaceId);
|
|
91
|
+
},
|
|
92
|
+
renameWorker(workspaceId, workerId, name) {
|
|
93
|
+
const worker = getWorkerRecord(workspaces, workspaceId, workerId);
|
|
94
|
+
const trimmed = normalizeWorkerName(name);
|
|
95
|
+
if (trimmed === worker.name)
|
|
96
|
+
return worker;
|
|
97
|
+
const workspace = getWorkspace(workspaceId);
|
|
98
|
+
if (workspace.agents.some((agent) => agent.id !== workerId && agent.name === trimmed && isWorkerAgent(agent))) {
|
|
99
|
+
throw new ConflictError(`Worker name already exists: ${trimmed}`);
|
|
100
|
+
}
|
|
101
|
+
db.prepare('UPDATE workers SET name = ? WHERE workspace_id = ? AND id = ?').run(trimmed, workspaceId, workerId);
|
|
102
|
+
worker.name = trimmed;
|
|
103
|
+
return worker;
|
|
104
|
+
},
|
|
105
|
+
deleteWorker(workspaceId, workerId) {
|
|
106
|
+
const workspace = getWorkspace(workspaceId);
|
|
107
|
+
getWorkerRecord(workspaces, workspaceId, workerId);
|
|
108
|
+
db.transaction(() => {
|
|
109
|
+
db.prepare('DELETE FROM messages WHERE workspace_id = ? AND worker_id = ?').run(workspaceId, workerId);
|
|
110
|
+
db.prepare('DELETE FROM agent_launch_configs WHERE workspace_id = ? AND agent_id = ?').run(workspaceId, workerId);
|
|
111
|
+
db.prepare('DELETE FROM agent_sessions WHERE workspace_id = ? AND agent_id = ?').run(workspaceId, workerId);
|
|
112
|
+
db.prepare('DELETE FROM agent_runs WHERE agent_id = ?').run(workerId);
|
|
113
|
+
db.prepare('DELETE FROM workers WHERE workspace_id = ? AND id = ?').run(workspaceId, workerId);
|
|
114
|
+
})();
|
|
115
|
+
workspace.agents = workspace.agents.filter((agent) => agent.id !== workerId);
|
|
116
|
+
},
|
|
117
|
+
getAgent: (workspaceId, agentId) => getAgentRecord(workspaces, workspaceId, agentId),
|
|
118
|
+
getWorker: (workspaceId, workerId) => getWorkerRecord(workspaces, workspaceId, workerId),
|
|
119
|
+
getWorkerByName: (workspaceId, workerName) => getWorkerByNameRecord(workspaces, workspaceId, workerName),
|
|
120
|
+
getWorkspaceSnapshot: getWorkspace,
|
|
121
|
+
hasAgent(workspaceId, agentId) {
|
|
122
|
+
hydrateWorkspaceFromDb(db, workspaces, messageKinds, workspaceId);
|
|
123
|
+
return workspaces.get(workspaceId)?.agents.some((agent) => agent.id === agentId) ?? false;
|
|
124
|
+
},
|
|
125
|
+
listWorkers(workspaceId) {
|
|
126
|
+
return getWorkspace(workspaceId)
|
|
127
|
+
.agents.filter(isWorkerAgent)
|
|
128
|
+
.map(({ id, name, role, status, pendingTaskCount, ephemeral, spawnedBy }) => ({
|
|
129
|
+
id,
|
|
130
|
+
name,
|
|
131
|
+
role,
|
|
132
|
+
status,
|
|
133
|
+
pendingTaskCount,
|
|
134
|
+
// Carry the lifecycle marker through to the team panel so workflow-
|
|
135
|
+
// spawned ephemeral workers can be visually distinguished from the
|
|
136
|
+
// user's persistent team (M10).
|
|
137
|
+
...(ephemeral === true ? { ephemeral: true } : {}),
|
|
138
|
+
...(spawnedBy ? { spawnedBy } : {}),
|
|
139
|
+
}));
|
|
140
|
+
},
|
|
141
|
+
listWorkspaces() {
|
|
142
|
+
return Array.from(workspaces.values(), (workspace) => workspace.summary);
|
|
143
|
+
},
|
|
144
|
+
hasWorkspace(workspaceId) {
|
|
145
|
+
return workspaces.has(workspaceId);
|
|
146
|
+
},
|
|
147
|
+
markAgentStarted: (workspaceId, agentId) => markAgentStarted(workspaces, workspaceId, agentId),
|
|
148
|
+
markAgentStopped: (workspaceId, agentId) => markAgentStopped(workspaces, workspaceId, agentId),
|
|
149
|
+
markTaskDispatched: (workspaceId, workerId) => markTaskDispatched(workspaces, workspaceId, workerId),
|
|
150
|
+
markTaskCancelled: (workspaceId, workerId) => markTaskCancelled(workspaces, workspaceId, workerId),
|
|
151
|
+
markTaskReported: (workspaceId, workerId) => markTaskReported(workspaces, workspaceId, workerId),
|
|
152
|
+
};
|
|
153
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const WINDOWS_DRIVES_ROOT = "hive://windows-drives";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const WINDOWS_DRIVES_ROOT = 'hive://windows-drives';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-cutting types for the "Open workspace in editor/app" feature.
|
|
3
|
+
* Both the server (command construction in `src/server/open-target-commands.ts`)
|
|
4
|
+
* and the web client (button + preference store in `web/src/workspace/open-targets.ts`)
|
|
5
|
+
* pull the union and platform whitelist from here so they cannot drift.
|
|
6
|
+
*/
|
|
7
|
+
export type OpenTargetId = 'vscode' | 'vscode-insiders' | 'cursor' | 'finder' | 'terminal' | 'ghostty' | 'zed';
|
|
8
|
+
export type OpenTargetPlatform = 'mac' | 'windows' | 'linux' | 'other';
|
|
9
|
+
export declare const OPEN_TARGET_IDS_BY_PLATFORM: Record<OpenTargetPlatform, readonly OpenTargetId[]>;
|
|
10
|
+
export declare const isOpenTargetId: (value: unknown) => value is OpenTargetId;
|
|
11
|
+
export declare const isOpenTargetSupported: (targetId: OpenTargetId, platform: OpenTargetPlatform) => boolean;
|
|
12
|
+
/**
|
|
13
|
+
* The id the server will actually attempt to launch. If the user's saved
|
|
14
|
+
* preference is unsupported on the current platform (e.g. they picked iTerm2
|
|
15
|
+
* on a Mac, then opened Hive on Windows), fall back to the platform default
|
|
16
|
+
* rather than erroring out — a stale preference shouldn't break the button.
|
|
17
|
+
*/
|
|
18
|
+
export declare const getEffectiveOpenTargetId: (targetId: OpenTargetId, platform: OpenTargetPlatform) => OpenTargetId;
|
|
19
|
+
export declare const getDefaultOpenTargetIdForPlatform: (platform: OpenTargetPlatform) => OpenTargetId;
|
|
20
|
+
export type OpenWorkspaceErrorCode = 'invalid-path' | 'invalid-target' | 'app-not-installed' | 'command-not-in-path' | 'unknown';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-cutting types for the "Open workspace in editor/app" feature.
|
|
3
|
+
* Both the server (command construction in `src/server/open-target-commands.ts`)
|
|
4
|
+
* and the web client (button + preference store in `web/src/workspace/open-targets.ts`)
|
|
5
|
+
* pull the union and platform whitelist from here so they cannot drift.
|
|
6
|
+
*/
|
|
7
|
+
// Note: there is no `cursor-insiders` here. Cursor stopped shipping a separate
|
|
8
|
+
// Nightly bundle / `cursor-nightly` binary in March 2024; the pre-release
|
|
9
|
+
// channel is now an in-app toggle on the regular Cursor.app.
|
|
10
|
+
//
|
|
11
|
+
// IntelliJ IDEA, Windsurf, and iTerm2 were intentionally dropped after 1.3.0:
|
|
12
|
+
// IntelliJ users typically launch from JetBrains Toolbox rather than a folder
|
|
13
|
+
// picker; Windsurf overlaps with Cursor/VS Code; iTerm2 overlaps with the
|
|
14
|
+
// built-in macOS Terminal entry.
|
|
15
|
+
export const OPEN_TARGET_IDS_BY_PLATFORM = {
|
|
16
|
+
mac: ['vscode', 'vscode-insiders', 'cursor', 'finder', 'terminal', 'ghostty', 'zed'],
|
|
17
|
+
windows: ['vscode', 'vscode-insiders', 'cursor', 'finder', 'zed'],
|
|
18
|
+
linux: ['vscode', 'vscode-insiders', 'cursor', 'finder', 'zed'],
|
|
19
|
+
other: ['vscode', 'vscode-insiders', 'finder'],
|
|
20
|
+
};
|
|
21
|
+
const ALL_TARGET_IDS = new Set(OPEN_TARGET_IDS_BY_PLATFORM.mac);
|
|
22
|
+
export const isOpenTargetId = (value) => typeof value === 'string' && ALL_TARGET_IDS.has(value);
|
|
23
|
+
export const isOpenTargetSupported = (targetId, platform) => OPEN_TARGET_IDS_BY_PLATFORM[platform].includes(targetId);
|
|
24
|
+
/**
|
|
25
|
+
* The id the server will actually attempt to launch. If the user's saved
|
|
26
|
+
* preference is unsupported on the current platform (e.g. they picked iTerm2
|
|
27
|
+
* on a Mac, then opened Hive on Windows), fall back to the platform default
|
|
28
|
+
* rather than erroring out — a stale preference shouldn't break the button.
|
|
29
|
+
*/
|
|
30
|
+
export const getEffectiveOpenTargetId = (targetId, platform) => isOpenTargetSupported(targetId, platform) ? targetId : getDefaultOpenTargetIdForPlatform(platform);
|
|
31
|
+
export const getDefaultOpenTargetIdForPlatform = (platform) => {
|
|
32
|
+
// `finder` exists for every platform and never fails closed.
|
|
33
|
+
if (platform === 'mac' || platform === 'windows' || platform === 'linux')
|
|
34
|
+
return 'finder';
|
|
35
|
+
return 'vscode';
|
|
36
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize a path pasted into a workspace input. Windows Explorer's
|
|
3
|
+
* "Copy as path" wraps the value in double quotes (e.g. `"C:\\Users\\me"`);
|
|
4
|
+
* shell-style paste from a terminal sometimes uses single quotes. Resolving
|
|
5
|
+
* the quoted form with `realpathSync` fails even though the unquoted path is
|
|
6
|
+
* valid.
|
|
7
|
+
*
|
|
8
|
+
* The heuristic is intentionally conservative: only a symmetric outer pair
|
|
9
|
+
* of identical quote characters is removed. Asymmetric or interior quotes
|
|
10
|
+
* survive so legitimately quote-containing paths still reach the server.
|
|
11
|
+
*/
|
|
12
|
+
export declare const sanitizePastedPath: (raw: string) => string;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize a path pasted into a workspace input. Windows Explorer's
|
|
3
|
+
* "Copy as path" wraps the value in double quotes (e.g. `"C:\\Users\\me"`);
|
|
4
|
+
* shell-style paste from a terminal sometimes uses single quotes. Resolving
|
|
5
|
+
* the quoted form with `realpathSync` fails even though the unquoted path is
|
|
6
|
+
* valid.
|
|
7
|
+
*
|
|
8
|
+
* The heuristic is intentionally conservative: only a symmetric outer pair
|
|
9
|
+
* of identical quote characters is removed. Asymmetric or interior quotes
|
|
10
|
+
* survive so legitimately quote-containing paths still reach the server.
|
|
11
|
+
*/
|
|
12
|
+
export const sanitizePastedPath = (raw) => {
|
|
13
|
+
const trimmed = raw.trim();
|
|
14
|
+
if (trimmed.length < 2)
|
|
15
|
+
return trimmed;
|
|
16
|
+
const first = trimmed[0];
|
|
17
|
+
const last = trimmed[trimmed.length - 1];
|
|
18
|
+
if ((first === '"' || first === "'") && first === last) {
|
|
19
|
+
return trimmed.slice(1, -1);
|
|
20
|
+
}
|
|
21
|
+
return trimmed;
|
|
22
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type StreamMeta } from './remote-protocol.js';
|
|
2
|
+
export declare const ALLOWED_HTTP_PREFIX: "/api/";
|
|
3
|
+
export type BridgeRejectReason = 'path_not_whitelisted' | 'path_not_canonical' | 'path_denied' | 'bad_method' | 'malformed_meta';
|
|
4
|
+
export type RouteDecision = {
|
|
5
|
+
ok: true;
|
|
6
|
+
transport: 'http';
|
|
7
|
+
method: string;
|
|
8
|
+
path: string;
|
|
9
|
+
} | {
|
|
10
|
+
ok: true;
|
|
11
|
+
transport: 'ws';
|
|
12
|
+
path: string;
|
|
13
|
+
query?: [string, string][];
|
|
14
|
+
} | {
|
|
15
|
+
ok: false;
|
|
16
|
+
reason: BridgeRejectReason;
|
|
17
|
+
};
|
|
18
|
+
export declare function isCanonicalPath(path: string): boolean;
|
|
19
|
+
export declare function classifyOpen(meta: StreamMeta): RouteDecision;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// The loopback bridge whitelist — the "not a general localhost proxy" gate.
|
|
2
|
+
//
|
|
3
|
+
// Runs in BOTH node and browser (pure, no I/O): the daemon runs it on the
|
|
4
|
+
// OPENED Open-frame StreamMeta, AFTER the frame authenticates (M1 openNext) and
|
|
5
|
+
// BEFORE any loopback socket exists. A { ok: false } decision => the tunnel
|
|
6
|
+
// sends Reset(StreamRefused) + emits a `reject` audit row, and NEVER makes a
|
|
7
|
+
// loopback request. Removing or weakening any check here turns the tunnel into
|
|
8
|
+
// an arbitrary localhost proxy — that is exactly what these checks forbid.
|
|
9
|
+
//
|
|
10
|
+
// Invariant 1 (binding): the bridge forwards ONLY /api/* and /ws/* (terminal +
|
|
11
|
+
// tasks). Everything else — traversal, encoded tricks, absolute URLs, the UI
|
|
12
|
+
// session cookie route — is refused here.
|
|
13
|
+
import { StreamTransport } from './remote-protocol.js';
|
|
14
|
+
export const ALLOWED_HTTP_PREFIX = '/api/';
|
|
15
|
+
// Exact terminal io/control + tasks ws paths — mirrors terminal-ws-server's
|
|
16
|
+
// matchTerminalPath regex and the /ws/tasks/<id> match in that file. Path-only:
|
|
17
|
+
// the WS query (clientId/cols/rows) rides separate StreamMeta fields, never the
|
|
18
|
+
// path, so we gate the bare path and reject any query smuggled into it.
|
|
19
|
+
const WS_TERMINAL_RE = /^\/ws\/terminal\/[^/]+\/(?:io|control)$/;
|
|
20
|
+
const WS_TASKS_RE = /^\/ws\/tasks\/[^/]+$/;
|
|
21
|
+
const ALLOWED_METHODS = new Set(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']);
|
|
22
|
+
// HARDEN: /api/ui/session is UNAUTHENTICATED and unconditionally responds with
|
|
23
|
+
// Set-Cookie: hive_ui_token=<the master UI token>. The tunnel is authorized by
|
|
24
|
+
// the per-boot secret, so the phone has zero need for the UI cookie. Forwarding
|
|
25
|
+
// it would let a paired phone harvest the single credential that authenticates
|
|
26
|
+
// every /api/* route + WS upgrade. Hard-deny by exact pathname (case-folded),
|
|
27
|
+
// before prefix matching can let it through. This is layer (1) of the fix; the
|
|
28
|
+
// bridge's response-header sanitizer (remote-loopback-auth) is layer (2), and
|
|
29
|
+
// routes-ui refusing tunnel-tagged requests is layer (3).
|
|
30
|
+
const DENIED_HTTP_PATHS = new Set(['/api/ui/session']);
|
|
31
|
+
// HARDEN (trust-root defense-in-depth): the device-pairing TRUST-ROOT actions — begin a pairing,
|
|
32
|
+
// confirm/approve a device, reject a pending one — are desktop-only at the route layer
|
|
33
|
+
// (routes-remote.gateLocalDesktopOnly). The Authority Model says a phone can NEVER self-approve a
|
|
34
|
+
// new device, so we mirror /api/ui/session's layered defense: layer 1 hard-denies these here on the
|
|
35
|
+
// bridge (a forwarded frame is Reset(StreamRefused) + audited path_denied), layer 3 is the route gate.
|
|
36
|
+
// `/api/remote/pairings` (begin, POST) collides with the collection path, and confirm/reject carry a
|
|
37
|
+
// :pairingId segment, so we deny by matcher rather than an exact-set entry. A phone still uses the
|
|
38
|
+
// EQUAL-AUTHORITY remote routes (list devices, revoke, status, audit) — only the trust root is denied.
|
|
39
|
+
const isDeniedPairingPath = (pathname) => {
|
|
40
|
+
if (pathname === '/api/remote/pairings')
|
|
41
|
+
return true; // begin a pairing (POST)
|
|
42
|
+
// confirm/reject under /api/remote/pairings/:id — match the action suffix on a pairings path.
|
|
43
|
+
return (pathname.startsWith('/api/remote/pairings/') &&
|
|
44
|
+
(pathname.endsWith('/confirm') || pathname.endsWith('/reject')));
|
|
45
|
+
};
|
|
46
|
+
// Canonicalization gate for the path SHAPE (no query handling — that is the
|
|
47
|
+
// caller's policy). Reject anything non-canonical so an encoded or traversal
|
|
48
|
+
// path can never reach a route that later decodes it.
|
|
49
|
+
//
|
|
50
|
+
// A query string is allowed structurally (it is not traversal); whether a query
|
|
51
|
+
// is *permitted* on a given transport is decided in classifyOpen.
|
|
52
|
+
export function isCanonicalPath(path) {
|
|
53
|
+
if (typeof path !== 'string' || path.length === 0)
|
|
54
|
+
return false;
|
|
55
|
+
if (path[0] !== '/')
|
|
56
|
+
return false; // no absolute URLs, no authority-relative
|
|
57
|
+
if (path.includes('\0') || path.includes('\\'))
|
|
58
|
+
return false;
|
|
59
|
+
if (/%2e|%2f/i.test(path))
|
|
60
|
+
return false; // encoded . or / — refuse outright
|
|
61
|
+
if (path.includes('..'))
|
|
62
|
+
return false; // any traversal segment
|
|
63
|
+
if (path.startsWith('//'))
|
|
64
|
+
return false; // protocol-relative / authority
|
|
65
|
+
// URL parse must round-trip the pathname (ignoring any query) unchanged and
|
|
66
|
+
// not surface an injected host.
|
|
67
|
+
let u;
|
|
68
|
+
try {
|
|
69
|
+
u = new URL(path, 'http://x');
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
if (u.host !== 'x')
|
|
75
|
+
return false;
|
|
76
|
+
// pathname + search must reconstruct the input byte-for-byte: this rejects a
|
|
77
|
+
// space or any char the URL parser would normalize/strip, while still
|
|
78
|
+
// permitting a legitimate ?query.
|
|
79
|
+
return u.pathname + u.search === path;
|
|
80
|
+
}
|
|
81
|
+
// True if s contains any C0 control char (charCode 0..31). Used to keep a WS query pair from
|
|
82
|
+
// smuggling a NUL/CR/LF past the loopback-URL reattach.
|
|
83
|
+
function hasControlChar(s) {
|
|
84
|
+
for (let i = 0; i < s.length; i++) {
|
|
85
|
+
if (s.charCodeAt(i) <= 0x1f)
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
export function classifyOpen(meta) {
|
|
91
|
+
if (meta.transport === StreamTransport.Http) {
|
|
92
|
+
const m = meta.http;
|
|
93
|
+
if (!m)
|
|
94
|
+
return { ok: false, reason: 'malformed_meta' };
|
|
95
|
+
if (!isCanonicalPath(m.path))
|
|
96
|
+
return { ok: false, reason: 'path_not_canonical' };
|
|
97
|
+
// Split off the query: the prefix/deny checks run on the pathname only, so a
|
|
98
|
+
// query string can neither bypass the deny set nor break a legit /api route.
|
|
99
|
+
const queryStart = m.path.indexOf('?');
|
|
100
|
+
const pathname = queryStart === -1 ? m.path : m.path.slice(0, queryStart);
|
|
101
|
+
const lowered = pathname.toLowerCase();
|
|
102
|
+
if (DENIED_HTTP_PATHS.has(lowered) || isDeniedPairingPath(lowered)) {
|
|
103
|
+
return { ok: false, reason: 'path_denied' };
|
|
104
|
+
}
|
|
105
|
+
if (!pathname.startsWith(ALLOWED_HTTP_PREFIX)) {
|
|
106
|
+
return { ok: false, reason: 'path_not_whitelisted' };
|
|
107
|
+
}
|
|
108
|
+
if (!ALLOWED_METHODS.has(m.method))
|
|
109
|
+
return { ok: false, reason: 'bad_method' };
|
|
110
|
+
return { ok: true, transport: 'http', method: m.method, path: m.path };
|
|
111
|
+
}
|
|
112
|
+
if (meta.transport === StreamTransport.Ws) {
|
|
113
|
+
const w = meta.ws;
|
|
114
|
+
if (!w)
|
|
115
|
+
return { ok: false, reason: 'malformed_meta' };
|
|
116
|
+
if (!isCanonicalPath(w.path))
|
|
117
|
+
return { ok: false, reason: 'path_not_canonical' };
|
|
118
|
+
// WS path is path-only — a query here is non-canonical (it must ride the
|
|
119
|
+
// separate `query` meta field, reattached on the loopback URL).
|
|
120
|
+
if (w.path.includes('?'))
|
|
121
|
+
return { ok: false, reason: 'path_not_canonical' };
|
|
122
|
+
if (!WS_TERMINAL_RE.test(w.path) && !WS_TASKS_RE.test(w.path)) {
|
|
123
|
+
return { ok: false, reason: 'path_not_whitelisted' };
|
|
124
|
+
}
|
|
125
|
+
// The WS query rides separate [name,value] pairs. Reject any pair whose key/value carries a
|
|
126
|
+
// control char that could break out of the query when we URL-encode it back (defense in depth —
|
|
127
|
+
// even though we encodeURIComponent on reattach, a NUL/control char has no business in
|
|
128
|
+
// clientId/cols/rows). An empty key is also nonsense.
|
|
129
|
+
if (w.query !== undefined) {
|
|
130
|
+
for (const [k, v] of w.query) {
|
|
131
|
+
if (k.length === 0 || hasControlChar(k) || hasControlChar(v)) {
|
|
132
|
+
return { ok: false, reason: 'malformed_meta' };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return w.query !== undefined
|
|
137
|
+
? { ok: true, transport: 'ws', path: w.path, query: w.query }
|
|
138
|
+
: { ok: true, transport: 'ws', path: w.path };
|
|
139
|
+
}
|
|
140
|
+
return { ok: false, reason: 'malformed_meta' };
|
|
141
|
+
}
|