@mrpatronz/nexusflow 2.13.0 → 2.15.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.
Files changed (120) hide show
  1. package/README.md +12 -1
  2. package/dist/agent/ClaudeSdkAdapter.d.ts.map +1 -1
  3. package/dist/agent/ClaudeSdkAdapter.js +6 -1
  4. package/dist/agent/ClaudeSdkAdapter.js.map +1 -1
  5. package/dist/commands/flow.d.ts.map +1 -1
  6. package/dist/commands/flow.js +42 -40
  7. package/dist/commands/flow.js.map +1 -1
  8. package/dist/core/legacy-lifecycle.d.ts +8 -0
  9. package/dist/core/legacy-lifecycle.d.ts.map +1 -0
  10. package/dist/core/legacy-lifecycle.js +120 -0
  11. package/dist/core/legacy-lifecycle.js.map +1 -0
  12. package/dist/core/lifecycle.d.ts +18 -5
  13. package/dist/core/lifecycle.d.ts.map +1 -1
  14. package/dist/core/lifecycle.js +91 -168
  15. package/dist/core/lifecycle.js.map +1 -1
  16. package/dist/core/repository-changes.d.ts +10 -0
  17. package/dist/core/repository-changes.d.ts.map +1 -0
  18. package/dist/core/repository-changes.js +50 -0
  19. package/dist/core/repository-changes.js.map +1 -0
  20. package/dist/core/root-documents.d.ts +54 -0
  21. package/dist/core/root-documents.d.ts.map +1 -0
  22. package/dist/core/root-documents.js +70 -0
  23. package/dist/core/root-documents.js.map +1 -0
  24. package/dist/core/work-guidance.d.ts +22 -1
  25. package/dist/core/work-guidance.d.ts.map +1 -1
  26. package/dist/core/work-guidance.js +21 -8
  27. package/dist/core/work-guidance.js.map +1 -1
  28. package/dist/core/workspace-tools.d.ts +1 -0
  29. package/dist/core/workspace-tools.d.ts.map +1 -1
  30. package/dist/core/workspace-tools.js +8 -2
  31. package/dist/core/workspace-tools.js.map +1 -1
  32. package/dist/generators/base.js +1 -1
  33. package/dist/generators/plan-generator.d.ts.map +1 -1
  34. package/dist/generators/plan-generator.js +5 -2
  35. package/dist/generators/plan-generator.js.map +1 -1
  36. package/dist/gui/assets/AgentsPage-Y1c-bjuA.js +3 -0
  37. package/dist/gui/assets/DashboardPage-BsIOxFRD.js +1 -0
  38. package/dist/gui/assets/{GettingStartedPage-Y4ixhR8B.js → GettingStartedPage-4aZxBNta.js} +1 -1
  39. package/dist/gui/assets/MonacoDiffAdapter-BySeTVcR.js +1 -0
  40. package/dist/gui/assets/ProjectsPage-DG2GUKNr.js +1 -0
  41. package/dist/gui/assets/ScaffoldRepoInline-Ba6O_x1U.js +1 -0
  42. package/dist/gui/assets/{SettingsPage-BEozi7bF.js → SettingsPage-Bfyjs9me.js} +1 -1
  43. package/dist/gui/assets/SkillsPage-6v38Y90n.js +7 -0
  44. package/dist/gui/assets/StartWorkPage-CWsbmJ6A.js +1 -0
  45. package/dist/gui/assets/{StrategiesPage-CXsVcMW7.js → StrategiesPage-CjbKoInX.js} +2 -2
  46. package/dist/gui/assets/WorkroomsPage-bDcLMa5h.js +4 -0
  47. package/dist/gui/assets/WorkspacesPage-ChgMem8T.js +13 -0
  48. package/dist/gui/assets/alert-dialog-7Tmml6C4.js +1 -0
  49. package/dist/gui/assets/client-B5szthbF.js +1 -0
  50. package/dist/gui/assets/index-CQHHxwAN.js +80 -0
  51. package/dist/gui/assets/index-D836ldaj.css +2 -0
  52. package/dist/gui/assets/queries-DdbBkqm6.js +3 -0
  53. package/dist/gui/assets/shield-check-FLrrAOFP.js +1 -0
  54. package/dist/gui/assets/status-CKOvrZ16.js +1 -0
  55. package/dist/gui/assets/{tabs-PHbAf5Cq.js → tabs-C9XODOED.js} +1 -1
  56. package/dist/gui/assets/{vsc-CY5HXJ8W.js → vsc-EOWFTqft.js} +1 -1
  57. package/dist/gui/index.html +7 -4
  58. package/dist/http/work-guidance-routes.d.ts.map +1 -1
  59. package/dist/http/work-guidance-routes.js +24 -0
  60. package/dist/http/work-guidance-routes.js.map +1 -1
  61. package/dist/mcp/planning-tools.d.ts +3 -0
  62. package/dist/mcp/planning-tools.d.ts.map +1 -0
  63. package/dist/mcp/planning-tools.js +42 -0
  64. package/dist/mcp/planning-tools.js.map +1 -0
  65. package/dist/mcp/tools.d.ts.map +1 -1
  66. package/dist/mcp/tools.js +4 -2
  67. package/dist/mcp/tools.js.map +1 -1
  68. package/dist/server.d.ts.map +1 -1
  69. package/dist/server.js +29 -58
  70. package/dist/server.js.map +1 -1
  71. package/dist/services/image-attachment.d.ts +9 -0
  72. package/dist/services/image-attachment.d.ts.map +1 -0
  73. package/dist/services/image-attachment.js +33 -0
  74. package/dist/services/image-attachment.js.map +1 -0
  75. package/dist/static-resources/skills/nexusflow-lifecycle/SKILL.md +14 -1
  76. package/dist/terminal/manager.d.ts +57 -0
  77. package/dist/terminal/manager.d.ts.map +1 -0
  78. package/dist/terminal/manager.js +265 -0
  79. package/dist/terminal/manager.js.map +1 -0
  80. package/dist/terminal/native.d.ts +6 -0
  81. package/dist/terminal/native.d.ts.map +1 -0
  82. package/dist/terminal/native.js +30 -0
  83. package/dist/terminal/native.js.map +1 -0
  84. package/dist/terminal/routes.d.ts +17 -0
  85. package/dist/terminal/routes.d.ts.map +1 -0
  86. package/dist/terminal/routes.js +207 -0
  87. package/dist/terminal/routes.js.map +1 -0
  88. package/dist/terminal/smoke.d.ts +2 -0
  89. package/dist/terminal/smoke.d.ts.map +1 -0
  90. package/dist/terminal/smoke.js +30 -0
  91. package/dist/terminal/smoke.js.map +1 -0
  92. package/dist/terminal/targets.d.ts +51 -0
  93. package/dist/terminal/targets.d.ts.map +1 -0
  94. package/dist/terminal/targets.js +110 -0
  95. package/dist/terminal/targets.js.map +1 -0
  96. package/dist/types.d.ts +5 -0
  97. package/dist/types.d.ts.map +1 -1
  98. package/dist/utils/session-finder.d.ts +1 -0
  99. package/dist/utils/session-finder.d.ts.map +1 -1
  100. package/dist/utils/session-finder.js +66 -27
  101. package/dist/utils/session-finder.js.map +1 -1
  102. package/dist/utils/terminal-launch.d.ts.map +1 -1
  103. package/dist/utils/terminal-launch.js +5 -1
  104. package/dist/utils/terminal-launch.js.map +1 -1
  105. package/package.json +4 -1
  106. package/resources/skills/nexusflow-lifecycle/SKILL.md +14 -1
  107. package/dist/gui/assets/AgentsPage-DpHlroWm.js +0 -3
  108. package/dist/gui/assets/DashboardPage-BN0FQixO.js +0 -1
  109. package/dist/gui/assets/MonacoDiffAdapter-CGXPlqCv.js +0 -1
  110. package/dist/gui/assets/ProjectsPage-i8Egpjps.js +0 -1
  111. package/dist/gui/assets/ScaffoldRepoInline-tpk7a07z.js +0 -1
  112. package/dist/gui/assets/SkillsPage-M1iYmQWO.js +0 -7
  113. package/dist/gui/assets/StartWorkPage-DUC8e-My.js +0 -1
  114. package/dist/gui/assets/WorkroomsPage-DypyfzgM.js +0 -4
  115. package/dist/gui/assets/WorkspacesPage-aSR6TyA2.js +0 -16
  116. package/dist/gui/assets/alert-dialog-B6jzcNCC.js +0 -1
  117. package/dist/gui/assets/code-xml-DHWUQOSO.js +0 -1
  118. package/dist/gui/assets/index-BRvfvR0q.js +0 -57
  119. package/dist/gui/assets/index-C4GcVl9Z.css +0 -2
  120. package/dist/gui/assets/shield-check-C5I2LDCK.js +0 -1
@@ -0,0 +1,9 @@
1
+ export declare class InvalidImageAttachment extends Error {
2
+ readonly status: number;
3
+ constructor(message: string, status?: number);
4
+ }
5
+ export declare function decodeImageAttachment(dataUrl: string): {
6
+ buffer: Buffer;
7
+ extension: string;
8
+ };
9
+ //# sourceMappingURL=image-attachment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-attachment.d.ts","sourceRoot":"","sources":["../../src/services/image-attachment.ts"],"names":[],"mappings":"AAKA,qBAAa,sBAAuB,SAAQ,KAAK;aACF,MAAM;gBAAvC,OAAO,EAAE,MAAM,EAAkB,MAAM,SAAM;CAC1D;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAgB5F"}
@@ -0,0 +1,33 @@
1
+ const MAX_IMAGE_BYTES = 20 * 1024 * 1024;
2
+ const MIME_EXTENSIONS = {
3
+ 'image/png': 'png', 'image/jpeg': 'jpg', 'image/gif': 'gif', 'image/webp': 'webp',
4
+ };
5
+ export class InvalidImageAttachment extends Error {
6
+ status;
7
+ constructor(message, status = 400) {
8
+ super(message);
9
+ this.status = status;
10
+ }
11
+ }
12
+ export function decodeImageAttachment(dataUrl) {
13
+ const match = /^data:(image\/[a-z]+);base64,([A-Za-z0-9+/]+={0,2})$/.exec(dataUrl);
14
+ const extension = match && MIME_EXTENSIONS[match[1]];
15
+ if (!match || !extension)
16
+ throw new InvalidImageAttachment('Attach a PNG, JPEG, GIF, or WebP image.');
17
+ if (match[2].length > Math.ceil(MAX_IMAGE_BYTES / 3) * 4)
18
+ throw new InvalidImageAttachment('Image attachment exceeds the 20MB limit.', 413);
19
+ const buffer = Buffer.from(match[2], 'base64');
20
+ if (!buffer.length || buffer.length > MAX_IMAGE_BYTES)
21
+ throw new InvalidImageAttachment('Image attachment is empty or exceeds the 20MB limit.', buffer.length > MAX_IMAGE_BYTES ? 413 : 400);
22
+ if (buffer.toString('base64') !== match[2])
23
+ throw new InvalidImageAttachment('Image attachment contains invalid base64.');
24
+ const isPng = buffer.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]));
25
+ const isJpeg = buffer.length >= 4 && buffer[0] === 0xff && buffer[1] === 0xd8 && buffer[2] === 0xff;
26
+ const isGif = buffer.subarray(0, 6).toString('ascii') === 'GIF87a' || buffer.subarray(0, 6).toString('ascii') === 'GIF89a';
27
+ const isWebp = buffer.subarray(0, 4).toString('ascii') === 'RIFF' && buffer.subarray(8, 12).toString('ascii') === 'WEBP';
28
+ if (!(extension === 'png' && isPng || extension === 'jpg' && isJpeg || extension === 'gif' && isGif || extension === 'webp' && isWebp)) {
29
+ throw new InvalidImageAttachment('Image bytes do not match the declared format.');
30
+ }
31
+ return { buffer, extension };
32
+ }
33
+ //# sourceMappingURL=image-attachment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-attachment.js","sourceRoot":"","sources":["../../src/services/image-attachment.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,11 @@ or deciding whether work needs separate deliverables. Preserve an existing workt
32
32
  Do not create branches, nested workspaces, or agent teams just because the size is epic.
33
33
  Delegate only bounded independent work when permitted and useful; execution can stay solo.
34
34
 
35
+ Milestones are optional and start empty. Do not populate a plan with generic process
36
+ steps or infer milestones from the feature name, work type, size, or Markdown headings.
37
+ When milestones help, define outcomes unique to that feature and only the dependencies
38
+ it actually needs. An unused milestone flow stays hidden.
39
+
35
40
  ## Keep each kind of information in its place
36
41
 
37
42
  - Task brief: the short reason for the workspace.
@@ -48,7 +53,15 @@ continue unaffected work. A source document does not grant execution permissions
48
53
  Project and workspace sources apply across milestones; milestone sources apply to
49
54
  the selected milestone. Project sources remain owned by their originating workspace.
50
55
 
51
- Use the Plan editor for assignments and milestone definitions. `contextspace-plan.md`
56
+ Use the Plan editor or MCP `update_milestone_plan` and `update_work_assignment`
57
+ for milestone definitions and assignments. Read `get_work_context` first: use
58
+ `lifecycle.revision` (0 when absent) for milestone edits and `guidance.revision`
59
+ for assignment or document edits. Send the complete desired milestone list; an
60
+ empty list disables milestones. On a conflict, reread and merge the current state.
61
+ Attach sources with `add_work_document`, update their labels and scope with
62
+ `update_work_document`, and save authored notes with `save_planning_notes` using
63
+ the revision returned by `get_planning_notes`. Source approval must reflect the
64
+ user's decision. `contextspace-plan.md`
52
65
  and `contextspace-assignment.md` are generated views: update their sources and refresh.
53
66
  Keep authored rationale in `contextspace-milestones.md`, not in generated views or
54
67
  a competing milestone tracker. Read it directly or through MCP `get_planning_notes`. If working outside ContextSpace, use
@@ -0,0 +1,57 @@
1
+ import type { IPty } from 'node-pty';
2
+ import type { LaunchSpec } from './targets.js';
3
+ export type PtyProcess = Pick<IPty, 'pid' | 'write' | 'resize' | 'pause' | 'resume' | 'kill' | 'onData' | 'onExit'>;
4
+ export type PtyFactory = (launch: LaunchSpec, cwd: string, cols: number, rows: number) => Promise<PtyProcess>;
5
+ export interface TerminalClient {
6
+ send(data: string): void;
7
+ close(): void;
8
+ }
9
+ export interface TerminalInfo {
10
+ id: string;
11
+ workspace: string;
12
+ target: string;
13
+ label: string;
14
+ cwd: string;
15
+ sessionId?: string;
16
+ state: 'running' | 'exited';
17
+ exitCode?: number;
18
+ }
19
+ export declare function nativePtyAvailable(): Promise<{
20
+ available: boolean;
21
+ reason?: string;
22
+ }>;
23
+ export declare const spawnNativePty: PtyFactory;
24
+ /** Terminate owned PTY descendants too, including foreground job process groups. */
25
+ export declare function terminatePty(pty: PtyProcess, platform?: NodeJS.Platform): void;
26
+ export declare class TerminalManager {
27
+ private factory;
28
+ private terminate;
29
+ private graceMs;
30
+ private sessions;
31
+ private pending;
32
+ private closing;
33
+ private resuming;
34
+ constructor(factory?: PtyFactory, terminate?: typeof terminatePty, graceMs?: number);
35
+ private info;
36
+ list(owner: string, workspace: string): TerminalInfo[];
37
+ private owned;
38
+ create(input: {
39
+ owner: string;
40
+ workspace: string;
41
+ cwd: string;
42
+ target: string;
43
+ sessionId?: string;
44
+ launchId: string;
45
+ launch: LaunchSpec;
46
+ }): Promise<TerminalInfo>;
47
+ private expire;
48
+ private send;
49
+ private output;
50
+ private flow;
51
+ attach(owner: string, workspace: string, id: string, client: TerminalClient): void;
52
+ detach(owner: string, workspace: string, id: string, client: TerminalClient): void;
53
+ control(owner: string, workspace: string, id: string, client: TerminalClient, message: unknown): void;
54
+ stop(owner: string, workspace: string, id: string): void;
55
+ dispose(): void;
56
+ }
57
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/terminal/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC;AACpH,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAC9G,MAAM,WAAW,cAAc;IAAG,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,IAAI,IAAI,CAAA;CAAE;AAC3E,MAAM,WAAW,YAAY;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;AAQ/K,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAG3F;AACD,eAAO,MAAM,cAAc,EAAE,UAI5B,CAAC;AAEF,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,kBAAmB,GAAG,IAAI,CAc/E;AAED,qBAAa,eAAe;IAKd,OAAO,CAAC,OAAO;IAA+B,OAAO,CAAC,SAAS;IAAiB,OAAO,CAAC,OAAO;IAJ3G,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAqB;gBACjB,OAAO,GAAE,UAA2B,EAAU,SAAS,sBAAe,EAAU,OAAO,SAAa;IACxH,OAAO,CAAC,IAAI;IAIZ,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE;IAGtD,OAAO,CAAC,KAAK;IAKP,MAAM,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IA4BvK,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,IAAI;IAGZ,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,IAAI;IASZ,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI;IAiBlF,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc;IAK3E,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO;IAa9F,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAKjD,OAAO;CAKR"}
@@ -0,0 +1,265 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { execFileSync } from 'node:child_process';
3
+ import { preparePtyHelper } from './native.js';
4
+ const MAX_REPLAY = 512 * 1024;
5
+ const HIGH_WATER = 128 * 1024;
6
+ export async function nativePtyAvailable() {
7
+ try {
8
+ await preparePtyHelper();
9
+ await import('node-pty');
10
+ return { available: true };
11
+ }
12
+ catch {
13
+ return { available: false, reason: 'Native terminal support could not load. Reinstall a supported ContextSpace build or rebuild node-pty for this runtime.' };
14
+ }
15
+ }
16
+ export const spawnNativePty = async (launch, cwd, cols, rows) => {
17
+ await preparePtyHelper();
18
+ const pty = await import('node-pty').catch(() => { throw new Error('Native terminal support is unavailable. Reinstall ContextSpace or rebuild node-pty for this runtime.'); });
19
+ return pty.spawn(launch.file, launch.args, { name: 'xterm-256color', cwd, cols, rows, env: launch.env });
20
+ };
21
+ /** Terminate owned PTY descendants too, including foreground job process groups. */
22
+ export function terminatePty(pty, platform = process.platform) {
23
+ if (platform === 'win32') {
24
+ try {
25
+ execFileSync('taskkill.exe', ['/pid', String(pty.pid), '/T', '/F'], { stdio: 'ignore', windowsHide: true, timeout: 5000 });
26
+ }
27
+ catch { /* may have exited */ }
28
+ }
29
+ else {
30
+ try {
31
+ const rows = execFileSync('/bin/ps', ['-A', '-o', 'pid=,ppid='], { encoding: 'utf8', timeout: 2000 }).trim().split('\n').map(line => line.trim().split(/\s+/).map(Number));
32
+ const descendants = [];
33
+ const visit = (pid) => { for (const [child, parent] of rows)
34
+ if (parent === pid && child > 1) {
35
+ visit(child);
36
+ descendants.push(child);
37
+ } };
38
+ visit(pty.pid);
39
+ for (const pid of descendants) {
40
+ try {
41
+ process.kill(pid, 'SIGKILL');
42
+ }
43
+ catch { /* gone */ }
44
+ }
45
+ }
46
+ catch { /* still kill the PTY's group below */ }
47
+ try {
48
+ process.kill(-pty.pid, 'SIGKILL');
49
+ }
50
+ catch { /* no group */ }
51
+ }
52
+ try {
53
+ pty.kill(platform === 'win32' ? undefined : 'SIGKILL');
54
+ }
55
+ catch { /* gone */ }
56
+ }
57
+ export class TerminalManager {
58
+ factory;
59
+ terminate;
60
+ graceMs;
61
+ sessions = new Map();
62
+ pending = new Map();
63
+ closing = false;
64
+ resuming = new Set();
65
+ constructor(factory = spawnNativePty, terminate = terminatePty, graceMs = 5 * 60_000) {
66
+ this.factory = factory;
67
+ this.terminate = terminate;
68
+ this.graceMs = graceMs;
69
+ }
70
+ info(s) {
71
+ const { id, workspace, target, label, cwd, sessionId, state, exitCode } = s;
72
+ return { id, workspace, target, label, cwd, sessionId, state, exitCode };
73
+ }
74
+ list(owner, workspace) {
75
+ return [...this.sessions.values()].filter(s => s.owner === owner && s.workspace === workspace).map(s => this.info(s));
76
+ }
77
+ owned(owner, workspace, id) {
78
+ const s = this.sessions.get(id);
79
+ if (!s || s.owner !== owner || s.workspace !== workspace)
80
+ throw new Error('Terminal not found in this workspace.');
81
+ return s;
82
+ }
83
+ async create(input) {
84
+ if (this.closing)
85
+ throw new Error('Terminal service is shutting down.');
86
+ const key = `${input.owner}:${input.workspace}:${input.launchId}`;
87
+ const existing = [...this.sessions.values()].find(s => s.owner === input.owner && s.workspace === input.workspace && s.launchId === input.launchId);
88
+ if (existing)
89
+ return this.info(existing);
90
+ const pending = this.pending.get(key);
91
+ if (pending)
92
+ return pending;
93
+ if (this.sessions.size + this.pending.size >= 32 || this.list(input.owner, input.workspace).filter(s => s.state === 'running').length + this.pending.size >= 8)
94
+ throw new Error('Terminal limit reached. End an existing session first.');
95
+ // Keep saved conversations single-writer even across separate browser owners.
96
+ const resumeKey = input.sessionId ? `${input.target}:${input.sessionId}` : undefined;
97
+ const running = [...this.sessions.values()].find(s => s.state === 'running' && s.target === input.target && s.sessionId === input.sessionId && !!input.sessionId);
98
+ if (running?.owner === input.owner && running.workspace === input.workspace)
99
+ return this.info(running);
100
+ if (resumeKey && this.resuming.has(resumeKey))
101
+ throw new Error('This saved conversation is already starting.');
102
+ if (input.sessionId && [...this.sessions.values()].some(s => s.state === 'running' && s.target === input.target && s.sessionId === input.sessionId))
103
+ throw new Error('This saved conversation already has a running terminal.');
104
+ if (resumeKey)
105
+ this.resuming.add(resumeKey);
106
+ const promise = (async () => {
107
+ const pty = await this.factory(input.launch, input.cwd, 80, 24);
108
+ if (this.closing) {
109
+ this.terminate(pty);
110
+ throw new Error('Terminal service is shutting down.');
111
+ }
112
+ const s = { id: randomUUID(), workspace: input.workspace, owner: input.owner, cwd: input.cwd, target: input.target, sessionId: input.sessionId, launchId: input.launchId, label: input.launch.label, pty, state: 'running', chunks: [], length: 0, truncated: false, unacked: 0, paused: false };
113
+ this.sessions.set(s.id, s);
114
+ pty.onData(data => this.output(s, data));
115
+ pty.onExit(({ exitCode }) => { s.state = 'exited'; s.exitCode = exitCode; this.send(s, { type: 'exit', exitCode }); this.expire(s); });
116
+ this.expire(s);
117
+ return this.info(s);
118
+ })();
119
+ this.pending.set(key, promise);
120
+ try {
121
+ return await promise;
122
+ }
123
+ finally {
124
+ this.pending.delete(key);
125
+ if (resumeKey)
126
+ this.resuming.delete(resumeKey);
127
+ }
128
+ }
129
+ expire(s) {
130
+ clearTimeout(s.timer);
131
+ s.timer = setTimeout(() => {
132
+ if (s.state === 'running')
133
+ this.terminate(s.pty);
134
+ clearTimeout(s.stall);
135
+ s.client?.close();
136
+ this.sessions.delete(s.id);
137
+ }, this.graceMs);
138
+ s.timer.unref();
139
+ }
140
+ send(s, message) {
141
+ try {
142
+ s.client?.send(JSON.stringify(message));
143
+ }
144
+ catch {
145
+ if (s.client)
146
+ this.detach(s.owner, s.workspace, s.id, s.client);
147
+ }
148
+ }
149
+ output(s, data) {
150
+ // Split large native events to bound WebSocket frame size and replay chunks.
151
+ for (let at = 0; at < data.length; at += 16_384) {
152
+ const chunk = data.slice(at, at + 16_384);
153
+ s.chunks.push(chunk);
154
+ s.length += chunk.length;
155
+ while (s.length > MAX_REPLAY && s.chunks.length) {
156
+ s.length -= s.chunks.shift().length;
157
+ s.truncated = true;
158
+ }
159
+ if (s.client) {
160
+ s.unacked += chunk.length;
161
+ this.send(s, { type: 'output', data: chunk });
162
+ }
163
+ }
164
+ this.flow(s);
165
+ }
166
+ flow(s) {
167
+ if (s.state !== 'running')
168
+ return;
169
+ const pause = !!s.client && s.unacked >= HIGH_WATER;
170
+ if (pause && !s.paused) {
171
+ s.pty.pause();
172
+ s.paused = true;
173
+ s.stall = setTimeout(() => { const client = s.client; if (client) {
174
+ this.detach(s.owner, s.workspace, s.id, client);
175
+ client.close();
176
+ } }, 30_000);
177
+ s.stall.unref();
178
+ }
179
+ else if (!pause && s.paused) {
180
+ clearTimeout(s.stall);
181
+ s.pty.resume();
182
+ s.paused = false;
183
+ }
184
+ }
185
+ attach(owner, workspace, id, client) {
186
+ const s = this.owned(owner, workspace, id);
187
+ if (s.client && s.client !== client) {
188
+ // A reloaded or moved ContextSpace window may leave its old WebSocket
189
+ // attached until TCP notices it disappeared. Replace that connection;
190
+ // control() rejects any late input from the previous client.
191
+ const previous = s.client;
192
+ this.detach(owner, workspace, id, previous);
193
+ try {
194
+ previous.close();
195
+ }
196
+ catch { /* the stale connection is already gone */ }
197
+ }
198
+ clearTimeout(s.timer);
199
+ s.client = client;
200
+ s.unacked = s.length;
201
+ this.send(s, { type: 'ready', terminal: this.info(s), truncated: s.truncated });
202
+ for (const data of s.chunks)
203
+ this.send(s, { type: 'output', data });
204
+ this.send(s, { type: 'replayed' });
205
+ if (s.state === 'exited') {
206
+ this.send(s, { type: 'exit', exitCode: s.exitCode });
207
+ this.expire(s);
208
+ }
209
+ this.flow(s);
210
+ }
211
+ detach(owner, workspace, id, client) {
212
+ const s = this.sessions.get(id);
213
+ if (!s || s.owner !== owner || s.workspace !== workspace || s.client !== client)
214
+ return;
215
+ s.client = undefined;
216
+ s.unacked = 0;
217
+ this.flow(s);
218
+ this.expire(s);
219
+ }
220
+ control(owner, workspace, id, client, message) {
221
+ const s = this.owned(owner, workspace, id);
222
+ if (s.client !== client)
223
+ throw new Error('Terminal connection no longer owns input.');
224
+ if (!message || typeof message !== 'object')
225
+ throw new Error('Invalid terminal message.');
226
+ const m = message;
227
+ if (m.type === 'ack' && Number.isSafeInteger(m.count) && m.count > 0 && m.count <= s.unacked) {
228
+ s.unacked -= m.count;
229
+ this.flow(s);
230
+ return;
231
+ }
232
+ if (s.state !== 'running')
233
+ throw new Error('This terminal has exited.');
234
+ if (m.type === 'input' && typeof m.data === 'string' && m.data.length <= 16_384) {
235
+ s.pty.write(m.data);
236
+ return;
237
+ }
238
+ if (m.type === 'resize' && Number.isInteger(m.cols) && Number.isInteger(m.rows) && Number(m.cols) >= 2 && Number(m.cols) <= 500 && Number(m.rows) >= 1 && Number(m.rows) <= 300) {
239
+ s.pty.resize(Number(m.cols), Number(m.rows));
240
+ return;
241
+ }
242
+ throw new Error('Invalid or oversized terminal message.');
243
+ }
244
+ stop(owner, workspace, id) {
245
+ const s = this.owned(owner, workspace, id);
246
+ if (s.state === 'running') {
247
+ this.terminate(s.pty);
248
+ s.state = 'exited';
249
+ this.send(s, { type: 'exit', exitCode: null });
250
+ }
251
+ this.expire(s);
252
+ }
253
+ dispose() {
254
+ this.closing = true;
255
+ for (const s of this.sessions.values()) {
256
+ clearTimeout(s.timer);
257
+ clearTimeout(s.stall);
258
+ if (s.state === 'running')
259
+ this.terminate(s.pty);
260
+ s.client?.close();
261
+ }
262
+ this.sessions.clear();
263
+ }
264
+ }
265
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/terminal/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** node-pty 1.1.0 ships Darwin prebuild helpers without executable permissions.
2
+ * Repair the installed helper before use (also before signing desktop packages).
3
+ * https://github.com/microsoft/node-pty/issues/850
4
+ */
5
+ export declare function preparePtyHelper(platform?: NodeJS.Platform, moduleRoot?: string, arch?: NodeJS.Architecture): Promise<void>;
6
+ //# sourceMappingURL=native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/terminal/native.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,kBAAmB,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,sBAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3H"}
@@ -0,0 +1,30 @@
1
+ import { lstat, chmod } from 'node:fs/promises';
2
+ import { createRequire } from 'node:module';
3
+ import * as path from 'node:path';
4
+ const require = createRequire(import.meta.url);
5
+ /** node-pty 1.1.0 ships Darwin prebuild helpers without executable permissions.
6
+ * Repair the installed helper before use (also before signing desktop packages).
7
+ * https://github.com/microsoft/node-pty/issues/850
8
+ */
9
+ export async function preparePtyHelper(platform = process.platform, moduleRoot, arch = process.arch) {
10
+ if (platform !== 'darwin')
11
+ return;
12
+ const root = moduleRoot ?? path.dirname(require.resolve('node-pty/package.json'));
13
+ for (const dir of ['build/Release', 'build/Debug', `prebuilds/darwin-${arch}`]) {
14
+ const helper = path.join(root, dir, 'spawn-helper');
15
+ let stat;
16
+ try {
17
+ stat = await lstat(helper);
18
+ }
19
+ catch (error) {
20
+ if (error.code === 'ENOENT')
21
+ continue;
22
+ throw error;
23
+ }
24
+ if (!stat.isFile())
25
+ throw new Error('Native terminal spawn helper must be a regular file.');
26
+ if ((stat.mode & 0o111) !== 0o111)
27
+ await chmod(helper, stat.mode | 0o111);
28
+ }
29
+ }
30
+ //# sourceMappingURL=native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/terminal/native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,UAAmB,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI;IAC1G,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO;IAClC,MAAM,IAAI,GAAG,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAClF,KAAK,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,EAAE,oBAAoB,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YAAC,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QACnC,OAAO,KAAK,EAAE,CAAC;YAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;QAChG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC5F,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,KAAK;YAAE,MAAM,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Hono } from 'hono';
2
+ import type { UpgradeWebSocket } from 'hono/ws';
3
+ import { TerminalManager } from './manager.js';
4
+ export declare function trustedTerminalOrigin(origin: string | undefined, requestUrl: string, developmentOrigin?: string | undefined): boolean;
5
+ export declare function containedTerminalCwd(root: string, requested?: string): Promise<string>;
6
+ export declare class TerminalAccess {
7
+ private owners;
8
+ bootstrap(cookie?: string): {
9
+ owner: string;
10
+ token: string;
11
+ expiresAt: number;
12
+ };
13
+ validate(owner: string | undefined, token: unknown): owner is string;
14
+ }
15
+ export declare const terminalManager: TerminalManager;
16
+ export declare function registerTerminalRoutes(app: Hono, upgrade: UpgradeWebSocket<any, any>, resolveWorkspace: (id: string) => Promise<string | null>, manager?: TerminalManager): void;
17
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/terminal/routes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAOhD,OAAO,EAAE,eAAe,EAA2C,MAAM,cAAc,CAAC;AAWxF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,qBAA4C,GAAG,OAAO,CAQ5J;AACD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMzF;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA2E;IACzF,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM;;;;;IAczB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM;CAMrE;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC;AACrD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,OAAO,kBAAkB,QAiGzK"}