wicked-crew 0.5.0 → 0.6.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 (116) hide show
  1. package/dist/api/audit.d.ts +57 -0
  2. package/dist/api/audit.d.ts.map +1 -0
  3. package/dist/api/audit.js +115 -0
  4. package/dist/api/audit.js.map +1 -0
  5. package/dist/api/auth.d.ts +192 -0
  6. package/dist/api/auth.d.ts.map +1 -0
  7. package/dist/api/auth.js +515 -0
  8. package/dist/api/auth.js.map +1 -0
  9. package/dist/api/gate-cache.d.ts +8 -0
  10. package/dist/api/gate-cache.d.ts.map +1 -1
  11. package/dist/api/gate-cache.js +10 -0
  12. package/dist/api/gate-cache.js.map +1 -1
  13. package/dist/api/open-path.d.ts +18 -0
  14. package/dist/api/open-path.d.ts.map +1 -0
  15. package/dist/api/open-path.js +79 -0
  16. package/dist/api/open-path.js.map +1 -0
  17. package/dist/api/routes.d.ts +112 -1
  18. package/dist/api/routes.d.ts.map +1 -1
  19. package/dist/api/routes.js +435 -16
  20. package/dist/api/routes.js.map +1 -1
  21. package/dist/api/seat-health.d.ts +55 -0
  22. package/dist/api/seat-health.d.ts.map +1 -0
  23. package/dist/api/seat-health.js +273 -0
  24. package/dist/api/seat-health.js.map +1 -0
  25. package/dist/api/seat-signin.d.ts +27 -0
  26. package/dist/api/seat-signin.d.ts.map +1 -0
  27. package/dist/api/seat-signin.js +143 -0
  28. package/dist/api/seat-signin.js.map +1 -0
  29. package/dist/api/server.d.ts +111 -3
  30. package/dist/api/server.d.ts.map +1 -1
  31. package/dist/api/server.js +236 -11
  32. package/dist/api/server.js.map +1 -1
  33. package/dist/cli/index.js +97 -3
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/cli/mcp.d.ts +14 -0
  36. package/dist/cli/mcp.d.ts.map +1 -0
  37. package/dist/cli/mcp.js +119 -0
  38. package/dist/cli/mcp.js.map +1 -0
  39. package/dist/core/adapter.d.ts +64 -1
  40. package/dist/core/adapter.d.ts.map +1 -1
  41. package/dist/core/adapter.js +162 -4
  42. package/dist/core/adapter.js.map +1 -1
  43. package/dist/core/types.d.ts +23 -361
  44. package/dist/core/types.d.ts.map +1 -1
  45. package/dist/core/types.js +11 -4
  46. package/dist/core/types.js.map +1 -1
  47. package/dist/interactive/bridge-pool.d.ts +71 -0
  48. package/dist/interactive/bridge-pool.d.ts.map +1 -0
  49. package/dist/interactive/bridge-pool.js +187 -0
  50. package/dist/interactive/bridge-pool.js.map +1 -0
  51. package/dist/interactive/bridge-root.d.ts +36 -0
  52. package/dist/interactive/bridge-root.d.ts.map +1 -0
  53. package/dist/interactive/bridge-root.js +48 -0
  54. package/dist/interactive/bridge-root.js.map +1 -0
  55. package/dist/interactive/draft-events.d.ts +144 -0
  56. package/dist/interactive/draft-events.d.ts.map +1 -0
  57. package/dist/interactive/draft-events.js +490 -0
  58. package/dist/interactive/draft-events.js.map +1 -0
  59. package/dist/interactive/edit-events.d.ts +172 -0
  60. package/dist/interactive/edit-events.d.ts.map +1 -0
  61. package/dist/interactive/edit-events.js +530 -0
  62. package/dist/interactive/edit-events.js.map +1 -0
  63. package/dist/interactive/ledger.d.ts +39 -0
  64. package/dist/interactive/ledger.d.ts.map +1 -0
  65. package/dist/interactive/ledger.js +93 -0
  66. package/dist/interactive/ledger.js.map +1 -0
  67. package/dist/interactive/proxy-routes.d.ts +39 -0
  68. package/dist/interactive/proxy-routes.d.ts.map +1 -0
  69. package/dist/interactive/proxy-routes.js +189 -0
  70. package/dist/interactive/proxy-routes.js.map +1 -0
  71. package/dist/interactive/ws-relay.d.ts +85 -0
  72. package/dist/interactive/ws-relay.d.ts.map +1 -0
  73. package/dist/interactive/ws-relay.js +191 -0
  74. package/dist/interactive/ws-relay.js.map +1 -0
  75. package/dist/projects/activity.d.ts +29 -0
  76. package/dist/projects/activity.d.ts.map +1 -0
  77. package/dist/projects/activity.js +172 -0
  78. package/dist/projects/activity.js.map +1 -0
  79. package/dist/projects/charter.d.ts +28 -0
  80. package/dist/projects/charter.d.ts.map +1 -0
  81. package/dist/projects/charter.js +53 -0
  82. package/dist/projects/charter.js.map +1 -0
  83. package/dist/projects/events.d.ts +55 -0
  84. package/dist/projects/events.d.ts.map +1 -0
  85. package/dist/projects/events.js +141 -0
  86. package/dist/projects/events.js.map +1 -0
  87. package/dist/projects/membership-index.d.ts +25 -0
  88. package/dist/projects/membership-index.d.ts.map +1 -0
  89. package/dist/projects/membership-index.js +46 -0
  90. package/dist/projects/membership-index.js.map +1 -0
  91. package/dist/projects/routes.d.ts +90 -0
  92. package/dist/projects/routes.d.ts.map +1 -0
  93. package/dist/projects/routes.js +388 -0
  94. package/dist/projects/routes.js.map +1 -0
  95. package/dist/projects/settings.d.ts +32 -0
  96. package/dist/projects/settings.d.ts.map +1 -0
  97. package/dist/projects/settings.js +64 -0
  98. package/dist/projects/settings.js.map +1 -0
  99. package/dist/qe/acceptance.d.ts +137 -0
  100. package/dist/qe/acceptance.d.ts.map +1 -0
  101. package/dist/qe/acceptance.js +249 -0
  102. package/dist/qe/acceptance.js.map +1 -0
  103. package/dist/qe/gate-events.d.ts +111 -0
  104. package/dist/qe/gate-events.d.ts.map +1 -0
  105. package/dist/qe/gate-events.js +168 -0
  106. package/dist/qe/gate-events.js.map +1 -0
  107. package/dist/qe/ledger.d.ts +100 -0
  108. package/dist/qe/ledger.d.ts.map +1 -0
  109. package/dist/qe/ledger.js +154 -0
  110. package/dist/qe/ledger.js.map +1 -0
  111. package/dist/studio/assets/index-CCwXa1cn.js +428 -0
  112. package/dist/studio/assets/index-HWxo0h41.css +32 -0
  113. package/dist/studio/index.html +2 -2
  114. package/package.json +10 -4
  115. package/dist/studio/assets/index-DaaUU8Ep.css +0 -32
  116. package/dist/studio/assets/index-Fu5DRC00.js +0 -423
@@ -0,0 +1,79 @@
1
+ // POST /open (crew#273): open a file/folder with the OS default application, daemon-side.
2
+ //
3
+ // The studio is a browser SPA and cannot spawn a process, so the open MUST happen here — which is
4
+ // exactly why the path is validated against known roots first (the run's workdir / extra write
5
+ // roots, registered repo roots) and the opener is spawned with the path as a single argv element,
6
+ // never through a shell string. There is no injection surface: `open`/`xdg-open`/`cmd /c start`
7
+ // receive the path verbatim as one argument.
8
+ import { spawn } from 'node:child_process';
9
+ import { realpathSync } from 'node:fs';
10
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
11
+ /**
12
+ * Is `target` inside `root` (or `root` itself), after normalization? Traversal-safe: the check is
13
+ * on the RESOLVED relative path's first segment, so `/root/../evil` never passes, and a sibling
14
+ * whose name merely starts with dots (`/a/..hidden`) is not wrongly excluded.
15
+ */
16
+ export function isInsideRoot(root, target) {
17
+ // Symlink-safe (Copilot, PR#279): containment is judged on REAL paths, or a
18
+ // `<root>/symlink-to-outside` opens a file the validation never looked at. A missing
19
+ // leaf resolves through its deepest EXISTING ancestor (never a bare lexical fallback:
20
+ // on macOS the tmpdir itself sits under the /var → /private/var symlink, and a lexical
21
+ // fallback on one side of the comparison would break containment for real children).
22
+ // Only ENOENT falls to the ancestor walk; any OTHER filesystem error (EACCES, ELOOP, …)
23
+ // fails CLOSED — an unresolvable-but-existing path must not be judged lexically (Copilot).
24
+ const real = (p) => {
25
+ const abs = resolve(p);
26
+ try {
27
+ return realpathSync(abs);
28
+ }
29
+ catch (err) {
30
+ if (err.code !== 'ENOENT')
31
+ return null;
32
+ const parent = dirname(abs);
33
+ if (parent === abs)
34
+ return abs;
35
+ const rp = real(parent);
36
+ return rp === null ? null : join(rp, basename(abs));
37
+ }
38
+ };
39
+ const realRoot = real(root);
40
+ const realTarget = real(target);
41
+ if (realRoot === null || realTarget === null)
42
+ return false;
43
+ const rel = relative(realRoot, realTarget);
44
+ if (rel === '')
45
+ return true; // the root itself
46
+ if (isAbsolute(rel))
47
+ return false; // different drive/tree entirely (win32)
48
+ return rel.split(sep)[0] !== '..';
49
+ }
50
+ /** The platform's opener invocation. Exported for tests; args are always a real argv array. */
51
+ export function platformOpenCommand(target) {
52
+ switch (process.platform) {
53
+ case 'darwin':
54
+ return { cmd: 'open', args: [target] };
55
+ case 'win32':
56
+ // `start` is a cmd builtin; the empty string is start's window-title slot so the path is
57
+ // never mistaken for a title. Still an argv array — no shell string is ever composed.
58
+ return { cmd: 'cmd', args: ['/c', 'start', '', target] };
59
+ default:
60
+ return { cmd: 'xdg-open', args: [target] };
61
+ }
62
+ }
63
+ /**
64
+ * Spawn the platform opener, detached, and resolve on SPAWN success (the OS accepted the process —
65
+ * what the opener then does with the path is the desktop environment's business). Rejects when the
66
+ * opener binary itself cannot be spawned, which the route reports as 502.
67
+ */
68
+ export function openWithSystemDefault(target) {
69
+ const { cmd, args } = platformOpenCommand(target);
70
+ return new Promise((resolvePromise, rejectPromise) => {
71
+ const child = spawn(cmd, args, { detached: true, stdio: 'ignore' });
72
+ child.once('error', rejectPromise);
73
+ child.once('spawn', () => {
74
+ child.unref();
75
+ resolvePromise();
76
+ });
77
+ });
78
+ }
79
+ //# sourceMappingURL=open-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-path.js","sourceRoot":"","sources":["../../src/api/open-path.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,122 @@
1
1
  import type { FastifyInstance } from 'fastify';
2
+ import { z } from 'zod';
2
3
  import { CoreAdapter } from '../core/adapter.js';
3
4
  import type { GateCache } from './gate-cache.js';
4
5
  import type { ElicitationCache } from './elicitation-cache.js';
6
+ import { QeGateCache } from '../qe/gate-events.js';
7
+ import { SeatHealthTracker } from './seat-health.js';
8
+ import { type ProjectRoutesDeps } from '../projects/routes.js';
9
+ import { InteractiveBridgePool } from '../interactive/bridge-pool.js';
10
+ import { AuditLog } from './audit.js';
11
+ import { type AuthMode } from './auth.js';
5
12
  export { API_PREFIX } from './api-prefix.js';
13
+ /**
14
+ * The launch body. Every field but `problem` is optional, which is what made stripping dangerous:
15
+ * omitting one is a legitimate request that gets an engine default, so a MISSPELLED one was
16
+ * indistinguishable from an omitted one and the run went ahead on a configuration the caller never
17
+ * asked for (FINDING-031).
18
+ *
19
+ * The names differ from core's on purpose and this is the trap worth knowing about: core's
20
+ * `LaunchSpec` takes `clis` (an array) and `workflow`, this takes `clisJson` (a JSON *string*) and
21
+ * `workflow`, and the `/ws` `sessionStarted` frame reports the chosen workflow as `workflowId`. A
22
+ * caller who reads the event stream to learn the field names arrives at `workflowId`, which this
23
+ * schema does not accept — so `.strict()` is what turns that trip into a 400 instead of an
24
+ * unworkflowed run reported as `201`.
25
+ */
26
+ export declare const LaunchSchema: z.ZodObject<{
27
+ problem: z.ZodString;
28
+ sessionId: z.ZodOptional<z.ZodString>;
29
+ clisJson: z.ZodOptional<z.ZodString>;
30
+ entityMode: z.ZodOptional<z.ZodEnum<["shared", "isolated"]>>;
31
+ humanConfirm: z.ZodOptional<z.ZodString>;
32
+ repoRef: z.ZodOptional<z.ZodString>;
33
+ workflow: z.ZodOptional<z.ZodString>;
34
+ /** DES-PROJECT-001 §2.2 — file the run into a project; membership attaches atomically with
35
+ * the launch record. Unknown/archived ⇒ the launch fails (never a silent unfiled run). */
36
+ projectId: z.ZodOptional<z.ZodString>;
37
+ }, "strict", z.ZodTypeAny, {
38
+ problem: string;
39
+ projectId?: string | undefined;
40
+ sessionId?: string | undefined;
41
+ clisJson?: string | undefined;
42
+ entityMode?: "shared" | "isolated" | undefined;
43
+ humanConfirm?: string | undefined;
44
+ repoRef?: string | undefined;
45
+ workflow?: string | undefined;
46
+ }, {
47
+ problem: string;
48
+ projectId?: string | undefined;
49
+ sessionId?: string | undefined;
50
+ clisJson?: string | undefined;
51
+ entityMode?: "shared" | "isolated" | undefined;
52
+ humanConfirm?: string | undefined;
53
+ repoRef?: string | undefined;
54
+ workflow?: string | undefined;
55
+ }>;
56
+ export declare const GateSchema: z.ZodObject<{
57
+ approve: z.ZodBoolean;
58
+ amend: z.ZodOptional<z.ZodString>;
59
+ }, "strict", z.ZodTypeAny, {
60
+ approve: boolean;
61
+ amend?: string | undefined;
62
+ }, {
63
+ approve: boolean;
64
+ amend?: string | undefined;
65
+ }>;
66
+ export declare const OpenTerminalSchema: z.ZodObject<{
67
+ cwd: z.ZodString;
68
+ cmd: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
69
+ cols: z.ZodNumber;
70
+ rows: z.ZodNumber;
71
+ governed: z.ZodOptional<z.ZodBoolean>;
72
+ }, "strict", z.ZodTypeAny, {
73
+ cwd: string;
74
+ cols: number;
75
+ rows: number;
76
+ cmd?: string[] | undefined;
77
+ governed?: boolean | undefined;
78
+ }, {
79
+ cwd: string;
80
+ cols: number;
81
+ rows: number;
82
+ cmd?: string[] | undefined;
83
+ governed?: boolean | undefined;
84
+ }>;
85
+ /** `POST /open` (crew#273) — the studio Files tab's "open with the OS default app" body. */
86
+ export declare const OpenPathSchema: z.ZodObject<{
87
+ path: z.ZodString;
88
+ runId: z.ZodOptional<z.ZodString>;
89
+ }, "strict", z.ZodTypeAny, {
90
+ path: string;
91
+ runId?: string | undefined;
92
+ }, {
93
+ path: string;
94
+ runId?: string | undefined;
95
+ }>;
96
+ /** The actor/audit deps (task #88) — threaded from `createServer`. */
97
+ export interface SecurityDeps {
98
+ audit: AuditLog;
99
+ authMode: AuthMode;
100
+ }
101
+ /**
102
+ * Daemon-runtime deps the routes read but `createServer` owns: the seat-health fold (crew#274,
103
+ * fed by the daemon's single CoreEvent subscription) and the OS opener for `/open` (crew#273,
104
+ * injectable so tests never actually open anything).
105
+ */
106
+ export interface RuntimeDeps {
107
+ seatHealth?: SeatHealthTracker;
108
+ openWithOs?: (target: string) => Promise<void>;
109
+ /** Seat sign-in presence probe (seat sign-in) — injectable so route tests never read the
110
+ * developer's real dotfiles. Defaults to the file/env heuristic in seat-signin.ts. */
111
+ signedIn?: (seatKey: string, workerConfigRoot?: string) => boolean | null;
112
+ /** The wicked-interactive bridge pool behind `/projects/:id/interactive/*` (DES-MERGE-001
113
+ * slice 1). Injectable so the integration suite proxies to a FAKE bridge instead of
114
+ * spawning a real `npx wicked-interactive serve`. */
115
+ interactiveBridges?: InteractiveBridgePool;
116
+ }
6
117
  /**
7
118
  * The daemon REST surface. Every endpoint is a thin wrapper over one adapter /
8
119
  * core-ts call (DES-STUDIO-001 §2). `session`/`phase` nouns are now `run`/`unit`.
9
120
  */
10
- export declare function registerRoutes(app: FastifyInstance, adapter: CoreAdapter, gateCache: GateCache, elicitationCache: ElicitationCache): void;
121
+ export declare function registerRoutes(app: FastifyInstance, adapter: CoreAdapter, gateCache: GateCache, elicitationCache: ElicitationCache, qeGateEvents?: QeGateCache, projects?: ProjectRoutesDeps, security?: SecurityDeps, runtime?: RuntimeDeps): void;
11
122
  //# sourceMappingURL=routes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/api/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAQ/C,OAAO,EAAwB,WAAW,EAAkD,MAAM,oBAAoB,CAAC;AAEvH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAO/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AA0I7C;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,gBAAgB,GACjC,IAAI,CAuiCN"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/api/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,OAAO,EAAwB,WAAW,EAAkD,MAAM,oBAAoB,CAAC;AAEvH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAyB,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAItE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAyF7C;;;;;;;;;;;;GAYG;AAIH,eAAO,MAAM,YAAY;;;;;;;;IAQvB;+FAC2F;;;;;;;;;;;;;;;;;;;;EAElF,CAAC;AAEZ,eAAO,MAAM,UAAU;;;;;;;;;EAGZ,CAAC;AAQZ,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;EAQpB,CAAC;AAOZ,4FAA4F;AAC5F,eAAO,MAAM,cAAc;;;;;;;;;EAGhB,CAAC;AAEZ,sEAAsE;AACtE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C;2FACuF;IACvF,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC;IAC1E;;0DAEsD;IACtD,kBAAkB,CAAC,EAAE,qBAAqB,CAAC;CAC5C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,gBAAgB,EAIlC,YAAY,GAAE,WAA+B,EAG7C,QAAQ,GAAE,iBAAqF,EAK/F,QAAQ,GAAE,YAA0D,EAGpE,OAAO,GAAE,WAAgB,GACxB,IAAI,CA86CN"}