@tt-a1i/hive 0.6.0-alpha.8 → 1.1.2
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 +54 -0
- package/README.en.md +24 -21
- package/README.md +11 -10
- package/dist/bin/team.cmd +0 -0
- package/dist/src/cli/hive.js +0 -1
- package/dist/src/cli/team.js +2 -1
- package/dist/src/server/agent-command-resolver.js +0 -1
- package/dist/src/server/agent-launch-cache.js +0 -1
- package/dist/src/server/agent-launch-resolver.js +0 -1
- package/dist/src/server/agent-manager-support.js +0 -1
- package/dist/src/server/agent-manager.js +0 -1
- package/dist/src/server/agent-run-bootstrap.js +0 -1
- package/dist/src/server/agent-run-exit-handler.js +0 -1
- package/dist/src/server/agent-run-start-context.js +0 -1
- package/dist/src/server/agent-run-starter.js +0 -1
- package/dist/src/server/agent-run-store.js +0 -1
- package/dist/src/server/agent-run-sync.js +0 -1
- package/dist/src/server/agent-runtime-active-run.js +0 -1
- package/dist/src/server/agent-runtime-close.js +0 -1
- package/dist/src/server/agent-runtime-contract.js +0 -1
- package/dist/src/server/agent-runtime-flow-adapter.js +0 -1
- package/dist/src/server/agent-runtime-list-runs.js +0 -1
- package/dist/src/server/agent-runtime-ports.js +0 -1
- package/dist/src/server/agent-runtime-stop-run.js +0 -1
- package/dist/src/server/agent-runtime-types.js +0 -1
- package/dist/src/server/agent-runtime.js +0 -1
- package/dist/src/server/agent-session-store.js +0 -1
- package/dist/src/server/agent-startup-instructions.js +0 -1
- package/dist/src/server/agent-stdin-dispatcher.d.ts +4 -0
- package/dist/src/server/agent-stdin-dispatcher.js +37 -27
- package/dist/src/server/agent-tokens.js +0 -1
- package/dist/src/server/app-state-store.js +0 -1
- package/dist/src/server/app.js +0 -1
- package/dist/src/server/claude-command-defaults.js +0 -1
- package/dist/src/server/claude-session-coordinator.js +0 -1
- package/dist/src/server/claude-session-support.js +0 -1
- package/dist/src/server/command-preset-defaults.js +0 -1
- package/dist/src/server/command-preset-store.js +0 -1
- package/dist/src/server/dispatch-ledger-serializer.js +0 -1
- package/dist/src/server/dispatch-ledger-store.js +0 -1
- package/dist/src/server/env-sync-message.js +0 -1
- package/dist/src/server/fs-browse.js +0 -1
- package/dist/src/server/fs-pick-folder.js +0 -1
- package/dist/src/server/fs-sandbox.js +0 -1
- package/dist/src/server/hive-team-guidance.d.ts +31 -0
- package/dist/src/server/hive-team-guidance.js +80 -1
- package/dist/src/server/http-errors.js +0 -1
- package/dist/src/server/live-run-registry.js +0 -1
- package/dist/src/server/local-request-guard.js +0 -1
- package/dist/src/server/message-log-store.js +0 -1
- package/dist/src/server/orchestrator-autostart.js +0 -1
- package/dist/src/server/orchestrator-launch.js +0 -1
- package/dist/src/server/package-version.js +0 -1
- package/dist/src/server/post-start-input-writer.js +0 -1
- package/dist/src/server/preset-launch-support.js +0 -1
- package/dist/src/server/pty-output-bus.js +0 -1
- package/dist/src/server/recovery-summary.js +0 -1
- package/dist/src/server/restart-policy-support.js +0 -1
- package/dist/src/server/restart-policy.js +0 -1
- package/dist/src/server/role-template-store.js +0 -1
- package/dist/src/server/role-templates.js +0 -1
- package/dist/src/server/route-helpers.js +0 -1
- package/dist/src/server/route-types.js +0 -1
- package/dist/src/server/routes-dispatches.js +0 -1
- package/dist/src/server/routes-fs.js +0 -1
- package/dist/src/server/routes-runtime.js +32 -1
- package/dist/src/server/routes-settings.js +0 -1
- package/dist/src/server/routes-tasks.js +0 -1
- package/dist/src/server/routes-team.js +0 -1
- package/dist/src/server/routes-ui.js +0 -1
- package/dist/src/server/routes-version.js +0 -1
- package/dist/src/server/routes-workspaces.js +0 -1
- package/dist/src/server/routes.js +0 -1
- package/dist/src/server/runtime-database.js +0 -1
- package/dist/src/server/runtime-message-builders.js +0 -1
- package/dist/src/server/runtime-restart-policy.js +0 -1
- package/dist/src/server/runtime-store-helpers.d.ts +10 -0
- package/dist/src/server/runtime-store-helpers.js +49 -9
- package/dist/src/server/runtime-store.d.ts +2 -0
- package/dist/src/server/runtime-store.js +8 -6
- package/dist/src/server/session-capture-claude.js +0 -1
- package/dist/src/server/session-capture-codex.d.ts +1 -0
- package/dist/src/server/session-capture-codex.js +38 -3
- package/dist/src/server/session-capture-gemini.js +0 -1
- package/dist/src/server/session-capture-opencode.js +0 -1
- package/dist/src/server/session-capture.js +0 -1
- package/dist/src/server/settings-store.js +0 -1
- package/dist/src/server/sqlite-schema-v10.js +0 -1
- package/dist/src/server/sqlite-schema-v11.js +0 -1
- package/dist/src/server/sqlite-schema-v12.js +0 -1
- package/dist/src/server/sqlite-schema-v13.js +0 -1
- package/dist/src/server/sqlite-schema-v14.js +0 -1
- package/dist/src/server/sqlite-schema-v15.js +0 -1
- package/dist/src/server/sqlite-schema-v16.js +0 -1
- package/dist/src/server/sqlite-schema-v17.js +0 -1
- package/dist/src/server/sqlite-schema-v18.js +0 -1
- package/dist/src/server/sqlite-schema-v5.js +0 -1
- package/dist/src/server/sqlite-schema-v7.js +0 -1
- package/dist/src/server/sqlite-schema-v8.js +0 -1
- package/dist/src/server/sqlite-schema-v9.js +0 -1
- package/dist/src/server/sqlite-schema.js +0 -1
- package/dist/src/server/startup-command-parser.js +0 -1
- package/dist/src/server/system-message.js +0 -1
- package/dist/src/server/tasks-file-watcher.js +2 -2
- package/dist/src/server/tasks-file.d.ts +10 -0
- package/dist/src/server/tasks-file.js +20 -1
- package/dist/src/server/tasks-websocket-server.js +0 -1
- package/dist/src/server/team-authz.js +0 -1
- package/dist/src/server/team-list-enrichment.js +0 -1
- package/dist/src/server/team-list-serializer.js +0 -1
- package/dist/src/server/team-operations.js +0 -1
- package/dist/src/server/terminal-flow-control.js +0 -1
- package/dist/src/server/terminal-protocol.js +0 -1
- package/dist/src/server/terminal-state-mirror.js +0 -1
- package/dist/src/server/terminal-stream-hub.js +0 -1
- package/dist/src/server/terminal-ws-server.js +0 -1
- package/dist/src/server/ui-auth-helpers.js +0 -1
- package/dist/src/server/ui-auth.js +0 -1
- package/dist/src/server/version-service.js +0 -1
- package/dist/src/server/worker-output-tracker.js +0 -1
- package/dist/src/server/workspace-path-validation.js +0 -1
- package/dist/src/server/workspace-shell-runtime.d.ts +29 -0
- package/dist/src/server/workspace-shell-runtime.js +179 -0
- package/dist/src/server/workspace-store-contract.js +0 -1
- package/dist/src/server/workspace-store-hydration.js +0 -1
- package/dist/src/server/workspace-store-mutations.js +0 -1
- package/dist/src/server/workspace-store-support.js +0 -1
- package/dist/src/server/workspace-store.js +0 -1
- package/dist/src/shared/types.js +0 -1
- package/package.json +1 -1
- package/web/dist/assets/index-DzIJktYZ.css +1 -0
- package/web/dist/assets/index-Fm7PMK8m.js +66 -0
- package/web/dist/index.html +7 -2
- 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/dist/src/cli/hive.js.map +0 -1
- package/dist/src/cli/team.js.map +0 -1
- package/dist/src/server/agent-command-resolver.js.map +0 -1
- package/dist/src/server/agent-launch-cache.js.map +0 -1
- package/dist/src/server/agent-launch-resolver.js.map +0 -1
- package/dist/src/server/agent-manager-support.js.map +0 -1
- package/dist/src/server/agent-manager.js.map +0 -1
- package/dist/src/server/agent-run-bootstrap.js.map +0 -1
- package/dist/src/server/agent-run-exit-handler.js.map +0 -1
- package/dist/src/server/agent-run-start-context.js.map +0 -1
- package/dist/src/server/agent-run-starter.js.map +0 -1
- package/dist/src/server/agent-run-store.js.map +0 -1
- package/dist/src/server/agent-run-sync.js.map +0 -1
- package/dist/src/server/agent-runtime-active-run.js.map +0 -1
- package/dist/src/server/agent-runtime-close.js.map +0 -1
- package/dist/src/server/agent-runtime-contract.js.map +0 -1
- package/dist/src/server/agent-runtime-flow-adapter.js.map +0 -1
- package/dist/src/server/agent-runtime-list-runs.js.map +0 -1
- package/dist/src/server/agent-runtime-ports.js.map +0 -1
- package/dist/src/server/agent-runtime-stop-run.js.map +0 -1
- package/dist/src/server/agent-runtime-types.js.map +0 -1
- package/dist/src/server/agent-runtime.js.map +0 -1
- package/dist/src/server/agent-session-store.js.map +0 -1
- package/dist/src/server/agent-startup-instructions.js.map +0 -1
- package/dist/src/server/agent-stdin-dispatcher.js.map +0 -1
- package/dist/src/server/agent-tokens.js.map +0 -1
- package/dist/src/server/app-state-store.js.map +0 -1
- package/dist/src/server/app.js.map +0 -1
- package/dist/src/server/claude-command-defaults.js.map +0 -1
- package/dist/src/server/claude-session-coordinator.js.map +0 -1
- package/dist/src/server/claude-session-support.js.map +0 -1
- package/dist/src/server/command-preset-defaults.js.map +0 -1
- package/dist/src/server/command-preset-store.js.map +0 -1
- package/dist/src/server/dispatch-ledger-serializer.js.map +0 -1
- package/dist/src/server/dispatch-ledger-store.js.map +0 -1
- package/dist/src/server/env-sync-message.js.map +0 -1
- package/dist/src/server/fs-browse.js.map +0 -1
- package/dist/src/server/fs-pick-folder.js.map +0 -1
- package/dist/src/server/fs-sandbox.js.map +0 -1
- package/dist/src/server/hive-team-guidance.js.map +0 -1
- package/dist/src/server/http-errors.js.map +0 -1
- package/dist/src/server/live-run-registry.js.map +0 -1
- package/dist/src/server/local-request-guard.js.map +0 -1
- package/dist/src/server/message-log-store.js.map +0 -1
- package/dist/src/server/orchestrator-autostart.js.map +0 -1
- package/dist/src/server/orchestrator-launch.js.map +0 -1
- package/dist/src/server/package-version.js.map +0 -1
- package/dist/src/server/post-start-input-writer.js.map +0 -1
- package/dist/src/server/preset-launch-support.js.map +0 -1
- package/dist/src/server/pty-output-bus.js.map +0 -1
- package/dist/src/server/recovery-summary.js.map +0 -1
- package/dist/src/server/restart-policy-support.js.map +0 -1
- package/dist/src/server/restart-policy.js.map +0 -1
- package/dist/src/server/role-template-store.js.map +0 -1
- package/dist/src/server/role-templates.js.map +0 -1
- package/dist/src/server/route-helpers.js.map +0 -1
- package/dist/src/server/route-types.js.map +0 -1
- package/dist/src/server/routes-dispatches.js.map +0 -1
- package/dist/src/server/routes-fs.js.map +0 -1
- package/dist/src/server/routes-runtime.js.map +0 -1
- package/dist/src/server/routes-settings.js.map +0 -1
- package/dist/src/server/routes-tasks.js.map +0 -1
- package/dist/src/server/routes-team.js.map +0 -1
- package/dist/src/server/routes-ui.js.map +0 -1
- package/dist/src/server/routes-version.js.map +0 -1
- package/dist/src/server/routes-workspaces.js.map +0 -1
- package/dist/src/server/routes.js.map +0 -1
- package/dist/src/server/runtime-database.js.map +0 -1
- package/dist/src/server/runtime-message-builders.js.map +0 -1
- package/dist/src/server/runtime-restart-policy.js.map +0 -1
- package/dist/src/server/runtime-store-helpers.js.map +0 -1
- package/dist/src/server/runtime-store.js.map +0 -1
- package/dist/src/server/session-capture-claude.js.map +0 -1
- package/dist/src/server/session-capture-codex.js.map +0 -1
- package/dist/src/server/session-capture-gemini.js.map +0 -1
- package/dist/src/server/session-capture-opencode.js.map +0 -1
- package/dist/src/server/session-capture.js.map +0 -1
- package/dist/src/server/settings-store.js.map +0 -1
- package/dist/src/server/sqlite-schema-v10.js.map +0 -1
- package/dist/src/server/sqlite-schema-v11.js.map +0 -1
- package/dist/src/server/sqlite-schema-v12.js.map +0 -1
- package/dist/src/server/sqlite-schema-v13.js.map +0 -1
- package/dist/src/server/sqlite-schema-v14.js.map +0 -1
- package/dist/src/server/sqlite-schema-v15.js.map +0 -1
- package/dist/src/server/sqlite-schema-v16.js.map +0 -1
- package/dist/src/server/sqlite-schema-v17.js.map +0 -1
- package/dist/src/server/sqlite-schema-v18.js.map +0 -1
- package/dist/src/server/sqlite-schema-v5.js.map +0 -1
- package/dist/src/server/sqlite-schema-v7.js.map +0 -1
- package/dist/src/server/sqlite-schema-v8.js.map +0 -1
- package/dist/src/server/sqlite-schema-v9.js.map +0 -1
- package/dist/src/server/sqlite-schema.js.map +0 -1
- package/dist/src/server/startup-command-parser.js.map +0 -1
- package/dist/src/server/system-message.js.map +0 -1
- package/dist/src/server/tasks-file-watcher.js.map +0 -1
- package/dist/src/server/tasks-file.js.map +0 -1
- package/dist/src/server/tasks-websocket-server.js.map +0 -1
- package/dist/src/server/team-authz.js.map +0 -1
- package/dist/src/server/team-list-enrichment.js.map +0 -1
- package/dist/src/server/team-list-serializer.js.map +0 -1
- package/dist/src/server/team-operations.js.map +0 -1
- package/dist/src/server/terminal-flow-control.js.map +0 -1
- package/dist/src/server/terminal-protocol.js.map +0 -1
- package/dist/src/server/terminal-state-mirror.js.map +0 -1
- package/dist/src/server/terminal-stream-hub.js.map +0 -1
- package/dist/src/server/terminal-ws-server.js.map +0 -1
- package/dist/src/server/ui-auth-helpers.js.map +0 -1
- package/dist/src/server/ui-auth.js.map +0 -1
- package/dist/src/server/version-service.js.map +0 -1
- package/dist/src/server/worker-output-tracker.js.map +0 -1
- package/dist/src/server/workspace-path-validation.js.map +0 -1
- package/dist/src/server/workspace-store-contract.js.map +0 -1
- package/dist/src/server/workspace-store-hydration.js.map +0 -1
- package/dist/src/server/workspace-store-mutations.js.map +0 -1
- package/dist/src/server/workspace-store-support.js.map +0 -1
- package/dist/src/server/workspace-store.js.map +0 -1
- package/dist/src/shared/types.js.map +0 -1
- package/web/dist/assets/index-B8F00qo4.css +0 -1
- package/web/dist/assets/index-DFE1Ia4e.js +0 -80
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { readFile } from 'node:fs/promises';
|
|
3
3
|
import chokidar from 'chokidar';
|
|
4
|
-
import { ensureTasksFile, getTasksFilePath } from './tasks-file.js';
|
|
4
|
+
import { ensureProtocolFile, ensureTasksFile, getTasksFilePath } from './tasks-file.js';
|
|
5
5
|
const DEBOUNCE_MS = 100;
|
|
6
6
|
export const createTasksFileWatcher = ({ onTasksUpdated, }) => {
|
|
7
7
|
const watchers = new Map();
|
|
@@ -38,6 +38,7 @@ export const createTasksFileWatcher = ({ onTasksUpdated, }) => {
|
|
|
38
38
|
start: async (workspaceId, workspacePath) => {
|
|
39
39
|
await stop(workspaceId);
|
|
40
40
|
ensureTasksFile(workspacePath);
|
|
41
|
+
ensureProtocolFile(workspacePath);
|
|
41
42
|
const watcher = chokidar.watch(getTasksFilePath(workspacePath), {
|
|
42
43
|
ignoreInitial: true,
|
|
43
44
|
});
|
|
@@ -57,4 +58,3 @@ export const createTasksFileWatcher = ({ onTasksUpdated, }) => {
|
|
|
57
58
|
stop,
|
|
58
59
|
};
|
|
59
60
|
};
|
|
60
|
-
//# sourceMappingURL=tasks-file-watcher.js.map
|
|
@@ -5,7 +5,17 @@ interface TasksFileService {
|
|
|
5
5
|
export declare const HIVE_DIR_NAME = ".hive";
|
|
6
6
|
export declare const TASKS_FILE_NAME = "tasks.md";
|
|
7
7
|
export declare const TASKS_RELATIVE_PATH = ".hive/tasks.md";
|
|
8
|
+
export declare const PROTOCOL_FILE_NAME = "PROTOCOL.md";
|
|
9
|
+
export declare const PROTOCOL_RELATIVE_PATH = ".hive/PROTOCOL.md";
|
|
8
10
|
export declare const getTasksFilePath: (workspacePath: string) => string;
|
|
11
|
+
export declare const getProtocolFilePath: (workspacePath: string) => string;
|
|
9
12
|
export declare const ensureTasksFile: (workspacePath: string) => string;
|
|
13
|
+
/**
|
|
14
|
+
* Always overwrites `.hive/PROTOCOL.md` with the freshly-built protocol doc.
|
|
15
|
+
* The doc is marked auto-generated so user edits are not expected; rewriting
|
|
16
|
+
* on every workspace open means a Hive version bump that changes the rules
|
|
17
|
+
* propagates without manual intervention.
|
|
18
|
+
*/
|
|
19
|
+
export declare const ensureProtocolFile: (workspacePath: string) => string;
|
|
10
20
|
export declare const createTasksFileService: () => TasksFileService;
|
|
11
21
|
export type { TasksFileService };
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { dirname, join } from 'node:path';
|
|
3
|
+
import { buildProtocolDoc } from './hive-team-guidance.js';
|
|
3
4
|
export const HIVE_DIR_NAME = '.hive';
|
|
4
5
|
export const TASKS_FILE_NAME = 'tasks.md';
|
|
5
6
|
export const TASKS_RELATIVE_PATH = `${HIVE_DIR_NAME}/${TASKS_FILE_NAME}`;
|
|
7
|
+
export const PROTOCOL_FILE_NAME = 'PROTOCOL.md';
|
|
8
|
+
export const PROTOCOL_RELATIVE_PATH = `${HIVE_DIR_NAME}/${PROTOCOL_FILE_NAME}`;
|
|
6
9
|
export const getTasksFilePath = (workspacePath) => join(workspacePath, HIVE_DIR_NAME, TASKS_FILE_NAME);
|
|
10
|
+
export const getProtocolFilePath = (workspacePath) => join(workspacePath, HIVE_DIR_NAME, PROTOCOL_FILE_NAME);
|
|
7
11
|
const getLegacyTasksFilePath = (workspacePath) => join(workspacePath, TASKS_FILE_NAME);
|
|
8
12
|
const ensureTasksDir = (workspacePath) => {
|
|
9
13
|
mkdirSync(dirname(getTasksFilePath(workspacePath)), { recursive: true });
|
|
@@ -19,6 +23,22 @@ export const ensureTasksFile = (workspacePath) => {
|
|
|
19
23
|
writeFileSync(tasksFilePath, content, 'utf8');
|
|
20
24
|
return content;
|
|
21
25
|
};
|
|
26
|
+
/**
|
|
27
|
+
* Always overwrites `.hive/PROTOCOL.md` with the freshly-built protocol doc.
|
|
28
|
+
* The doc is marked auto-generated so user edits are not expected; rewriting
|
|
29
|
+
* on every workspace open means a Hive version bump that changes the rules
|
|
30
|
+
* propagates without manual intervention.
|
|
31
|
+
*/
|
|
32
|
+
export const ensureProtocolFile = (workspacePath) => {
|
|
33
|
+
ensureTasksDir(workspacePath);
|
|
34
|
+
const protocolFilePath = getProtocolFilePath(workspacePath);
|
|
35
|
+
const desired = buildProtocolDoc();
|
|
36
|
+
const current = existsSync(protocolFilePath) ? readFileSync(protocolFilePath, 'utf8') : null;
|
|
37
|
+
if (current === desired)
|
|
38
|
+
return desired;
|
|
39
|
+
writeFileSync(protocolFilePath, desired, 'utf8');
|
|
40
|
+
return desired;
|
|
41
|
+
};
|
|
22
42
|
export const createTasksFileService = () => {
|
|
23
43
|
return {
|
|
24
44
|
readTasks(workspacePath) {
|
|
@@ -30,4 +50,3 @@ export const createTasksFileService = () => {
|
|
|
30
50
|
},
|
|
31
51
|
};
|
|
32
52
|
};
|
|
33
|
-
//# sourceMappingURL=tasks-file.js.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { WorkspaceSummary } from '../shared/types.js';
|
|
2
|
+
import type { AgentManager } from './agent-manager.js';
|
|
3
|
+
import type { LiveAgentRun } from './agent-runtime-types.js';
|
|
4
|
+
export declare const getWorkspaceShellAgentId: (workspaceId: string) => string;
|
|
5
|
+
export declare const isWorkspaceShellAgentId: (agentId: string) => boolean;
|
|
6
|
+
export declare const resolveWorkspaceShellLaunch: (env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform) => {
|
|
7
|
+
args: string[];
|
|
8
|
+
command: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const createWorkspaceShellRuntime: (agentManager: AgentManager | undefined) => {
|
|
11
|
+
close(): void;
|
|
12
|
+
closeRun(workspaceId: string, runId: string): boolean;
|
|
13
|
+
deleteWorkspace(workspaceId: string): void;
|
|
14
|
+
getLiveRun(runId: string): LiveAgentRun | undefined;
|
|
15
|
+
hasRun: (runId: string) => boolean;
|
|
16
|
+
listTerminalRuns(workspaceId: string): {
|
|
17
|
+
agent_id: string;
|
|
18
|
+
agent_name: string;
|
|
19
|
+
run_id: string;
|
|
20
|
+
status: import("./agent-manager.js").RunStatus;
|
|
21
|
+
}[];
|
|
22
|
+
pauseRun(runId: string): void;
|
|
23
|
+
resizeRun(runId: string, cols: number, rows: number): void;
|
|
24
|
+
resumeRun(runId: string): void;
|
|
25
|
+
start(workspace: WorkspaceSummary): Promise<LiveAgentRun>;
|
|
26
|
+
stopRun(runId: string): void;
|
|
27
|
+
writeInput(runId: string, text: string): void;
|
|
28
|
+
};
|
|
29
|
+
export type WorkspaceShellRuntime = ReturnType<typeof createWorkspaceShellRuntime>;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { basename } from 'node:path';
|
|
2
|
+
const WORKSPACE_SHELL_SUFFIX = ':shell';
|
|
3
|
+
export const getWorkspaceShellAgentId = (workspaceId) => `${workspaceId}${WORKSPACE_SHELL_SUFFIX}`;
|
|
4
|
+
export const isWorkspaceShellAgentId = (agentId) => agentId.endsWith(WORKSPACE_SHELL_SUFFIX);
|
|
5
|
+
const shouldUseLoginShell = (command) => {
|
|
6
|
+
const name = basename(command).toLowerCase();
|
|
7
|
+
return name === 'bash' || name === 'fish' || name === 'ksh' || name === 'zsh';
|
|
8
|
+
};
|
|
9
|
+
const getEnvValue = (env, key, platform) => {
|
|
10
|
+
if (platform !== 'win32')
|
|
11
|
+
return env[key];
|
|
12
|
+
const matched = Object.keys(env).find((item) => item.toLowerCase() === key.toLowerCase());
|
|
13
|
+
return matched ? env[matched] : undefined;
|
|
14
|
+
};
|
|
15
|
+
export const resolveWorkspaceShellLaunch = (env = process.env, platform = process.platform) => {
|
|
16
|
+
if (platform === 'win32')
|
|
17
|
+
return { command: getEnvValue(env, 'ComSpec', platform) ?? 'cmd.exe', args: [] };
|
|
18
|
+
const command = env.SHELL || '/bin/sh';
|
|
19
|
+
return { command, args: shouldUseLoginShell(command) ? ['-l'] : [] };
|
|
20
|
+
};
|
|
21
|
+
export const createWorkspaceShellRuntime = (agentManager) => {
|
|
22
|
+
const labelsByRunId = new Map();
|
|
23
|
+
const nextShellNumberByWorkspaceId = new Map();
|
|
24
|
+
const workspaceIdsByRunId = new Map();
|
|
25
|
+
const runIdsByWorkspaceId = new Map();
|
|
26
|
+
const startedAtByRunId = new Map();
|
|
27
|
+
const requireManager = () => {
|
|
28
|
+
if (!agentManager)
|
|
29
|
+
throw new Error('Agent manager is required for workspace shell terminals');
|
|
30
|
+
return agentManager;
|
|
31
|
+
};
|
|
32
|
+
const hasRun = (runId) => workspaceIdsByRunId.has(runId);
|
|
33
|
+
const toLiveRun = (runId) => {
|
|
34
|
+
try {
|
|
35
|
+
return {
|
|
36
|
+
...requireManager().getRun(runId),
|
|
37
|
+
startedAt: startedAtByRunId.get(runId) ?? Date.now(),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
detachRun(runId);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const detachRun = (runId) => {
|
|
46
|
+
const workspaceId = workspaceIdsByRunId.get(runId);
|
|
47
|
+
if (workspaceId) {
|
|
48
|
+
const retained = (runIdsByWorkspaceId.get(workspaceId) ?? []).filter((id) => id !== runId);
|
|
49
|
+
if (retained.length > 0)
|
|
50
|
+
runIdsByWorkspaceId.set(workspaceId, retained);
|
|
51
|
+
else
|
|
52
|
+
runIdsByWorkspaceId.delete(workspaceId);
|
|
53
|
+
}
|
|
54
|
+
labelsByRunId.delete(runId);
|
|
55
|
+
workspaceIdsByRunId.delete(runId);
|
|
56
|
+
startedAtByRunId.delete(runId);
|
|
57
|
+
};
|
|
58
|
+
const attachRun = (workspaceId, runId, label, startedAt) => {
|
|
59
|
+
labelsByRunId.set(runId, label);
|
|
60
|
+
workspaceIdsByRunId.set(runId, workspaceId);
|
|
61
|
+
startedAtByRunId.set(runId, startedAt);
|
|
62
|
+
runIdsByWorkspaceId.set(workspaceId, [...(runIdsByWorkspaceId.get(workspaceId) ?? []), runId]);
|
|
63
|
+
};
|
|
64
|
+
const nextLabel = (workspaceId) => {
|
|
65
|
+
const next = nextShellNumberByWorkspaceId.get(workspaceId) ?? 1;
|
|
66
|
+
nextShellNumberByWorkspaceId.set(workspaceId, next + 1);
|
|
67
|
+
return `Shell ${next}`;
|
|
68
|
+
};
|
|
69
|
+
const stopPtyRun = (runId) => {
|
|
70
|
+
requireManager().stopRun(runId);
|
|
71
|
+
};
|
|
72
|
+
const closeRun = (runId) => {
|
|
73
|
+
try {
|
|
74
|
+
stopPtyRun(runId);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// The shell may have already exited or been removed by the PTY manager.
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
requireManager().removeRun(runId);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// The PTY manager may have already dropped the run.
|
|
84
|
+
}
|
|
85
|
+
detachRun(runId);
|
|
86
|
+
};
|
|
87
|
+
return {
|
|
88
|
+
close() {
|
|
89
|
+
for (const runId of Array.from(workspaceIdsByRunId.keys()))
|
|
90
|
+
closeRun(runId);
|
|
91
|
+
runIdsByWorkspaceId.clear();
|
|
92
|
+
workspaceIdsByRunId.clear();
|
|
93
|
+
startedAtByRunId.clear();
|
|
94
|
+
labelsByRunId.clear();
|
|
95
|
+
nextShellNumberByWorkspaceId.clear();
|
|
96
|
+
},
|
|
97
|
+
closeRun(workspaceId, runId) {
|
|
98
|
+
if (workspaceIdsByRunId.get(runId) !== workspaceId)
|
|
99
|
+
return false;
|
|
100
|
+
closeRun(runId);
|
|
101
|
+
return true;
|
|
102
|
+
},
|
|
103
|
+
deleteWorkspace(workspaceId) {
|
|
104
|
+
for (const runId of Array.from(runIdsByWorkspaceId.get(workspaceId) ?? [])) {
|
|
105
|
+
try {
|
|
106
|
+
closeRun(runId);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Workspace deletion should not fail because the shell already exited.
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
runIdsByWorkspaceId.delete(workspaceId);
|
|
113
|
+
nextShellNumberByWorkspaceId.delete(workspaceId);
|
|
114
|
+
},
|
|
115
|
+
getLiveRun(runId) {
|
|
116
|
+
if (!hasRun(runId))
|
|
117
|
+
return undefined;
|
|
118
|
+
return toLiveRun(runId);
|
|
119
|
+
},
|
|
120
|
+
hasRun,
|
|
121
|
+
listTerminalRuns(workspaceId) {
|
|
122
|
+
return (runIdsByWorkspaceId.get(workspaceId) ?? []).flatMap((runId) => {
|
|
123
|
+
try {
|
|
124
|
+
const run = toLiveRun(runId);
|
|
125
|
+
return [
|
|
126
|
+
{
|
|
127
|
+
agent_id: getWorkspaceShellAgentId(workspaceId),
|
|
128
|
+
agent_name: labelsByRunId.get(runId) ?? 'Shell',
|
|
129
|
+
run_id: run.runId,
|
|
130
|
+
status: run.status,
|
|
131
|
+
},
|
|
132
|
+
];
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
},
|
|
139
|
+
pauseRun(runId) {
|
|
140
|
+
if (hasRun(runId))
|
|
141
|
+
requireManager().pauseRun(runId);
|
|
142
|
+
},
|
|
143
|
+
resizeRun(runId, cols, rows) {
|
|
144
|
+
if (hasRun(runId))
|
|
145
|
+
requireManager().resizeRun(runId, cols, rows);
|
|
146
|
+
},
|
|
147
|
+
resumeRun(runId) {
|
|
148
|
+
if (hasRun(runId))
|
|
149
|
+
requireManager().resumeRun(runId);
|
|
150
|
+
},
|
|
151
|
+
async start(workspace) {
|
|
152
|
+
const startedAt = Date.now();
|
|
153
|
+
const launch = resolveWorkspaceShellLaunch();
|
|
154
|
+
const run = await requireManager().startAgent({
|
|
155
|
+
agentId: getWorkspaceShellAgentId(workspace.id),
|
|
156
|
+
args: launch.args,
|
|
157
|
+
command: launch.command,
|
|
158
|
+
cwd: workspace.path,
|
|
159
|
+
env: {
|
|
160
|
+
COLORTERM: 'truecolor',
|
|
161
|
+
FORCE_COLOR: '1',
|
|
162
|
+
NO_COLOR: undefined,
|
|
163
|
+
TERM: 'xterm-256color',
|
|
164
|
+
TERM_PROGRAM: 'hive-shell',
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
attachRun(workspace.id, run.runId, nextLabel(workspace.id), startedAt);
|
|
168
|
+
return { ...run, startedAt };
|
|
169
|
+
},
|
|
170
|
+
stopRun(runId) {
|
|
171
|
+
if (hasRun(runId))
|
|
172
|
+
stopPtyRun(runId);
|
|
173
|
+
},
|
|
174
|
+
writeInput(runId, text) {
|
|
175
|
+
if (hasRun(runId))
|
|
176
|
+
requireManager().writeInput(runId, text);
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
};
|
package/dist/src/shared/types.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tt-a1i/hive",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "Browser-native hive-mind for CLI coding agents — Claude Code, Codex, Gemini, and OpenCode collaborate as real PTY processes via a team protocol.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@10.30.3",
|