wicked-crew 0.7.27 → 0.7.29

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 (135) hide show
  1. package/README.md +9 -1
  2. package/dist/api/chat-scope.d.ts +210 -0
  3. package/dist/api/chat-scope.d.ts.map +1 -0
  4. package/dist/api/chat-scope.js +724 -0
  5. package/dist/api/chat-scope.js.map +1 -0
  6. package/dist/api/diagnostics.d.ts +30 -2
  7. package/dist/api/diagnostics.d.ts.map +1 -1
  8. package/dist/api/diagnostics.js +73 -5
  9. package/dist/api/diagnostics.js.map +1 -1
  10. package/dist/api/governance-health.d.ts +163 -0
  11. package/dist/api/governance-health.d.ts.map +1 -0
  12. package/dist/api/governance-health.js +348 -0
  13. package/dist/api/governance-health.js.map +1 -0
  14. package/dist/api/open-path.d.ts.map +1 -1
  15. package/dist/api/open-path.js +2 -1
  16. package/dist/api/open-path.js.map +1 -1
  17. package/dist/api/post-hoc-deliver.d.ts +9 -5
  18. package/dist/api/post-hoc-deliver.d.ts.map +1 -1
  19. package/dist/api/post-hoc-deliver.js +21 -7
  20. package/dist/api/post-hoc-deliver.js.map +1 -1
  21. package/dist/api/routes.d.ts +56 -12
  22. package/dist/api/routes.d.ts.map +1 -1
  23. package/dist/api/routes.js +318 -50
  24. package/dist/api/routes.js.map +1 -1
  25. package/dist/api/seat-health.d.ts.map +1 -1
  26. package/dist/api/seat-health.js +25 -5
  27. package/dist/api/seat-health.js.map +1 -1
  28. package/dist/api/seat-signin.d.ts.map +1 -1
  29. package/dist/api/seat-signin.js +49 -23
  30. package/dist/api/seat-signin.js.map +1 -1
  31. package/dist/api/server.d.ts +13 -0
  32. package/dist/api/server.d.ts.map +1 -1
  33. package/dist/api/server.js +34 -0
  34. package/dist/api/server.js.map +1 -1
  35. package/dist/campaigns/routes.d.ts +4 -4
  36. package/dist/cli/governance.d.ts +131 -0
  37. package/dist/cli/governance.d.ts.map +1 -0
  38. package/dist/cli/governance.js +354 -0
  39. package/dist/cli/governance.js.map +1 -0
  40. package/dist/cli/index.js +114 -19
  41. package/dist/cli/index.js.map +1 -1
  42. package/dist/core/adapter.d.ts +89 -1
  43. package/dist/core/adapter.d.ts.map +1 -1
  44. package/dist/core/adapter.js +145 -25
  45. package/dist/core/adapter.js.map +1 -1
  46. package/dist/core/bridge-reaper.d.ts.map +1 -1
  47. package/dist/core/bridge-reaper.js +4 -1
  48. package/dist/core/bridge-reaper.js.map +1 -1
  49. package/dist/core/deliver-text.d.ts +184 -0
  50. package/dist/core/deliver-text.d.ts.map +1 -0
  51. package/dist/core/deliver-text.js +434 -0
  52. package/dist/core/deliver-text.js.map +1 -0
  53. package/dist/core/deliver-triage.d.ts +90 -0
  54. package/dist/core/deliver-triage.d.ts.map +1 -0
  55. package/dist/core/deliver-triage.js +106 -0
  56. package/dist/core/deliver-triage.js.map +1 -0
  57. package/dist/core/deliver.d.ts +129 -19
  58. package/dist/core/deliver.d.ts.map +1 -1
  59. package/dist/core/deliver.js +271 -57
  60. package/dist/core/deliver.js.map +1 -1
  61. package/dist/core/deliverable-floor.d.ts.map +1 -1
  62. package/dist/core/deliverable-floor.js +5 -4
  63. package/dist/core/deliverable-floor.js.map +1 -1
  64. package/dist/core/estate-mcp-client.d.ts.map +1 -1
  65. package/dist/core/estate-mcp-client.js +7 -2
  66. package/dist/core/estate-mcp-client.js.map +1 -1
  67. package/dist/core/exec.d.ts.map +1 -1
  68. package/dist/core/exec.js +11 -1
  69. package/dist/core/exec.js.map +1 -1
  70. package/dist/core/governance-store.d.ts +197 -0
  71. package/dist/core/governance-store.d.ts.map +1 -0
  72. package/dist/core/governance-store.js +283 -0
  73. package/dist/core/governance-store.js.map +1 -0
  74. package/dist/core/repoPaths.d.ts +36 -5
  75. package/dist/core/repoPaths.d.ts.map +1 -1
  76. package/dist/core/repoPaths.js +46 -4
  77. package/dist/core/repoPaths.js.map +1 -1
  78. package/dist/interactive/bridge-pool.d.ts +130 -2
  79. package/dist/interactive/bridge-pool.d.ts.map +1 -1
  80. package/dist/interactive/bridge-pool.js +286 -8
  81. package/dist/interactive/bridge-pool.js.map +1 -1
  82. package/dist/interactive/bus-location.d.ts +65 -0
  83. package/dist/interactive/bus-location.d.ts.map +1 -0
  84. package/dist/interactive/bus-location.js +75 -0
  85. package/dist/interactive/bus-location.js.map +1 -0
  86. package/dist/interactive/chat-events.d.ts.map +1 -1
  87. package/dist/interactive/chat-events.js +29 -23
  88. package/dist/interactive/chat-events.js.map +1 -1
  89. package/dist/interactive/demo-events.d.ts +16 -1
  90. package/dist/interactive/demo-events.d.ts.map +1 -1
  91. package/dist/interactive/demo-events.js +262 -43
  92. package/dist/interactive/demo-events.js.map +1 -1
  93. package/dist/interactive/doc-grounding.d.ts +202 -0
  94. package/dist/interactive/doc-grounding.d.ts.map +1 -0
  95. package/dist/interactive/doc-grounding.js +647 -0
  96. package/dist/interactive/doc-grounding.js.map +1 -0
  97. package/dist/interactive/draft-events.d.ts +54 -1
  98. package/dist/interactive/draft-events.d.ts.map +1 -1
  99. package/dist/interactive/draft-events.js +234 -117
  100. package/dist/interactive/draft-events.js.map +1 -1
  101. package/dist/interactive/edit-events.d.ts.map +1 -1
  102. package/dist/interactive/edit-events.js +27 -21
  103. package/dist/interactive/edit-events.js.map +1 -1
  104. package/dist/interactive/proxy-routes.d.ts +78 -0
  105. package/dist/interactive/proxy-routes.d.ts.map +1 -1
  106. package/dist/interactive/proxy-routes.js +355 -14
  107. package/dist/interactive/proxy-routes.js.map +1 -1
  108. package/dist/interactive/repo-snapshot.d.ts +31 -0
  109. package/dist/interactive/repo-snapshot.d.ts.map +1 -1
  110. package/dist/interactive/repo-snapshot.js +56 -1
  111. package/dist/interactive/repo-snapshot.js.map +1 -1
  112. package/dist/projects/graph-paths.d.ts +4 -2
  113. package/dist/projects/graph-paths.d.ts.map +1 -1
  114. package/dist/projects/graph-paths.js +4 -2
  115. package/dist/projects/graph-paths.js.map +1 -1
  116. package/dist/projects/graph.d.ts +5 -4
  117. package/dist/projects/graph.d.ts.map +1 -1
  118. package/dist/projects/graph.js +22 -5
  119. package/dist/projects/graph.js.map +1 -1
  120. package/dist/projects/routes.d.ts.map +1 -1
  121. package/dist/projects/routes.js +18 -9
  122. package/dist/projects/routes.js.map +1 -1
  123. package/dist/qe/conformance.d.ts +10 -1
  124. package/dist/qe/conformance.d.ts.map +1 -1
  125. package/dist/qe/conformance.js +57 -4
  126. package/dist/qe/conformance.js.map +1 -1
  127. package/dist/skills/plugin-source.d.ts.map +1 -1
  128. package/dist/skills/plugin-source.js +3 -0
  129. package/dist/skills/plugin-source.js.map +1 -1
  130. package/dist/studio/assets/index-CeJTutxP.js +540 -0
  131. package/dist/studio/index.html +1 -1
  132. package/dist/studio/testid-inventory.json +333 -7
  133. package/endpoint-manifest.json +75 -12
  134. package/package.json +3 -3
  135. package/dist/studio/assets/index-FcZg3WDR.js +0 -539
package/README.md CHANGED
@@ -30,7 +30,15 @@ installs/updates the whole wicked-\* family, crew included.
30
30
  serves the bundled **wicked-studio** browser console same-origin — open the URL and you have the
31
31
  control room: launch and steer runs, answer human gates, browse projects and evidence, watch live
32
32
  engine events. Durable state (runs, evidence, event log) lives in `~/.wicked-crew/` (`--db`
33
- overrides).
33
+ overrides). Governance evidence — conformance claims, phase transitions, rule lifecycle — lands in
34
+ `<core db>.governance/governance.db` (`--governance-db` / `WICKED_CREW_GOVERNANCE_DB` override; an
35
+ inherited `WICKED_ESTATE_DB` is honoured — the emit seam is SQLite-only, so a URL-form value such as
36
+ `postgres://…` in your shell refuses boot until `--governance-db` names a SQLite file); events the
37
+ engine cannot store dead-letter to
38
+ `<core db>.governance/emit-outbox.ndjson` by default (under the state home, not HOME; an explicit
39
+ `WICKED_APPS_EMIT_DEADLETTER` is honoured), are counted on
40
+ `GET /api/v1/diagnostics` → `governance` (a `governance.deadletter` finding), and are drained back
41
+ with `wicked-crew governance replay <outbox>`.
34
42
 
35
43
  ## Quickstart
36
44
 
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Chat scope (crew#502, acceptance finding F-067): WHAT a chat's seats can see, decided up front
3
+ * and stated — to the seats and to the caller.
4
+ *
5
+ * `POST /chats` used to set the seats' cwd only when `repoRef` was sent, and the engine fell back
6
+ * to `current_dir()` — the DAEMON's working directory. Studio's GroupChat never sent `repoRef`, so
7
+ * every chat explored wherever `wicked-crew serve` had been started from (a customer's `$HOME`),
8
+ * with no estate MCP, no repo list and no statement of the scope; "chat with all 9 repos" worked
9
+ * only because the acceptance rig started the daemon from the parent of `repos/`, and the seats
10
+ * browsed the rig's other clones and the INSTALLED package's `.d.ts` files as if they were sources.
11
+ *
12
+ * The scope is a first-class input now: a PROJECT (default: every registered `crew.repo` member)
13
+ * or an explicit repo list. From it this module derives the three things the engine is handed
14
+ * (`wicked-core-ts chatOpen(chatId, clis, cwd, scopeJson)`):
15
+ *
16
+ * - `cwd` — a PRIVATE SCRATCH ROOT of the chat's own, under THIS daemon's per-process
17
+ * namespace (`<os tmp>/wicked-crew-chats/<pid>-<random>/<chatId>`, see
18
+ * {@link chatScratchBase}), never a repo and never the daemon's cwd. Relative
19
+ * writes land there and the
20
+ * OS sandbox, where the seat's config arms it, contains writes to it — the
21
+ * repos are READ. Deliberately NOT under the state home: the engine's worker
22
+ * fence denies `Read/Edit/Write(<state home>/**)` to every seat (wicked-core
23
+ * `execute_wrapped::deny_rules`), so a seat whose cwd sat there could not read
24
+ * its own working directory — and a new state-home store needs core's registry
25
+ * (`tests/fixtures/state-home-subtrees.json`) released first.
26
+ * - `readRoots` — the scoped repos' REGISTERED root paths (the run worktree read-roots idea,
27
+ * applied to live repos): advertised to a claude seat as the SDK's
28
+ * `additionalDirectories`, recorded on every seat (`GET /chats`).
29
+ * - `codeGraphDb` — the graph the seats' READ-ONLY estate MCP is bound to: the project's
30
+ * co-located graph (`resolveProjectGraphBinding`, DES-GROUNDING-001 — the SAME
31
+ * seam governed runs get) when the chat is filed into a project; a single
32
+ * repo's own graph otherwise; none for several repos with no project.
33
+ *
34
+ * and STATES it: an `AGENTS.md` + `CLAUDE.md` in the scratch root (every seat CLI reads its cwd's
35
+ * instructions file — claude `CLAUDE.md`; codex, pi, opencode and copilot `AGENTS.md`) names the
36
+ * repos, their paths, the read-only rule and the grounding, so a seat that starts in an empty
37
+ * directory knows exactly what it was pointed at; the same {@link ChatScope} rides the
38
+ * `POST /chats` response and `GET /chats/:id` for the UI (studio's New Chat).
39
+ */
40
+ import type { CoreAdapter } from '../core/adapter.js';
41
+ import type { ChatScope, RepoEntry } from '../core/types.js';
42
+ import { type ProjectGraphBindingDecision } from '../projects/graph.js';
43
+ /** The scope a `POST /chats` asked for, after body validation. `repoRefs` is `repoRef` merged in. */
44
+ export interface ChatScopeRequest {
45
+ chatId: string;
46
+ projectId?: string;
47
+ /** Registry ids or names; empty when the caller named none. */
48
+ repoRefs: string[];
49
+ }
50
+ /** What the engine is handed for the chat — the wire shape of `chatOpen`'s `scopeJson` plus `cwd`. */
51
+ export interface EngineChatScope {
52
+ cwd: string;
53
+ codeGraphDb: string | null;
54
+ readRoots: string[];
55
+ }
56
+ export type ChatScopeResolution = {
57
+ ok: true;
58
+ scope: ChatScope;
59
+ engine: EngineChatScope;
60
+ } | {
61
+ ok: false;
62
+ status: 400 | 404 | 409;
63
+ error: string;
64
+ missing?: string[];
65
+ };
66
+ /** The reads the resolver needs — injectable so the resolver is testable without an engine. */
67
+ export interface ChatScopeDeps {
68
+ listRepos(): Promise<RepoEntry[]>;
69
+ /** The `crew.repo` member refs of a project, in attach order. */
70
+ projectRepoRefs(projectId: string): Promise<string[]>;
71
+ /** The project-graph decision for a chat — repo-bound when exactly one repo is in scope. */
72
+ bindProjectGraph(projectId: string, repoRef: string | undefined): Promise<ProjectGraphBindingDecision>;
73
+ /** Where chat scratch roots live. Default {@link chatScratchBase}. */
74
+ scratchBase?: string;
75
+ /** Where a registered root the daemon cannot resolve — and that is NOT in this chat's scope nor
76
+ * lexically near the base — is noted instead of refusing the open (hardening, W7). */
77
+ log?: (msg: string) => void;
78
+ }
79
+ /**
80
+ * `<os tmp>/wicked-crew-chats/<pid>-<random>` — THIS daemon's own namespace, minted once per
81
+ * process (Copilot, #518): a shared `<os tmp>/wicked-crew-chats/<chatId>` could already exist from
82
+ * another daemon running as the same OS user, which would pass every ownership check, overwrite the
83
+ * live chat's statement and remove its root. Chats do not survive a daemon restart (the engine's pool
84
+ * is in memory), so a stale namespace left by a crashed daemon holds nothing live. See the module
85
+ * doc for why the base is not the state home.
86
+ */
87
+ export declare function chatScratchBase(): string;
88
+ /** The production deps over a live adapter. */
89
+ export declare function chatScopeDeps(adapter: CoreAdapter): ChatScopeDeps;
90
+ /**
91
+ * Decide a chat's scope. Never throws on a caller error: an unknown repo is a 404 naming EVERY
92
+ * missing ref (not just the first), a chat id that cannot name a scratch directory is a 400. A
93
+ * graph that cannot be bound degrades to "no graph" WITH the reason — the same posture as a run
94
+ * launch (`resolveProjectGraphBinding` never indexes; a refresh is an explicit act).
95
+ */
96
+ export declare function resolveChatScope(req: ChatScopeRequest, deps: ChatScopeDeps): Promise<ChatScopeResolution>;
97
+ /**
98
+ * The statement every seat reads on start — written as BOTH `AGENTS.md` (codex, pi, opencode,
99
+ * copilot) and `CLAUDE.md` (claude) into the scratch root. Plain prose, repo paths verbatim: the
100
+ * seat is in an empty directory and this is how it learns what it was pointed at.
101
+ */
102
+ export declare function chatScopeStatement(chatId: string, scope: ChatScope): string;
103
+ /**
104
+ * Create the chat's scratch root (private) and write the scope statement into it. Throws on an
105
+ * unwritable temp — the route reports that rather than opening seats with no working directory.
106
+ *
107
+ * The root lives under the shared system temp dir, where another local user can pre-place an
108
+ * entry under a predictable name (Copilot, #518) — so nothing here follows a link or trusts an
109
+ * existing entry: the base and the root must be REAL directories (never symlinks), an existing
110
+ * root must be OWNED by this process's user (POSIX), the mode is ENFORCED with `chmod` (mkdir's
111
+ * `mode` applies only on creation), and each instruction file is unlinked before it is written
112
+ * exclusively (`wx`) so a planted link cannot redirect the write.
113
+ */
114
+ export declare function prepareChatScratch(chatId: string, scope: ChatScope): void;
115
+ /**
116
+ * Reap the scratch namespaces of DEAD daemons (independent review, W6): every sibling
117
+ * `<pid>-<hex>` directory under the shared parent whose pid no longer exists is removed — judged
118
+ * with the same checks as {@link removeChatScratch} (a real directory, never a link, owned by this
119
+ * user). This daemon's own namespace, a live pid, a pid this user may not signal (another user's
120
+ * daemon), and anything not shaped like a namespace are left alone. Never throws; returns the
121
+ * removed namespaces. Called once at daemon boot.
122
+ */
123
+ export declare function reapStaleChatNamespaces(parent?: string): string[];
124
+ /**
125
+ * Remove a chat's scratch root — fail closed (Copilot, #518): the base must be a REAL directory
126
+ * (a planted `<tmp>/wicked-crew-chats` link would make a lexical prefix test pass and the
127
+ * recursive removal follow it), the target must sit DIRECTLY under the base by realpath, must not
128
+ * itself be a link, and must be owned by this user. Anything else is left alone: a wrong guess
129
+ * here deletes someone else's files, so the policy is the same as `prepareChatScratch`'s.
130
+ */
131
+ export declare function removeChatScratch(cwd: string, base?: string): void;
132
+ /** One chat id's lifecycle slot in the index — see {@link ChatScopeIndex}. */
133
+ type ChatSlot =
134
+ /** An open is in flight: reserved synchronously before the route's first `await`. */
135
+ {
136
+ state: 'reserved';
137
+ token: number;
138
+ }
139
+ /** The chat is open; its scratch root exists and its seats are reading the statement there. */
140
+ | {
141
+ state: 'live';
142
+ scope: ChatScope;
143
+ }
144
+ /** `DELETE` ran: the root is already gone, and the id stays taken until the engine's own
145
+ * `chatClosed` for it is observed (or the grace timer gives up) — so a delayed close can never
146
+ * land on a chat that reused the id, and a reuse cannot race the close. */
147
+ | {
148
+ state: 'closing';
149
+ timer: ReturnType<typeof setTimeout>;
150
+ };
151
+ /**
152
+ * The daemon's live chat scopes, keyed by chat id — in memory, like the engine's own chat pool (a
153
+ * daemon restart loses both). A small state machine (Copilot, #518) rather than a map, because the
154
+ * open is asynchronous and the engine's close is an event:
155
+ *
156
+ * - `reserve` claims an id SYNCHRONOUSLY (before the route's first `await`) and hands back a
157
+ * token; `set` publishes the scope only if THAT reservation is still standing — an engine
158
+ * `chatClosed` or a `DELETE` that cancelled it in the meantime makes `set` return `false`, and
159
+ * the route tears the just-opened chat down instead of registering a scope for a closed one.
160
+ * - `beginClose` (DELETE) removes the root at once and parks the id as `closing`; `closed` (the
161
+ * engine's `chatClosed`) frees it. Until then a re-open of the same id is refused, so the
162
+ * engine's close — which may be delivered after `DELETE` returns — can never delete a newer
163
+ * chat's root, and a `chatClosed` for a merely reserved id cancels that open.
164
+ * - a `closing` slot whose event never arrives (an engine without the event, a lost relay) is
165
+ * freed after `closeGraceMs`; a late event after THAT is the documented residual (the engine's
166
+ * `chatClosed` carries no per-open token).
167
+ */
168
+ export declare class ChatScopeIndex {
169
+ readonly base: string;
170
+ private readonly closeGraceMs;
171
+ private readonly slots;
172
+ private nextToken;
173
+ /** `base`: where this daemon's chat scratch roots live — the resolver is handed the SAME base. */
174
+ constructor(base?: string, closeGraceMs?: number);
175
+ /** Live, reserved or closing — every state in which the id is not free. */
176
+ has(chatId: string): boolean;
177
+ /** The state the id is in, for the route's refusal wording. */
178
+ stateOf(chatId: string): ChatSlot['state'] | 'free';
179
+ /** Reserve `chatId` for an open in flight; `null` when it is live, reserved or closing. */
180
+ reserve(chatId: string): number | null;
181
+ /** Give a reservation back (the open failed before `set`) — only the holder's own. */
182
+ release(chatId: string, token: number): void;
183
+ /**
184
+ * Abort an open that already reached the ENGINE (the route closed the engine chat again): the
185
+ * engine's `chatClosed` for this id is still on its way, so the id is parked as `closing` — not
186
+ * released — until that event (or the grace) frees it; a reuse in between would otherwise have
187
+ * its root removed by the late event (Copilot, #518). Only the holder's own reservation.
188
+ */
189
+ abortToClosing(chatId: string, token: number): void;
190
+ /** Publish the scope of a finished open. `false` when the reservation is gone (cancelled by a
191
+ * close in the meantime): the caller must tear the chat down, nothing was recorded. */
192
+ set(chatId: string, scope: ChatScope, token: number): boolean;
193
+ /** The scope of a LIVE chat; `undefined` while reserved, closing or unknown. */
194
+ get(chatId: string): ChatScope | undefined;
195
+ /**
196
+ * `DELETE /chats/:id`: remove the root now and park the id until the engine's `chatClosed` (or
197
+ * the grace) frees it. A reserved id is cancelled instead (the in-flight open cleans up on its
198
+ * failed `set`). Returns the scope that was live, if any.
199
+ */
200
+ beginClose(chatId: string): ChatScope | undefined;
201
+ /**
202
+ * The engine's `chatClosed` for `chatId` (any reason): frees a closing id, removes and frees a
203
+ * live one (an engine-side reap), cancels a reservation (the open in flight tears down). Idempotent.
204
+ */
205
+ closed(chatId: string): void;
206
+ /** Forget the chat and remove its scratch root at once — no closing window (tests, teardown). */
207
+ delete(chatId: string): ChatScope | undefined;
208
+ }
209
+ export {};
210
+ //# sourceMappingURL=chat-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-scope.d.ts","sourceRoot":"","sources":["../../src/api/chat-scope.ts"],"names":[],"mappings":"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"}