@tt-a1i/hive 0.6.0-alpha.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 +12 -0
- package/LICENSE +202 -0
- package/README.md +175 -0
- package/SECURITY.md +48 -0
- package/dist/bin/team +7 -0
- package/dist/bin/team.cmd +2 -0
- package/dist/src/cli/hive.d.ts +9 -0
- package/dist/src/cli/hive.js +104 -0
- package/dist/src/cli/hive.js.map +1 -0
- package/dist/src/cli/team.d.ts +1 -0
- package/dist/src/cli/team.js +137 -0
- package/dist/src/cli/team.js.map +1 -0
- package/dist/src/server/agent-command-resolver.d.ts +8 -0
- package/dist/src/server/agent-command-resolver.js +72 -0
- package/dist/src/server/agent-command-resolver.js.map +1 -0
- package/dist/src/server/agent-launch-cache.d.ts +20 -0
- package/dist/src/server/agent-launch-cache.js +55 -0
- package/dist/src/server/agent-launch-cache.js.map +1 -0
- package/dist/src/server/agent-manager-support.d.ts +7 -0
- package/dist/src/server/agent-manager-support.js +68 -0
- package/dist/src/server/agent-manager-support.js.map +1 -0
- package/dist/src/server/agent-manager.d.ts +51 -0
- package/dist/src/server/agent-manager.js +92 -0
- package/dist/src/server/agent-manager.js.map +1 -0
- package/dist/src/server/agent-run-bootstrap.d.ts +62 -0
- package/dist/src/server/agent-run-bootstrap.js +64 -0
- package/dist/src/server/agent-run-bootstrap.js.map +1 -0
- package/dist/src/server/agent-run-exit-handler.d.ts +8 -0
- package/dist/src/server/agent-run-exit-handler.js +27 -0
- package/dist/src/server/agent-run-exit-handler.js.map +1 -0
- package/dist/src/server/agent-run-start-context.d.ts +24 -0
- package/dist/src/server/agent-run-start-context.js +2 -0
- package/dist/src/server/agent-run-start-context.js.map +1 -0
- package/dist/src/server/agent-run-starter.d.ts +23 -0
- package/dist/src/server/agent-run-starter.js +117 -0
- package/dist/src/server/agent-run-starter.js.map +1 -0
- package/dist/src/server/agent-run-store.d.ts +47 -0
- package/dist/src/server/agent-run-store.js +131 -0
- package/dist/src/server/agent-run-store.js.map +1 -0
- package/dist/src/server/agent-run-sync.d.ts +10 -0
- package/dist/src/server/agent-run-sync.js +25 -0
- package/dist/src/server/agent-run-sync.js.map +1 -0
- package/dist/src/server/agent-runtime-active-run.d.ts +3 -0
- package/dist/src/server/agent-runtime-active-run.js +11 -0
- package/dist/src/server/agent-runtime-active-run.js.map +1 -0
- package/dist/src/server/agent-runtime-close.d.ts +4 -0
- package/dist/src/server/agent-runtime-close.js +15 -0
- package/dist/src/server/agent-runtime-close.js.map +1 -0
- package/dist/src/server/agent-runtime-contract.d.ts +31 -0
- package/dist/src/server/agent-runtime-contract.js +2 -0
- package/dist/src/server/agent-runtime-contract.js.map +1 -0
- package/dist/src/server/agent-runtime-flow-adapter.d.ts +10 -0
- package/dist/src/server/agent-runtime-flow-adapter.js +15 -0
- package/dist/src/server/agent-runtime-flow-adapter.js.map +1 -0
- package/dist/src/server/agent-runtime-list-runs.d.ts +3 -0
- package/dist/src/server/agent-runtime-list-runs.js +19 -0
- package/dist/src/server/agent-runtime-list-runs.js.map +1 -0
- package/dist/src/server/agent-runtime-ports.d.ts +22 -0
- package/dist/src/server/agent-runtime-ports.js +2 -0
- package/dist/src/server/agent-runtime-ports.js.map +1 -0
- package/dist/src/server/agent-runtime-stop-run.d.ts +4 -0
- package/dist/src/server/agent-runtime-stop-run.js +17 -0
- package/dist/src/server/agent-runtime-stop-run.js.map +1 -0
- package/dist/src/server/agent-runtime-types.d.ts +4 -0
- package/dist/src/server/agent-runtime-types.js +2 -0
- package/dist/src/server/agent-runtime-types.js.map +1 -0
- package/dist/src/server/agent-runtime.d.ts +8 -0
- package/dist/src/server/agent-runtime.js +101 -0
- package/dist/src/server/agent-runtime.js.map +1 -0
- package/dist/src/server/agent-session-store.d.ts +7 -0
- package/dist/src/server/agent-session-store.js +52 -0
- package/dist/src/server/agent-session-store.js.map +1 -0
- package/dist/src/server/agent-startup-instructions.d.ts +13 -0
- package/dist/src/server/agent-startup-instructions.js +26 -0
- package/dist/src/server/agent-startup-instructions.js.map +1 -0
- package/dist/src/server/agent-stdin-dispatcher.d.ts +19 -0
- package/dist/src/server/agent-stdin-dispatcher.js +60 -0
- package/dist/src/server/agent-stdin-dispatcher.js.map +1 -0
- package/dist/src/server/agent-tokens.d.ts +15 -0
- package/dist/src/server/agent-tokens.js +26 -0
- package/dist/src/server/agent-tokens.js.map +1 -0
- package/dist/src/server/app-state-store.d.ts +10 -0
- package/dist/src/server/app-state-store.js +15 -0
- package/dist/src/server/app-state-store.js.map +1 -0
- package/dist/src/server/app.d.ts +14 -0
- package/dist/src/server/app.js +118 -0
- package/dist/src/server/app.js.map +1 -0
- package/dist/src/server/claude-command-defaults.d.ts +1 -0
- package/dist/src/server/claude-command-defaults.js +6 -0
- package/dist/src/server/claude-command-defaults.js.map +1 -0
- package/dist/src/server/claude-session-coordinator.d.ts +10 -0
- package/dist/src/server/claude-session-coordinator.js +69 -0
- package/dist/src/server/claude-session-coordinator.js.map +1 -0
- package/dist/src/server/claude-session-support.d.ts +1 -0
- package/dist/src/server/claude-session-support.js +2 -0
- package/dist/src/server/claude-session-support.js.map +1 -0
- package/dist/src/server/command-preset-defaults.d.ts +11 -0
- package/dist/src/server/command-preset-defaults.js +52 -0
- package/dist/src/server/command-preset-defaults.js.map +1 -0
- package/dist/src/server/command-preset-store.d.ts +49 -0
- package/dist/src/server/command-preset-store.js +90 -0
- package/dist/src/server/command-preset-store.js.map +1 -0
- package/dist/src/server/dispatch-ledger-serializer.d.ts +15 -0
- package/dist/src/server/dispatch-ledger-serializer.js +15 -0
- package/dist/src/server/dispatch-ledger-serializer.js.map +1 -0
- package/dist/src/server/dispatch-ledger-store.d.ts +45 -0
- package/dist/src/server/dispatch-ledger-store.js +196 -0
- package/dist/src/server/dispatch-ledger-store.js.map +1 -0
- package/dist/src/server/env-sync-message.d.ts +9 -0
- package/dist/src/server/env-sync-message.js +30 -0
- package/dist/src/server/env-sync-message.js.map +1 -0
- package/dist/src/server/fs-browse.d.ts +25 -0
- package/dist/src/server/fs-browse.js +130 -0
- package/dist/src/server/fs-browse.js.map +1 -0
- package/dist/src/server/fs-pick-folder.d.ts +25 -0
- package/dist/src/server/fs-pick-folder.js +132 -0
- package/dist/src/server/fs-pick-folder.js.map +1 -0
- package/dist/src/server/fs-sandbox.d.ts +13 -0
- package/dist/src/server/fs-sandbox.js +26 -0
- package/dist/src/server/fs-sandbox.js.map +1 -0
- package/dist/src/server/hive-team-guidance.d.ts +2 -0
- package/dist/src/server/hive-team-guidance.js +14 -0
- package/dist/src/server/hive-team-guidance.js.map +1 -0
- package/dist/src/server/http-errors.d.ts +16 -0
- package/dist/src/server/http-errors.js +33 -0
- package/dist/src/server/http-errors.js.map +1 -0
- package/dist/src/server/live-run-registry.d.ts +21 -0
- package/dist/src/server/live-run-registry.js +53 -0
- package/dist/src/server/live-run-registry.js.map +1 -0
- package/dist/src/server/message-log-store.d.ts +48 -0
- package/dist/src/server/message-log-store.js +144 -0
- package/dist/src/server/message-log-store.js.map +1 -0
- package/dist/src/server/orchestrator-autostart.d.ts +30 -0
- package/dist/src/server/orchestrator-autostart.js +103 -0
- package/dist/src/server/orchestrator-autostart.js.map +1 -0
- package/dist/src/server/orchestrator-launch.d.ts +22 -0
- package/dist/src/server/orchestrator-launch.js +75 -0
- package/dist/src/server/orchestrator-launch.js.map +1 -0
- package/dist/src/server/post-start-input-writer.d.ts +6 -0
- package/dist/src/server/post-start-input-writer.js +118 -0
- package/dist/src/server/post-start-input-writer.js.map +1 -0
- package/dist/src/server/preset-launch-support.d.ts +6 -0
- package/dist/src/server/preset-launch-support.js +67 -0
- package/dist/src/server/preset-launch-support.js.map +1 -0
- package/dist/src/server/pty-output-bus.d.ts +8 -0
- package/dist/src/server/pty-output-bus.js +33 -0
- package/dist/src/server/pty-output-bus.js.map +1 -0
- package/dist/src/server/recovery-summary.d.ts +10 -0
- package/dist/src/server/recovery-summary.js +89 -0
- package/dist/src/server/recovery-summary.js.map +1 -0
- package/dist/src/server/restart-policy-support.d.ts +23 -0
- package/dist/src/server/restart-policy-support.js +12 -0
- package/dist/src/server/restart-policy-support.js.map +1 -0
- package/dist/src/server/restart-policy.d.ts +14 -0
- package/dist/src/server/restart-policy.js +42 -0
- package/dist/src/server/restart-policy.js.map +1 -0
- package/dist/src/server/role-template-store.d.ts +44 -0
- package/dist/src/server/role-template-store.js +71 -0
- package/dist/src/server/role-template-store.js.map +1 -0
- package/dist/src/server/role-templates.d.ts +7 -0
- package/dist/src/server/role-templates.js +55 -0
- package/dist/src/server/role-templates.js.map +1 -0
- package/dist/src/server/route-helpers.d.ts +7 -0
- package/dist/src/server/route-helpers.js +48 -0
- package/dist/src/server/route-helpers.js.map +1 -0
- package/dist/src/server/route-types.d.ts +58 -0
- package/dist/src/server/route-types.js +2 -0
- package/dist/src/server/route-types.js.map +1 -0
- package/dist/src/server/routes-dispatches.d.ts +2 -0
- package/dist/src/server/routes-dispatches.js +53 -0
- package/dist/src/server/routes-dispatches.js.map +1 -0
- package/dist/src/server/routes-fs.d.ts +2 -0
- package/dist/src/server/routes-fs.js +25 -0
- package/dist/src/server/routes-fs.js.map +1 -0
- package/dist/src/server/routes-runtime.d.ts +2 -0
- package/dist/src/server/routes-runtime.js +46 -0
- package/dist/src/server/routes-runtime.js.map +1 -0
- package/dist/src/server/routes-settings.d.ts +2 -0
- package/dist/src/server/routes-settings.js +124 -0
- package/dist/src/server/routes-settings.js.map +1 -0
- package/dist/src/server/routes-tasks.d.ts +2 -0
- package/dist/src/server/routes-tasks.js +25 -0
- package/dist/src/server/routes-tasks.js.map +1 -0
- package/dist/src/server/routes-team.d.ts +2 -0
- package/dist/src/server/routes-team.js +50 -0
- package/dist/src/server/routes-team.js.map +1 -0
- package/dist/src/server/routes-ui.d.ts +2 -0
- package/dist/src/server/routes-ui.js +8 -0
- package/dist/src/server/routes-ui.js.map +1 -0
- package/dist/src/server/routes-workspaces.d.ts +2 -0
- package/dist/src/server/routes-workspaces.js +154 -0
- package/dist/src/server/routes-workspaces.js.map +1 -0
- package/dist/src/server/routes.d.ts +6 -0
- package/dist/src/server/routes.js +36 -0
- package/dist/src/server/routes.js.map +1 -0
- package/dist/src/server/runtime-database.d.ts +2 -0
- package/dist/src/server/runtime-database.js +13 -0
- package/dist/src/server/runtime-database.js.map +1 -0
- package/dist/src/server/runtime-message-builders.d.ts +6 -0
- package/dist/src/server/runtime-message-builders.js +52 -0
- package/dist/src/server/runtime-message-builders.js.map +1 -0
- package/dist/src/server/runtime-restart-policy.d.ts +14 -0
- package/dist/src/server/runtime-restart-policy.js +11 -0
- package/dist/src/server/runtime-restart-policy.js.map +1 -0
- package/dist/src/server/runtime-store-helpers.d.ts +71 -0
- package/dist/src/server/runtime-store-helpers.js +174 -0
- package/dist/src/server/runtime-store-helpers.js.map +1 -0
- package/dist/src/server/runtime-store.d.ts +70 -0
- package/dist/src/server/runtime-store.js +82 -0
- package/dist/src/server/runtime-store.js.map +1 -0
- package/dist/src/server/session-capture-claude.d.ts +11 -0
- package/dist/src/server/session-capture-claude.js +78 -0
- package/dist/src/server/session-capture-claude.js.map +1 -0
- package/dist/src/server/session-capture-codex.d.ts +5 -0
- package/dist/src/server/session-capture-codex.js +72 -0
- package/dist/src/server/session-capture-codex.js.map +1 -0
- package/dist/src/server/session-capture-gemini.d.ts +5 -0
- package/dist/src/server/session-capture-gemini.js +80 -0
- package/dist/src/server/session-capture-gemini.js.map +1 -0
- package/dist/src/server/session-capture-opencode.d.ts +4 -0
- package/dist/src/server/session-capture-opencode.js +43 -0
- package/dist/src/server/session-capture-opencode.js.map +1 -0
- package/dist/src/server/session-capture.d.ts +71 -0
- package/dist/src/server/session-capture.js +92 -0
- package/dist/src/server/session-capture.js.map +1 -0
- package/dist/src/server/settings-store.d.ts +19 -0
- package/dist/src/server/settings-store.js +22 -0
- package/dist/src/server/settings-store.js.map +1 -0
- package/dist/src/server/sqlite-schema-v10.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v10.js +14 -0
- package/dist/src/server/sqlite-schema-v10.js.map +1 -0
- package/dist/src/server/sqlite-schema-v11.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v11.js +11 -0
- package/dist/src/server/sqlite-schema-v11.js.map +1 -0
- package/dist/src/server/sqlite-schema-v12.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v12.js +22 -0
- package/dist/src/server/sqlite-schema-v12.js.map +1 -0
- package/dist/src/server/sqlite-schema-v13.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v13.js +5 -0
- package/dist/src/server/sqlite-schema-v13.js.map +1 -0
- package/dist/src/server/sqlite-schema-v14.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v14.js +85 -0
- package/dist/src/server/sqlite-schema-v14.js.map +1 -0
- package/dist/src/server/sqlite-schema-v5.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v5.js +62 -0
- package/dist/src/server/sqlite-schema-v5.js.map +1 -0
- package/dist/src/server/sqlite-schema-v7.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v7.js +71 -0
- package/dist/src/server/sqlite-schema-v7.js.map +1 -0
- package/dist/src/server/sqlite-schema-v8.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v8.js +7 -0
- package/dist/src/server/sqlite-schema-v8.js.map +1 -0
- package/dist/src/server/sqlite-schema-v9.d.ts +2 -0
- package/dist/src/server/sqlite-schema-v9.js +7 -0
- package/dist/src/server/sqlite-schema-v9.js.map +1 -0
- package/dist/src/server/sqlite-schema.d.ts +3 -0
- package/dist/src/server/sqlite-schema.js +185 -0
- package/dist/src/server/sqlite-schema.js.map +1 -0
- package/dist/src/server/system-message.d.ts +1 -0
- package/dist/src/server/system-message.js +2 -0
- package/dist/src/server/system-message.js.map +1 -0
- package/dist/src/server/tasks-file-watcher.d.ts +8 -0
- package/dist/src/server/tasks-file-watcher.js +60 -0
- package/dist/src/server/tasks-file-watcher.js.map +1 -0
- package/dist/src/server/tasks-file.d.ts +11 -0
- package/dist/src/server/tasks-file.js +33 -0
- package/dist/src/server/tasks-file.js.map +1 -0
- package/dist/src/server/tasks-websocket-server.d.ts +7 -0
- package/dist/src/server/tasks-websocket-server.js +72 -0
- package/dist/src/server/tasks-websocket-server.js.map +1 -0
- package/dist/src/server/team-authz.d.ts +13 -0
- package/dist/src/server/team-authz.js +33 -0
- package/dist/src/server/team-authz.js.map +1 -0
- package/dist/src/server/team-list-serializer.d.ts +8 -0
- package/dist/src/server/team-list-serializer.js +8 -0
- package/dist/src/server/team-list-serializer.js.map +1 -0
- package/dist/src/server/team-operations.d.ts +41 -0
- package/dist/src/server/team-operations.js +105 -0
- package/dist/src/server/team-operations.js.map +1 -0
- package/dist/src/server/terminal-flow-control.d.ts +19 -0
- package/dist/src/server/terminal-flow-control.js +117 -0
- package/dist/src/server/terminal-flow-control.js.map +1 -0
- package/dist/src/server/terminal-protocol.d.ts +29 -0
- package/dist/src/server/terminal-protocol.js +42 -0
- package/dist/src/server/terminal-protocol.js.map +1 -0
- package/dist/src/server/terminal-state-mirror.d.ts +15 -0
- package/dist/src/server/terminal-state-mirror.js +47 -0
- package/dist/src/server/terminal-state-mirror.js.map +1 -0
- package/dist/src/server/terminal-stream-hub.d.ts +9 -0
- package/dist/src/server/terminal-stream-hub.js +179 -0
- package/dist/src/server/terminal-stream-hub.js.map +1 -0
- package/dist/src/server/terminal-ws-server.d.ts +5 -0
- package/dist/src/server/terminal-ws-server.js +85 -0
- package/dist/src/server/terminal-ws-server.js.map +1 -0
- package/dist/src/server/ui-auth-helpers.d.ts +4 -0
- package/dist/src/server/ui-auth-helpers.js +23 -0
- package/dist/src/server/ui-auth-helpers.js.map +1 -0
- package/dist/src/server/ui-auth.d.ts +5 -0
- package/dist/src/server/ui-auth.js +13 -0
- package/dist/src/server/ui-auth.js.map +1 -0
- package/dist/src/server/workspace-store-contract.d.ts +28 -0
- package/dist/src/server/workspace-store-contract.js +2 -0
- package/dist/src/server/workspace-store-contract.js.map +1 -0
- package/dist/src/server/workspace-store-hydration.d.ts +5 -0
- package/dist/src/server/workspace-store-hydration.js +64 -0
- package/dist/src/server/workspace-store-hydration.js.map +1 -0
- package/dist/src/server/workspace-store-mutations.d.ts +13 -0
- package/dist/src/server/workspace-store-mutations.js +49 -0
- package/dist/src/server/workspace-store-mutations.js.map +1 -0
- package/dist/src/server/workspace-store-support.d.ts +29 -0
- package/dist/src/server/workspace-store-support.js +25 -0
- package/dist/src/server/workspace-store-support.js.map +1 -0
- package/dist/src/server/workspace-store.d.ts +5 -0
- package/dist/src/server/workspace-store.js +114 -0
- package/dist/src/server/workspace-store.js.map +1 -0
- package/dist/src/shared/types.d.ts +36 -0
- package/dist/src/shared/types.js +2 -0
- package/dist/src/shared/types.js.map +1 -0
- package/package.json +108 -0
- package/scripts/fix-runtime-artifacts.mjs +33 -0
- package/web/dist/assets/addon-fit-DX4qG4td.js +1 -0
- package/web/dist/assets/index-CjlaoOoA.css +1 -0
- package/web/dist/assets/index-CwdRvXrs.js +63 -0
- package/web/dist/assets/xterm-B-qIQCd3.js +16 -0
- package/web/dist/favicon.svg +58 -0
- package/web/dist/index.html +22 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
export const createUiAuth = () => {
|
|
3
|
+
const token = randomUUID();
|
|
4
|
+
return {
|
|
5
|
+
getToken() {
|
|
6
|
+
return token;
|
|
7
|
+
},
|
|
8
|
+
validate(input) {
|
|
9
|
+
return input === token;
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=ui-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-auth.js","sourceRoot":"","sources":["../../../src/server/ui-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAOxC,MAAM,CAAC,MAAM,YAAY,GAAG,GAAW,EAAE;IACvC,MAAM,KAAK,GAAG,UAAU,EAAE,CAAA;IAE1B,OAAO;QACL,QAAQ;YACN,OAAO,KAAK,CAAA;QACd,CAAC;QACD,QAAQ,CAAC,KAAK;YACZ,OAAO,KAAK,KAAK,KAAK,CAAA;QACxB,CAAC;KACF,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AgentSummary, TeamListItem, WorkerRole, WorkspaceSummary } from '../shared/types.js';
|
|
2
|
+
export interface WorkspaceRecord {
|
|
3
|
+
summary: WorkspaceSummary;
|
|
4
|
+
agents: AgentSummary[];
|
|
5
|
+
}
|
|
6
|
+
export interface WorkerInput {
|
|
7
|
+
description?: string;
|
|
8
|
+
name: string;
|
|
9
|
+
role: WorkerRole;
|
|
10
|
+
}
|
|
11
|
+
export interface WorkspaceStore {
|
|
12
|
+
addWorker: (workspaceId: string, input: WorkerInput) => AgentSummary;
|
|
13
|
+
createWorkspace: (path: string, name: string) => WorkspaceSummary;
|
|
14
|
+
deleteWorkspace: (workspaceId: string) => void;
|
|
15
|
+
deleteWorker: (workspaceId: string, workerId: string) => void;
|
|
16
|
+
renameWorker: (workspaceId: string, workerId: string, name: string) => AgentSummary;
|
|
17
|
+
getAgent: (workspaceId: string, agentId: string) => AgentSummary;
|
|
18
|
+
getWorker: (workspaceId: string, workerId: string) => AgentSummary;
|
|
19
|
+
getWorkerByName: (workspaceId: string, workerName: string) => AgentSummary;
|
|
20
|
+
getWorkspaceSnapshot: (workspaceId: string) => WorkspaceRecord;
|
|
21
|
+
hasAgent: (workspaceId: string, agentId: string) => boolean;
|
|
22
|
+
listWorkers: (workspaceId: string) => TeamListItem[];
|
|
23
|
+
listWorkspaces: () => WorkspaceSummary[];
|
|
24
|
+
markAgentStarted: (workspaceId: string, agentId: string) => void;
|
|
25
|
+
markAgentStopped: (workspaceId: string, agentId: string) => void;
|
|
26
|
+
markTaskDispatched: (workspaceId: string, workerId: string) => void;
|
|
27
|
+
markTaskReported: (workspaceId: string, workerId: string) => void;
|
|
28
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-store-contract.js","sourceRoot":"","sources":["../../../src/server/workspace-store-contract.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Database } from 'better-sqlite3';
|
|
2
|
+
import type { WorkspaceRecord } from './workspace-store-contract.js';
|
|
3
|
+
import { type MessageKindRecord } from './workspace-store-support.js';
|
|
4
|
+
export declare const hydrateWorkspaceFromDb: (db: Database | undefined, workspaces: Map<string, WorkspaceRecord>, messageKinds: MessageKindRecord[], workspaceId: string) => void;
|
|
5
|
+
export declare const seedWorkspacesFromDb: (db: Database | undefined, workspaces: Map<string, WorkspaceRecord>, messageKinds: MessageKindRecord[]) => void;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { getDefaultRoleDescription } from './role-templates.js';
|
|
2
|
+
import { applyPendingTaskCount, createOrchestrator, isWorkerAgent, } from './workspace-store-support.js';
|
|
3
|
+
const createWorkerSummary = (workspaceId, row) => ({
|
|
4
|
+
id: row.id,
|
|
5
|
+
workspaceId,
|
|
6
|
+
name: row.name,
|
|
7
|
+
description: row.description ?? getDefaultRoleDescription(row.role),
|
|
8
|
+
role: row.role,
|
|
9
|
+
status: 'stopped',
|
|
10
|
+
pendingTaskCount: 0,
|
|
11
|
+
});
|
|
12
|
+
const applyMessageKinds = (workspaces, messageKinds, workspaceId) => {
|
|
13
|
+
for (const row of messageKinds) {
|
|
14
|
+
if (workspaceId && row.workspace_id !== workspaceId) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const worker = workspaces
|
|
18
|
+
.get(row.workspace_id)
|
|
19
|
+
?.agents.find((agent) => agent.id === row.worker_id);
|
|
20
|
+
if (!worker || !isWorkerAgent(worker)) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
applyPendingTaskCount(worker, row.type, true);
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
export const hydrateWorkspaceFromDb = (db, workspaces, messageKinds, workspaceId) => {
|
|
27
|
+
if (!db || workspaces.has(workspaceId)) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const row = db.prepare('SELECT id, name, path FROM workspaces WHERE id = ?').get(workspaceId);
|
|
31
|
+
if (!row) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
workspaces.set(row.id, {
|
|
35
|
+
summary: { id: row.id, name: row.name, path: row.path },
|
|
36
|
+
agents: [createOrchestrator(row.id)],
|
|
37
|
+
});
|
|
38
|
+
for (const workerRow of db
|
|
39
|
+
.prepare('SELECT id, workspace_id, name, description, role FROM workers WHERE workspace_id = ? ORDER BY created_at ASC')
|
|
40
|
+
.all(workspaceId)) {
|
|
41
|
+
workspaces.get(workspaceId)?.agents.push(createWorkerSummary(workerRow.workspace_id, workerRow));
|
|
42
|
+
}
|
|
43
|
+
applyMessageKinds(workspaces, messageKinds, workspaceId);
|
|
44
|
+
};
|
|
45
|
+
export const seedWorkspacesFromDb = (db, workspaces, messageKinds) => {
|
|
46
|
+
if (!db) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
for (const row of db
|
|
50
|
+
.prepare('SELECT id, name, path FROM workspaces ORDER BY created_at ASC')
|
|
51
|
+
.all()) {
|
|
52
|
+
workspaces.set(row.id, {
|
|
53
|
+
summary: { id: row.id, name: row.name, path: row.path },
|
|
54
|
+
agents: [createOrchestrator(row.id)],
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
for (const row of db
|
|
58
|
+
.prepare('SELECT id, workspace_id, name, description, role FROM workers ORDER BY created_at ASC')
|
|
59
|
+
.all()) {
|
|
60
|
+
workspaces.get(row.workspace_id)?.agents.push(createWorkerSummary(row.workspace_id, row));
|
|
61
|
+
}
|
|
62
|
+
applyMessageKinds(workspaces, messageKinds);
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=workspace-store-hydration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-store-hydration.js","sourceRoot":"","sources":["../../../src/server/workspace-store-hydration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
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 {};
|
|
@@ -0,0 +1,49 @@
|
|
|
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 pendingTaskCount = getAgentRecord(workspaces, workspaceId, agentId).pendingTaskCount;
|
|
28
|
+
getAgentRecord(workspaces, workspaceId, agentId).status =
|
|
29
|
+
getStatusFromPendingCount(pendingTaskCount);
|
|
30
|
+
};
|
|
31
|
+
export const markAgentStopped = (workspaces, workspaceId, agentId) => {
|
|
32
|
+
getAgentRecord(workspaces, workspaceId, agentId).status = 'stopped';
|
|
33
|
+
};
|
|
34
|
+
export const markTaskDispatched = (workspaces, workspaceId, workerId) => {
|
|
35
|
+
const worker = getWorkerRecord(workspaces, workspaceId, workerId);
|
|
36
|
+
worker.pendingTaskCount += 1;
|
|
37
|
+
// spec §3.6.4: a stopped worker may accumulate queued tasks; PTY isn't
|
|
38
|
+
// running so it can't be `working`. Stay stopped until restart (mirrors
|
|
39
|
+
// markTaskReported's stopped guard below).
|
|
40
|
+
if (worker.status !== 'stopped')
|
|
41
|
+
worker.status = getStatusFromPendingCount(worker.pendingTaskCount);
|
|
42
|
+
};
|
|
43
|
+
export const markTaskReported = (workspaces, workspaceId, workerId) => {
|
|
44
|
+
const worker = getWorkerRecord(workspaces, workspaceId, workerId);
|
|
45
|
+
worker.pendingTaskCount = Math.max(0, worker.pendingTaskCount - 1);
|
|
46
|
+
if (worker.status !== 'stopped')
|
|
47
|
+
worker.status = getStatusFromPendingCount(worker.pendingTaskCount);
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=workspace-store-mutations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-store-mutations.js","sourceRoot":"","sources":["../../../src/server/workspace-store-mutations.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAIvF,MAAM,kBAAkB,GAAG,CAAC,UAAwB,EAAE,WAAmB,EAAE,EAAE;IAC3E,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAC7C,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAA;IACtE,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,UAAwB,EAAE,WAAmB,EAAE,OAAe,EAAE,EAAE;IAC/F,MAAM,KAAK,GAAG,kBAAkB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,CACnE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAC9B,CAAA;IACD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAA;IAC1D,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,UAAwB,EACxB,WAAmB,EACnB,QAAgB,EAChB,EAAE;IACF,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;IAChE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAA;IAC5E,OAAO,MAA6C,CAAA;AACtD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,UAAwB,EACxB,WAAmB,EACnB,UAAkB,EAClB,EAAE;IACF,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,CACpE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,aAAa,CAAC,IAAI,CAAC,CAC1D,CAAA;IACD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAA;IAC/D,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,UAAwB,EACxB,WAAmB,EACnB,OAAe,EACf,EAAE;IACF,MAAM,gBAAgB,GAAG,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,gBAAgB,CAAA;IAC1F,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,MAAM;QACrD,yBAAyB,CAAC,gBAAgB,CAAC,CAAA;AAC/C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,UAAwB,EACxB,WAAmB,EACnB,OAAe,EACf,EAAE;IACF,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,CAAA;AACrE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,UAAwB,EACxB,WAAmB,EACnB,QAAgB,EAChB,EAAE;IACF,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;IACjE,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAA;IAC5B,uEAAuE;IACvE,wEAAwE;IACxE,2CAA2C;IAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAC7B,MAAM,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;AACtE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,UAAwB,EACxB,WAAmB,EACnB,QAAgB,EAChB,EAAE;IACF,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;IACjE,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAA;IAClE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAC7B,MAAM,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;AACtE,CAAC,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
}
|
|
19
|
+
export interface WorkspaceSummaryRow extends WorkspaceRow {
|
|
20
|
+
}
|
|
21
|
+
export declare const getOrchestratorId: (workspaceId: string) => string;
|
|
22
|
+
export declare const createOrchestrator: (workspaceId: string) => AgentSummary;
|
|
23
|
+
export declare const isWorkerAgent: (agent: AgentSummary) => agent is AgentSummary & {
|
|
24
|
+
role: WorkerRole;
|
|
25
|
+
};
|
|
26
|
+
export declare const getStatusFromPendingCount: (pendingTaskCount: number) => AgentStatus;
|
|
27
|
+
export declare const applyPendingTaskCount: (worker: AgentSummary & {
|
|
28
|
+
role: WorkerRole;
|
|
29
|
+
}, type: MessageKindRecord["type"], preserveStoppedStatus: boolean) => void;
|
|
@@ -0,0 +1,25 @@
|
|
|
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: 'idle',
|
|
10
|
+
pendingTaskCount: 0,
|
|
11
|
+
});
|
|
12
|
+
export const isWorkerAgent = (agent) => {
|
|
13
|
+
return agent.role !== 'orchestrator';
|
|
14
|
+
};
|
|
15
|
+
export const getStatusFromPendingCount = (pendingTaskCount) => {
|
|
16
|
+
return pendingTaskCount > 0 ? 'working' : 'idle';
|
|
17
|
+
};
|
|
18
|
+
export const applyPendingTaskCount = (worker, type, preserveStoppedStatus) => {
|
|
19
|
+
worker.pendingTaskCount =
|
|
20
|
+
type === 'send' ? worker.pendingTaskCount + 1 : Math.max(0, worker.pendingTaskCount - 1);
|
|
21
|
+
if (!preserveStoppedStatus) {
|
|
22
|
+
worker.status = getStatusFromPendingCount(worker.pendingTaskCount);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=workspace-store-support.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-store-support.js","sourceRoot":"","sources":["../../../src/server/workspace-store-support.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAwB/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAmB,EAAE,EAAE,CAAC,GAAG,WAAW,eAAe,CAAA;AAEvF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,WAAmB,EAAgB,EAAE,CAAC,CAAC;IACxE,EAAE,EAAE,iBAAiB,CAAC,WAAW,CAAC;IAClC,WAAW;IACX,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,yBAAyB,CAAC,cAAc,CAAC;IACtD,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,MAAM;IACd,gBAAgB,EAAE,CAAC;CACpB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,KAAmB,EAC2B,EAAE;IAChD,OAAO,KAAK,CAAC,IAAI,KAAK,cAAc,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,gBAAwB,EAAe,EAAE;IACjF,OAAO,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAA;AAClD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,MAA2C,EAC3C,IAA+B,EAC/B,qBAA8B,EAC9B,EAAE;IACF,MAAM,CAAC,gBAAgB;QACrB,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAA;IAC1F,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,GAAG,yBAAyB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAA;IACpE,CAAC;AACH,CAAC,CAAA"}
|
|
@@ -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 | undefined, messageKinds: MessageKindRecord[]) => WorkspaceStore;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { ConflictError } from './http-errors.js';
|
|
3
|
+
import { getDefaultRoleDescription } from './role-templates.js';
|
|
4
|
+
import { hydrateWorkspaceFromDb, seedWorkspacesFromDb } from './workspace-store-hydration.js';
|
|
5
|
+
import { getAgentRecord, getWorkerByNameRecord, getWorkerRecord, markAgentStarted, markAgentStopped, markTaskDispatched, markTaskReported, } from './workspace-store-mutations.js';
|
|
6
|
+
import { createOrchestrator, isWorkerAgent, } from './workspace-store-support.js';
|
|
7
|
+
export const createWorkspaceStore = (db, messageKinds) => {
|
|
8
|
+
const workspaces = new Map();
|
|
9
|
+
seedWorkspacesFromDb(db, workspaces, messageKinds);
|
|
10
|
+
const getWorkspace = (workspaceId) => {
|
|
11
|
+
hydrateWorkspaceFromDb(db, workspaces, messageKinds, workspaceId);
|
|
12
|
+
const workspace = workspaces.get(workspaceId);
|
|
13
|
+
if (!workspace)
|
|
14
|
+
throw new Error(`Workspace not found: ${workspaceId}`);
|
|
15
|
+
return workspace;
|
|
16
|
+
};
|
|
17
|
+
return {
|
|
18
|
+
addWorker(workspaceId, input) {
|
|
19
|
+
const workspace = getWorkspace(workspaceId);
|
|
20
|
+
if (workspace.agents.some((agent) => agent.name === input.name && isWorkerAgent(agent))) {
|
|
21
|
+
throw new ConflictError(`Worker name already exists: ${input.name}`);
|
|
22
|
+
}
|
|
23
|
+
const worker = {
|
|
24
|
+
id: randomUUID(),
|
|
25
|
+
workspaceId,
|
|
26
|
+
name: input.name,
|
|
27
|
+
description: input.description ?? getDefaultRoleDescription(input.role),
|
|
28
|
+
role: input.role,
|
|
29
|
+
status: 'stopped',
|
|
30
|
+
pendingTaskCount: 0,
|
|
31
|
+
};
|
|
32
|
+
db?.prepare('INSERT INTO workers (id, workspace_id, name, description, role, created_at) VALUES (?, ?, ?, ?, ?, ?)').run(worker.id, workspaceId, worker.name, worker.description, worker.role, Date.now());
|
|
33
|
+
workspace.agents.push(worker);
|
|
34
|
+
return worker;
|
|
35
|
+
},
|
|
36
|
+
createWorkspace(path, name) {
|
|
37
|
+
const summary = { id: randomUUID(), name, path };
|
|
38
|
+
db?.prepare('INSERT INTO workspaces (id, name, path, created_at) VALUES (?, ?, ?, ?)').run(summary.id, name, path, Date.now());
|
|
39
|
+
workspaces.set(summary.id, { summary, agents: [createOrchestrator(summary.id)] });
|
|
40
|
+
return summary;
|
|
41
|
+
},
|
|
42
|
+
deleteWorkspace(workspaceId) {
|
|
43
|
+
const workspace = getWorkspace(workspaceId);
|
|
44
|
+
const agentIds = workspace.agents.map((agent) => agent.id);
|
|
45
|
+
db?.transaction(() => {
|
|
46
|
+
db.prepare('DELETE FROM messages WHERE workspace_id = ?').run(workspaceId);
|
|
47
|
+
db.prepare('DELETE FROM agent_launch_configs WHERE workspace_id = ?').run(workspaceId);
|
|
48
|
+
db.prepare('DELETE FROM agent_sessions WHERE workspace_id = ?').run(workspaceId);
|
|
49
|
+
const deleteAgentRuns = db.prepare('DELETE FROM agent_runs WHERE agent_id = ?');
|
|
50
|
+
for (const agentId of agentIds)
|
|
51
|
+
deleteAgentRuns.run(agentId);
|
|
52
|
+
db.prepare('DELETE FROM workers WHERE workspace_id = ?').run(workspaceId);
|
|
53
|
+
db.prepare('DELETE FROM workspaces WHERE id = ?').run(workspaceId);
|
|
54
|
+
})();
|
|
55
|
+
workspaces.delete(workspaceId);
|
|
56
|
+
},
|
|
57
|
+
renameWorker(workspaceId, workerId, name) {
|
|
58
|
+
const worker = getWorkerRecord(workspaces, workspaceId, workerId);
|
|
59
|
+
const trimmed = name.trim();
|
|
60
|
+
if (!trimmed)
|
|
61
|
+
throw new Error('Worker name must not be empty');
|
|
62
|
+
if (trimmed.length > 64)
|
|
63
|
+
throw new Error('Worker name must be 64 characters or fewer');
|
|
64
|
+
if (trimmed === worker.name)
|
|
65
|
+
return worker;
|
|
66
|
+
const workspace = getWorkspace(workspaceId);
|
|
67
|
+
if (workspace.agents.some((agent) => agent.id !== workerId && agent.name === trimmed && isWorkerAgent(agent))) {
|
|
68
|
+
throw new ConflictError(`Worker name already exists: ${trimmed}`);
|
|
69
|
+
}
|
|
70
|
+
db?.prepare('UPDATE workers SET name = ? WHERE workspace_id = ? AND id = ?').run(trimmed, workspaceId, workerId);
|
|
71
|
+
worker.name = trimmed;
|
|
72
|
+
return worker;
|
|
73
|
+
},
|
|
74
|
+
deleteWorker(workspaceId, workerId) {
|
|
75
|
+
const workspace = getWorkspace(workspaceId);
|
|
76
|
+
getWorkerRecord(workspaces, workspaceId, workerId);
|
|
77
|
+
db?.transaction(() => {
|
|
78
|
+
db.prepare('DELETE FROM messages WHERE workspace_id = ? AND worker_id = ?').run(workspaceId, workerId);
|
|
79
|
+
db.prepare('DELETE FROM agent_launch_configs WHERE workspace_id = ? AND agent_id = ?').run(workspaceId, workerId);
|
|
80
|
+
db.prepare('DELETE FROM agent_sessions WHERE workspace_id = ? AND agent_id = ?').run(workspaceId, workerId);
|
|
81
|
+
db.prepare('DELETE FROM agent_runs WHERE agent_id = ?').run(workerId);
|
|
82
|
+
db.prepare('DELETE FROM workers WHERE workspace_id = ? AND id = ?').run(workspaceId, workerId);
|
|
83
|
+
})();
|
|
84
|
+
workspace.agents = workspace.agents.filter((agent) => agent.id !== workerId);
|
|
85
|
+
},
|
|
86
|
+
getAgent: (workspaceId, agentId) => getAgentRecord(workspaces, workspaceId, agentId),
|
|
87
|
+
getWorker: (workspaceId, workerId) => getWorkerRecord(workspaces, workspaceId, workerId),
|
|
88
|
+
getWorkerByName: (workspaceId, workerName) => getWorkerByNameRecord(workspaces, workspaceId, workerName),
|
|
89
|
+
getWorkspaceSnapshot: getWorkspace,
|
|
90
|
+
hasAgent(workspaceId, agentId) {
|
|
91
|
+
hydrateWorkspaceFromDb(db, workspaces, messageKinds, workspaceId);
|
|
92
|
+
return workspaces.get(workspaceId)?.agents.some((agent) => agent.id === agentId) ?? false;
|
|
93
|
+
},
|
|
94
|
+
listWorkers(workspaceId) {
|
|
95
|
+
return getWorkspace(workspaceId)
|
|
96
|
+
.agents.filter(isWorkerAgent)
|
|
97
|
+
.map(({ id, name, role, status, pendingTaskCount }) => ({
|
|
98
|
+
id,
|
|
99
|
+
name,
|
|
100
|
+
role,
|
|
101
|
+
status,
|
|
102
|
+
pendingTaskCount,
|
|
103
|
+
}));
|
|
104
|
+
},
|
|
105
|
+
listWorkspaces() {
|
|
106
|
+
return Array.from(workspaces.values(), (workspace) => workspace.summary);
|
|
107
|
+
},
|
|
108
|
+
markAgentStarted: (workspaceId, agentId) => markAgentStarted(workspaces, workspaceId, agentId),
|
|
109
|
+
markAgentStopped: (workspaceId, agentId) => markAgentStopped(workspaces, workspaceId, agentId),
|
|
110
|
+
markTaskDispatched: (workspaceId, workerId) => markTaskDispatched(workspaces, workspaceId, workerId),
|
|
111
|
+
markTaskReported: (workspaceId, workerId) => markTaskReported(workspaces, workspaceId, workerId),
|
|
112
|
+
};
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=workspace-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-store.js","sourceRoot":"","sources":["../../../src/server/workspace-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare const agentStatuses: readonly ["idle", "working", "stopped"];
|
|
2
|
+
export type AgentStatus = (typeof agentStatuses)[number];
|
|
3
|
+
export type WorkerRole = 'coder' | 'reviewer' | 'tester' | 'custom';
|
|
4
|
+
export interface WorkspaceSummary {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
path: string;
|
|
8
|
+
}
|
|
9
|
+
export interface AgentSummary {
|
|
10
|
+
id: string;
|
|
11
|
+
workspaceId: string;
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
role: WorkerRole | 'orchestrator';
|
|
15
|
+
status: AgentStatus;
|
|
16
|
+
pendingTaskCount: number;
|
|
17
|
+
}
|
|
18
|
+
export interface TeamListItem {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
role: WorkerRole;
|
|
22
|
+
status: AgentStatus;
|
|
23
|
+
pendingTaskCount: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Wire payload shape for /api/workspaces/:id/team and worker-creation responses.
|
|
27
|
+
* Per AGENTS.md §8 + spec §3.3 line 162-179, HTTP JSON is snake_case.
|
|
28
|
+
* Internal TS code uses TeamListItem (camelCase); serializers/deserializers convert.
|
|
29
|
+
*/
|
|
30
|
+
export interface TeamListItemPayload {
|
|
31
|
+
id: string;
|
|
32
|
+
name: string;
|
|
33
|
+
role: WorkerRole;
|
|
34
|
+
status: AgentStatus;
|
|
35
|
+
pending_task_count: number;
|
|
36
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/shared/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAU,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tt-a1i/hive",
|
|
3
|
+
"version": "0.6.0-alpha.0",
|
|
4
|
+
"description": "Local multi-agent workspace for coordinating CLI coding agents through a web UI.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"packageManager": "pnpm@10.30.3",
|
|
7
|
+
"license": "Apache-2.0",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"ai-agents",
|
|
10
|
+
"cli",
|
|
11
|
+
"coding-agent",
|
|
12
|
+
"collaboration",
|
|
13
|
+
"local-first",
|
|
14
|
+
"multi-agent",
|
|
15
|
+
"pty",
|
|
16
|
+
"workspace"
|
|
17
|
+
],
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/tt-a1i/hive.git"
|
|
21
|
+
},
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/tt-a1i/hive/issues"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://github.com/tt-a1i/hive#readme",
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=22"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"CHANGELOG.md",
|
|
31
|
+
"LICENSE",
|
|
32
|
+
"README.md",
|
|
33
|
+
"SECURITY.md",
|
|
34
|
+
"dist/bin/",
|
|
35
|
+
"dist/src/",
|
|
36
|
+
"web/dist/",
|
|
37
|
+
"scripts/fix-runtime-artifacts.mjs"
|
|
38
|
+
],
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"bin": {
|
|
43
|
+
"hive": "dist/src/cli/hive.js"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"clean": "node scripts/clean-build.mjs",
|
|
47
|
+
"dev": "pnpm dev:all",
|
|
48
|
+
"dev:all": "concurrently \"pnpm dev:runtime\" \"pnpm dev:web\"",
|
|
49
|
+
"dev:runtime": "tsx src/cli/hive.ts --port 4010",
|
|
50
|
+
"dev:web": "vite --config web/vite.config.ts",
|
|
51
|
+
"build": "pnpm clean && tsc -p tsconfig.build.json && node scripts/prepare-build-artifacts.mjs && pnpm build:web",
|
|
52
|
+
"build:web": "vite build --config web/vite.config.ts",
|
|
53
|
+
"check": "pnpm exec biome check .",
|
|
54
|
+
"format": "pnpm exec biome format --write .",
|
|
55
|
+
"pack:check": "npm pack --dry-run --json",
|
|
56
|
+
"pack:smoke": "node scripts/pack-smoke.mjs",
|
|
57
|
+
"postinstall": "node scripts/fix-runtime-artifacts.mjs",
|
|
58
|
+
"release:dry": "pnpm check && pnpm build && pnpm test && pnpm pack:check && pnpm pack:smoke",
|
|
59
|
+
"test": "vitest run",
|
|
60
|
+
"test:windows": "vitest run tests/unit/agent-command-resolver.test.ts tests/unit/session-capture-multi-cli.test.ts tests/unit/claude-session-support.test.ts tests/unit/worker-name-generator.test.ts tests/server/fs-pick-folder.test.ts tests/server/fs-browse.test.ts tests/server/schema-version.test.ts tests/server/runtime-rehydration.test.ts tests/web/workspace-picker.test.tsx tests/web/confirm-dialog.test.tsx tests/web/toast.test.tsx --no-file-parallelism --maxWorkers=1 --testTimeout=30000 --hookTimeout=30000",
|
|
61
|
+
"test:watch": "vitest"
|
|
62
|
+
},
|
|
63
|
+
"dependencies": {
|
|
64
|
+
"@radix-ui/react-dialog": "^1.1.15",
|
|
65
|
+
"@radix-ui/react-slot": "^1.2.4",
|
|
66
|
+
"@radix-ui/react-tooltip": "^1.2.8",
|
|
67
|
+
"@tailwindcss/vite": "^4.2.2",
|
|
68
|
+
"@xterm/addon-fit": "^0.11.0",
|
|
69
|
+
"@xterm/addon-serialize": "^0.14.0",
|
|
70
|
+
"@xterm/headless": "^6.0.0",
|
|
71
|
+
"@xterm/xterm": "^6.0.0",
|
|
72
|
+
"better-sqlite3": "^12.9.0",
|
|
73
|
+
"chokidar": "^5.0.0",
|
|
74
|
+
"class-variance-authority": "^0.7.1",
|
|
75
|
+
"clsx": "^2.1.1",
|
|
76
|
+
"commander": "^14.0.0",
|
|
77
|
+
"lucide-react": "^1.8.0",
|
|
78
|
+
"node-pty": "^1.1.0",
|
|
79
|
+
"react": "^19.1.0",
|
|
80
|
+
"react-dom": "^19.1.0",
|
|
81
|
+
"tailwind-merge": "^3.5.0",
|
|
82
|
+
"tailwindcss": "^4.2.2",
|
|
83
|
+
"ws": "^8.20.0"
|
|
84
|
+
},
|
|
85
|
+
"devDependencies": {
|
|
86
|
+
"@biomejs/biome": "2.4.12",
|
|
87
|
+
"@testing-library/jest-dom": "^6.6.3",
|
|
88
|
+
"@testing-library/react": "^16.1.0",
|
|
89
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
90
|
+
"@types/node": "^24.6.0",
|
|
91
|
+
"@types/react": "^19.1.13",
|
|
92
|
+
"@types/react-dom": "^19.1.9",
|
|
93
|
+
"@types/ws": "^8.18.1",
|
|
94
|
+
"concurrently": "^9.1.2",
|
|
95
|
+
"jsdom": "^26.1.0",
|
|
96
|
+
"tsx": "^4.20.6",
|
|
97
|
+
"typescript": "^5.9.3",
|
|
98
|
+
"vite": "^7.1.10",
|
|
99
|
+
"vitest": "^3.2.4"
|
|
100
|
+
},
|
|
101
|
+
"pnpm": {
|
|
102
|
+
"onlyBuiltDependencies": [
|
|
103
|
+
"better-sqlite3",
|
|
104
|
+
"esbuild",
|
|
105
|
+
"node-pty"
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { chmodSync, existsSync, readdirSync } from 'node:fs'
|
|
2
|
+
import { createRequire } from 'node:module'
|
|
3
|
+
import { dirname, join } from 'node:path'
|
|
4
|
+
|
|
5
|
+
const executablePaths = [
|
|
6
|
+
'bin/team',
|
|
7
|
+
'bin/team.cmd',
|
|
8
|
+
'dist/bin/team',
|
|
9
|
+
'dist/bin/team.cmd',
|
|
10
|
+
'node_modules/.pnpm/node-pty@1.1.0/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper',
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
const require = createRequire(import.meta.url)
|
|
14
|
+
|
|
15
|
+
try {
|
|
16
|
+
const nodePtyPackageJson = require.resolve('node-pty/package.json')
|
|
17
|
+
const nodePtyRoot = dirname(nodePtyPackageJson)
|
|
18
|
+
const prebuildsDir = join(nodePtyRoot, 'prebuilds')
|
|
19
|
+
|
|
20
|
+
for (const entry of existsSync(prebuildsDir) ? readdirSync(prebuildsDir) : []) {
|
|
21
|
+
executablePaths.push(join(prebuildsDir, entry, 'spawn-helper'))
|
|
22
|
+
}
|
|
23
|
+
} catch {
|
|
24
|
+
// node-pty may not be installed when this script runs in partial dev setups.
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
for (const filePath of executablePaths) {
|
|
28
|
+
if (!existsSync(filePath)) {
|
|
29
|
+
continue
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
chmodSync(filePath, 0o755)
|
|
33
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var p=2,c=1,d=class{activate(e){this._terminal=e}dispose(){}fit(){let e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;let i=this._terminal._core;(this._terminal.rows!==e.rows||this._terminal.cols!==e.cols)&&(i._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal||!this._terminal.element||!this._terminal.element.parentElement)return;let e=this._terminal._core._renderService.dimensions;if(e.css.cell.width===0||e.css.cell.height===0)return;let i=this._terminal.options.scrollback===0?0:this._terminal.options.overviewRuler?.width||14,s=window.getComputedStyle(this._terminal.element.parentElement),l=parseInt(s.getPropertyValue("height")),o=Math.max(0,parseInt(s.getPropertyValue("width"))),t=window.getComputedStyle(this._terminal.element),r={top:parseInt(t.getPropertyValue("padding-top")),bottom:parseInt(t.getPropertyValue("padding-bottom")),right:parseInt(t.getPropertyValue("padding-right")),left:parseInt(t.getPropertyValue("padding-left"))},a=r.top+r.bottom,n=r.right+r.left,h=l-a,m=o-n-i;return{cols:Math.max(p,Math.floor(m/e.css.cell.width)),rows:Math.max(c,Math.floor(h/e.css.cell.height))}}};export{d as FitAddon};
|