wicked-crew 0.7.47 → 0.7.49

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 (131) hide show
  1. package/dist/api/chat-citations.d.ts +10 -1
  2. package/dist/api/chat-citations.d.ts.map +1 -1
  3. package/dist/api/chat-citations.js +28 -0
  4. package/dist/api/chat-citations.js.map +1 -1
  5. package/dist/api/chat-scope.d.ts +4 -2
  6. package/dist/api/chat-scope.d.ts.map +1 -1
  7. package/dist/api/chat-scope.js +35 -3
  8. package/dist/api/chat-scope.js.map +1 -1
  9. package/dist/api/chat-transcripts.d.ts +23 -1
  10. package/dist/api/chat-transcripts.d.ts.map +1 -1
  11. package/dist/api/chat-transcripts.js +61 -6
  12. package/dist/api/chat-transcripts.js.map +1 -1
  13. package/dist/api/eval-sample.d.ts +6 -6
  14. package/dist/api/routes.d.ts +15 -1
  15. package/dist/api/routes.d.ts.map +1 -1
  16. package/dist/api/routes.js +107 -4
  17. package/dist/api/routes.js.map +1 -1
  18. package/dist/api/server.d.ts +30 -0
  19. package/dist/api/server.d.ts.map +1 -1
  20. package/dist/api/server.js +149 -6
  21. package/dist/api/server.js.map +1 -1
  22. package/dist/cli/index.d.ts.map +1 -1
  23. package/dist/cli/index.js +31 -1
  24. package/dist/cli/index.js.map +1 -1
  25. package/dist/core/adapter.d.ts +16 -1
  26. package/dist/core/adapter.d.ts.map +1 -1
  27. package/dist/core/adapter.js +29 -0
  28. package/dist/core/adapter.js.map +1 -1
  29. package/dist/core/types.d.ts +7 -0
  30. package/dist/core/types.d.ts.map +1 -1
  31. package/dist/core/types.js.map +1 -1
  32. package/dist/decisions/chat-recorder.d.ts +129 -0
  33. package/dist/decisions/chat-recorder.d.ts.map +1 -0
  34. package/dist/decisions/chat-recorder.js +367 -0
  35. package/dist/decisions/chat-recorder.js.map +1 -0
  36. package/dist/decisions/consider.d.ts +102 -0
  37. package/dist/decisions/consider.d.ts.map +1 -0
  38. package/dist/decisions/consider.js +207 -0
  39. package/dist/decisions/consider.js.map +1 -0
  40. package/dist/decisions/events.d.ts +2 -0
  41. package/dist/decisions/events.d.ts.map +1 -1
  42. package/dist/decisions/events.js +2 -0
  43. package/dist/decisions/events.js.map +1 -1
  44. package/dist/decisions/ingest.d.ts +28 -5
  45. package/dist/decisions/ingest.d.ts.map +1 -1
  46. package/dist/decisions/ingest.js +14 -6
  47. package/dist/decisions/ingest.js.map +1 -1
  48. package/dist/decisions/rules-text.d.ts +21 -0
  49. package/dist/decisions/rules-text.d.ts.map +1 -0
  50. package/dist/decisions/rules-text.js +50 -0
  51. package/dist/decisions/rules-text.js.map +1 -0
  52. package/dist/editors/csp.d.ts +31 -0
  53. package/dist/editors/csp.d.ts.map +1 -0
  54. package/dist/editors/csp.js +46 -0
  55. package/dist/editors/csp.js.map +1 -0
  56. package/dist/editors/pack-install.d.ts +28 -0
  57. package/dist/editors/pack-install.d.ts.map +1 -0
  58. package/dist/editors/pack-install.js +153 -0
  59. package/dist/editors/pack-install.js.map +1 -0
  60. package/dist/editors/registry.d.ts +142 -0
  61. package/dist/editors/registry.d.ts.map +1 -0
  62. package/dist/editors/registry.js +255 -0
  63. package/dist/editors/registry.js.map +1 -0
  64. package/dist/editors/routes.d.ts +46 -0
  65. package/dist/editors/routes.d.ts.map +1 -0
  66. package/dist/editors/routes.js +166 -0
  67. package/dist/editors/routes.js.map +1 -0
  68. package/dist/interactive/bridge-pool.d.ts +7 -2
  69. package/dist/interactive/bridge-pool.d.ts.map +1 -1
  70. package/dist/interactive/bridge-pool.js +6 -1
  71. package/dist/interactive/bridge-pool.js.map +1 -1
  72. package/dist/interactive/doc-checks-routes.d.ts +38 -0
  73. package/dist/interactive/doc-checks-routes.d.ts.map +1 -0
  74. package/dist/interactive/doc-checks-routes.js +122 -0
  75. package/dist/interactive/doc-checks-routes.js.map +1 -0
  76. package/dist/interactive/doc-delete-routes.d.ts +1 -1
  77. package/dist/interactive/doc-delete-routes.d.ts.map +1 -1
  78. package/dist/interactive/doc-delete-routes.js +1 -1
  79. package/dist/interactive/doc-delete-routes.js.map +1 -1
  80. package/dist/interactive/doc-ledger-sweep.d.ts +3 -2
  81. package/dist/interactive/doc-ledger-sweep.d.ts.map +1 -1
  82. package/dist/interactive/doc-ledger-sweep.js +4 -3
  83. package/dist/interactive/doc-ledger-sweep.js.map +1 -1
  84. package/dist/interactive/ledger.d.ts +4 -1
  85. package/dist/interactive/ledger.d.ts.map +1 -1
  86. package/dist/interactive/ledger.js +5 -2
  87. package/dist/interactive/ledger.js.map +1 -1
  88. package/dist/interactive/review-events.d.ts +185 -0
  89. package/dist/interactive/review-events.d.ts.map +1 -0
  90. package/dist/interactive/review-events.js +856 -0
  91. package/dist/interactive/review-events.js.map +1 -0
  92. package/dist/interactive/review-ledger.d.ts +79 -0
  93. package/dist/interactive/review-ledger.d.ts.map +1 -0
  94. package/dist/interactive/review-ledger.js +131 -0
  95. package/dist/interactive/review-ledger.js.map +1 -0
  96. package/dist/interactive/theme-events.d.ts +119 -0
  97. package/dist/interactive/theme-events.d.ts.map +1 -0
  98. package/dist/interactive/theme-events.js +606 -0
  99. package/dist/interactive/theme-events.js.map +1 -0
  100. package/dist/interactive/ws-relay.d.ts +2 -1
  101. package/dist/interactive/ws-relay.d.ts.map +1 -1
  102. package/dist/interactive/ws-relay.js +2 -1
  103. package/dist/interactive/ws-relay.js.map +1 -1
  104. package/dist/projects/routes.d.ts +2 -2
  105. package/dist/qe/ledger.d.ts +35 -0
  106. package/dist/qe/ledger.d.ts.map +1 -1
  107. package/dist/qe/ledger.js +47 -0
  108. package/dist/qe/ledger.js.map +1 -1
  109. package/dist/standing-orders/routes.d.ts +21 -21
  110. package/dist/standing-orders/store.d.ts +9 -9
  111. package/dist/watch/checks/claim-vs-evidence.d.ts +30 -0
  112. package/dist/watch/checks/claim-vs-evidence.d.ts.map +1 -0
  113. package/dist/watch/checks/claim-vs-evidence.js +152 -0
  114. package/dist/watch/checks/claim-vs-evidence.js.map +1 -0
  115. package/dist/watch/checks/index.d.ts.map +1 -1
  116. package/dist/watch/checks/index.js +5 -0
  117. package/dist/watch/checks/index.js.map +1 -1
  118. package/dist/watch/checks/warned-rule.d.ts +26 -0
  119. package/dist/watch/checks/warned-rule.d.ts.map +1 -0
  120. package/dist/watch/checks/warned-rule.js +126 -0
  121. package/dist/watch/checks/warned-rule.js.map +1 -0
  122. package/dist/watch/registry.d.ts +29 -0
  123. package/dist/watch/registry.d.ts.map +1 -1
  124. package/dist/watch/registry.js +60 -1
  125. package/dist/watch/registry.js.map +1 -1
  126. package/dist/watch/types.d.ts +19 -0
  127. package/dist/watch/types.d.ts.map +1 -1
  128. package/endpoint-manifest.json +107 -1
  129. package/package.json +1 -1
  130. package/watch/entries/claim-vs-evidence.json +13 -0
  131. package/watch/entries/risky-call.json +12 -0
@@ -0,0 +1,207 @@
1
+ /**
2
+ * "Considered · set aside · cited (unchecked)" (DES-decision-capture §4.7, DC-S7).
3
+ *
4
+ * - **Considered** = the engine's `considerRules({projects:[project]}).in_force` for the turn's or
5
+ * unit's project (project rules + global ones). On an engine without the binding, the global
6
+ * rules alone, and the Consideration says so (`source: 'global-only'`).
7
+ * - **Set aside** = the engine's `set_aside` (out of scope / replaced / retired) plus crew's own
8
+ * pending candidates for that project — decisions `offered` but not yet confirmed.
9
+ * - **Cited (unchecked)** = every `[rule:<id>]` the persisted reply or step wrote. An id in the
10
+ * in-force set is "cited by the step — unchecked"; any other id is unverified. It is NEVER
11
+ * summed into a "followed" count (B4): advisory rules never decide, so nothing here can know
12
+ * whether a rule was followed — DES-rule-check supplies that verdict.
13
+ *
14
+ * The same object answers `GET /chats/:id/turns/:turnId/considered` and
15
+ * `GET /runs/:id/units/:unitKey/considered?attempt=`, and one `wicked.crew.rule.considered` fact
16
+ * (counts and ids, never words) is emitted when a turn or a unit attempt lands — keyed per turn
17
+ * and per (run, ord, attempt), so a re-dispatch is its own record (review N5).
18
+ */
19
+ import { RULE_CITED_LABEL, RULE_UNKNOWN_LABEL, extractRuleCitations } from '../api/chat-citations.js';
20
+ import { coreUnitId } from '../api/evidence.js';
21
+ import { resolveUnit } from '../api/unit-output.js';
22
+ import { RULE_CONSIDERED, decisionFact } from './events.js';
23
+ import { orderBySeverity, rulesPreface } from './rules-text.js';
24
+ export { RULE_CITED_LABEL, extractRuleCitations, rulesPreface };
25
+ /**
26
+ * The in-force rules for a project. `considerRules` when the engine has it; else the global,
27
+ * non-retired rules; else (no engine read at all) nothing, said as `unavailable`. Never throws.
28
+ */
29
+ export async function readInForce(adapter, projectId, log) {
30
+ try {
31
+ if (typeof adapter.projectRulesSupported === 'function' && adapter.projectRulesSupported() && typeof adapter.considerRules === 'function') {
32
+ const c = await adapter.considerRules({ projects: projectId !== null ? [projectId] : [] });
33
+ return { rules: c.in_force, setAside: c.set_aside, source: 'considerRules' };
34
+ }
35
+ if (typeof adapter.listConformanceRules === 'function') {
36
+ const all = await adapter.listConformanceRules();
37
+ return {
38
+ rules: all.filter((r) => r.retired !== true && r.targets?.project === undefined),
39
+ setAside: all.filter((r) => r.retired === true).map((r) => ({ id: r.id, statement: r.statement, reason: 'retired' })),
40
+ source: 'global-only',
41
+ };
42
+ }
43
+ }
44
+ catch (err) {
45
+ log?.(`[decisions] could not read the in-force rules: ${err instanceof Error ? err.message : String(err)}`);
46
+ }
47
+ return { rules: [], setAside: [], source: 'unavailable' };
48
+ }
49
+ export class ConsiderationService {
50
+ deps;
51
+ /** chat → the rule ids its seats have been told about (the statement at open, then every preface). */
52
+ seen = new Map();
53
+ constructor(deps) {
54
+ this.deps = deps;
55
+ }
56
+ log(msg) {
57
+ this.deps.log?.(msg);
58
+ }
59
+ async inForceFor(projectId) {
60
+ return readInForce(this.deps.adapter, projectId, (m) => this.log(m));
61
+ }
62
+ /** The in-force ids, or `null` when no engine read was possible (a citation then stays unchecked). */
63
+ async inForceIds(projectId) {
64
+ const read = await this.inForceFor(projectId);
65
+ return read.source === 'unavailable' ? null : new Set(read.rules.map((r) => r.id));
66
+ }
67
+ // ── How seats learn the rules ──────────────────────────────────────────────────────────────
68
+ /** The chat opened with these rules in its statement. */
69
+ noteChatOpen(chat, rules) {
70
+ this.seen.set(chat, new Set(rules.map((r) => r.id)));
71
+ }
72
+ /**
73
+ * The preface the next send carries, or `null`: the rules in force now that the seats have not
74
+ * been told about. A chat this daemon did not open (a restart) is SEEDED on its first send —
75
+ * nothing is known about what its seats were told, so the current set stands in for the open
76
+ * statement and that send carries no preface; a rule that lands after the seed is new to the
77
+ * seats and IS prefaced on the send after (codex r1, wording fixed: "seeded, then prefaced").
78
+ */
79
+ async prefaceForSend(chat, opts = {}) {
80
+ const rules = opts.inForce ?? (await this.inForceFor(this.deps.projectOf(chat) ?? null)).rules;
81
+ const seen = this.seen.get(chat);
82
+ if (seen === undefined) {
83
+ this.seen.set(chat, new Set(rules.map((r) => r.id)));
84
+ return null;
85
+ }
86
+ const fresh = rules.filter((r) => !seen.has(r.id));
87
+ for (const r of rules)
88
+ seen.add(r.id);
89
+ return fresh.length > 0 ? rulesPreface(fresh) : null;
90
+ }
91
+ chatClosed(chat) {
92
+ this.seen.delete(chat);
93
+ }
94
+ // ── The Consideration ──────────────────────────────────────────────────────────────────────
95
+ notConfirmed(projectId) {
96
+ const ledger = this.deps.ledger;
97
+ if (ledger === undefined)
98
+ return [];
99
+ const views = ledger.list({ state: 'offered', ...(projectId !== null ? { project: projectId } : {}) });
100
+ return views
101
+ .filter((v) => v.project_id === projectId)
102
+ .map((v) => ({ id: v.proposal_id ?? v.id, statement: v.derived.statement ?? v.origin.words, reason: 'not_confirmed' }));
103
+ }
104
+ async build(subject, key, projectId, texts) {
105
+ const read = await this.inForceFor(projectId);
106
+ const inForce = new Set(read.rules.map((r) => r.id));
107
+ const considered = orderBySeverity(read.rules).map((r) => ({
108
+ id: r.id,
109
+ statement: r.statement,
110
+ severity: r.severity,
111
+ ...(r.steering_type !== undefined ? { steering_type: r.steering_type } : {}),
112
+ ...(r.targets?.project !== undefined ? { project: r.targets.project } : {}),
113
+ }));
114
+ const cited = [];
115
+ const seenCite = new Set();
116
+ for (const { by, text } of texts) {
117
+ for (const id of extractRuleCitations(text)) {
118
+ const k = `${by}\u0000${id}`;
119
+ if (seenCite.has(k))
120
+ continue;
121
+ seenCite.add(k);
122
+ cited.push(inForce.has(id)
123
+ ? { id, by, status: 'unchecked', label: RULE_CITED_LABEL }
124
+ : { id, by, status: 'unverified', label: RULE_UNKNOWN_LABEL });
125
+ }
126
+ }
127
+ return {
128
+ subject,
129
+ key,
130
+ project_id: projectId,
131
+ considered,
132
+ set_aside: [...read.setAside, ...this.notConfirmed(projectId)],
133
+ cited,
134
+ source: read.source,
135
+ };
136
+ }
137
+ /** The Consideration of one chat turn, or `null` when the transcript holds no such turn. */
138
+ async forChatTurn(chat, turnId) {
139
+ const transcripts = this.deps.transcripts;
140
+ if (transcripts === undefined)
141
+ return null;
142
+ const records = transcripts.read(chat);
143
+ if (!records.some((r) => r.turnId === turnId && r.kind === 'user'))
144
+ return null;
145
+ const texts = records.flatMap((r) => (r.turnId === turnId && r.kind === 'seat' ? [{ by: r.cliKey, text: r.text }] : []));
146
+ return this.build({ kind: 'chat', chat_id: chat, turn_id: turnId }, `considered:${chat}:${turnId}`, this.deps.projectOf(chat) ?? null, texts);
147
+ }
148
+ /** The Consideration of one unit attempt (`unitKey` as `resolveUnit` accepts it), or `null`. */
149
+ async forUnit(runId, unitKey, attempt = 0) {
150
+ const { adapter } = this.deps;
151
+ if (typeof adapter.sessionsDetail !== 'function')
152
+ return null;
153
+ const run = (await adapter.sessionsDetail()).find((v) => v.session.id === runId);
154
+ if (run === undefined)
155
+ return null;
156
+ const unit = resolveUnit(run, unitKey);
157
+ if (unit === null)
158
+ return null;
159
+ const text = typeof adapter.workOutput === 'function' ? ((await adapter.workOutput(coreUnitId(runId, unit))) ?? '') : '';
160
+ return this.build({ kind: 'unit', run_id: runId, ord: unit.ord, attempt }, `considered:${runId}:${unit.ord}:${attempt}`, this.deps.projectOf(runId) ?? null, [{ by: unit.id, text }]);
161
+ }
162
+ // ── The fact (post-commit, counts only) ───────────────────────────────────────────────────
163
+ async emit(c) {
164
+ const emit = this.deps.emit;
165
+ if (emit === null || emit === undefined)
166
+ return;
167
+ const counts = {
168
+ project_id: c.project_id,
169
+ considered_count: c.considered.length,
170
+ set_aside_count: c.set_aside.length,
171
+ cited_count: c.cited.length,
172
+ };
173
+ const subject = c.subject.kind === 'chat'
174
+ ? { chat_id: c.subject.chat_id, turn_id: c.subject.turn_id }
175
+ : { run_id: c.subject.run_id, ord: c.subject.ord, attempt: c.subject.attempt };
176
+ const f = decisionFact(RULE_CONSIDERED, { ...subject, ...counts }, c.key);
177
+ try {
178
+ await emit(f.type, f.payload, f.key);
179
+ }
180
+ catch (err) {
181
+ this.log(`[decisions] emit ${RULE_CONSIDERED} failed: ${err instanceof Error ? err.message : String(err)}`);
182
+ }
183
+ }
184
+ /** A chat turn's replies all landed: compute and emit. Never throws. */
185
+ async onChatTurn(chat, turnId) {
186
+ try {
187
+ const c = await this.forChatTurn(chat, turnId);
188
+ if (c !== null)
189
+ await this.emit(c);
190
+ }
191
+ catch (err) {
192
+ this.log(`[decisions] considered for chat ${chat} turn ${turnId} failed: ${err instanceof Error ? err.message : String(err)}`);
193
+ }
194
+ }
195
+ /** A unit attempt's output was captured: compute and emit. Never throws. */
196
+ async onUnitCaptured(runId, ord, attempt) {
197
+ try {
198
+ const c = await this.forUnit(runId, String(ord), attempt);
199
+ if (c !== null)
200
+ await this.emit(c);
201
+ }
202
+ catch (err) {
203
+ this.log(`[decisions] considered for run ${runId} unit ${ord} failed: ${err instanceof Error ? err.message : String(err)}`);
204
+ }
205
+ }
206
+ }
207
+ //# sourceMappingURL=consider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consider.js","sourceRoot":"","sources":["../../src/decisions/consider.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,8 @@ export declare const DECISION_UNDONE = "wicked.crew.decision.undone";
11
11
  export declare const DECISION_DISMISSED = "wicked.crew.decision.dismissed";
12
12
  export declare const DECISION_RESTATED = "wicked.crew.decision.restated";
13
13
  export declare const DECISION_WIDENED = "wicked.crew.decision.widened";
14
+ /** DC-S7 (§4.6): counts and ids only — `considered:<chat>:<turn>` / `considered:<run>:<ord>:<attempt>`. */
15
+ export declare const RULE_CONSIDERED = "wicked.crew.rule.considered";
14
16
  export interface DecisionBusEmit {
15
17
  (type: string, payload: Record<string, unknown>, idempotencyKey: string): Promise<boolean>;
16
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/decisions/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,iBAAiB,kCAAkC,CAAC;AACjE,eAAO,MAAM,gBAAgB,iCAAiC,CAAC;AAC/D,eAAO,MAAM,mBAAmB,oCAAoC,CAAC;AACrE,eAAO,MAAM,eAAe,gCAAgC,CAAC;AAC7D,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AACnE,eAAO,MAAM,iBAAiB,kCAAkC,CAAC;AACjE,eAAO,MAAM,gBAAgB,iCAAiC,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5F;AAED,qGAAqG;AACrG,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,EACrE,GAAG,EAAE,MAAM,GACV;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAI1F"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/decisions/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,iBAAiB,kCAAkC,CAAC;AACjE,eAAO,MAAM,gBAAgB,iCAAiC,CAAC;AAC/D,eAAO,MAAM,mBAAmB,oCAAoC,CAAC;AACrE,eAAO,MAAM,eAAe,gCAAgC,CAAC;AAC7D,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AACnE,eAAO,MAAM,iBAAiB,kCAAkC,CAAC;AACjE,eAAO,MAAM,gBAAgB,iCAAiC,CAAC;AAC/D,2GAA2G;AAC3G,eAAO,MAAM,eAAe,gCAAgC,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC5F;AAED,qGAAqG;AACrG,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,EACrE,GAAG,EAAE,MAAM,GACV;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAI1F"}
@@ -11,6 +11,8 @@ export const DECISION_UNDONE = 'wicked.crew.decision.undone';
11
11
  export const DECISION_DISMISSED = 'wicked.crew.decision.dismissed';
12
12
  export const DECISION_RESTATED = 'wicked.crew.decision.restated';
13
13
  export const DECISION_WIDENED = 'wicked.crew.decision.widened';
14
+ /** DC-S7 (§4.6): counts and ids only — `considered:<chat>:<turn>` / `considered:<run>:<ord>:<attempt>`. */
15
+ export const RULE_CONSIDERED = 'wicked.crew.rule.considered';
14
16
  /** The fact for one decision event — the payload is ids/enums/counts only (a test pins no words). */
15
17
  export function decisionFact(type, payload, key) {
16
18
  const clean = {};
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/decisions/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AAC/D,MAAM,CAAC,MAAM,mBAAmB,GAAG,iCAAiC,CAAC;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG,6BAA6B,CAAC;AAC7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,gCAAgC,CAAC;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AAM/D,qGAAqG;AACrG,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,OAAqE,EACrE,GAAW;IAEX,MAAM,KAAK,GAAqD,EAAE,CAAC;IACnE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,IAAI,CAAC,KAAK,SAAS;YAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/decisions/events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AAC/D,MAAM,CAAC,MAAM,mBAAmB,GAAG,iCAAiC,CAAC;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG,6BAA6B,CAAC;AAC7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,gCAAgC,CAAC;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,+BAA+B,CAAC;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AAC/D,2GAA2G;AAC3G,MAAM,CAAC,MAAM,eAAe,GAAG,6BAA6B,CAAC;AAM7D,qGAAqG;AACrG,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,OAAqE,EACrE,GAAW;IAEX,MAAM,KAAK,GAAqD,EAAE,CAAC;IACnE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,IAAI,CAAC,KAAK,SAAS;YAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACvC,CAAC"}
@@ -1,8 +1,9 @@
1
1
  /**
2
- * Where operator words enter the ledger (DES-decision-capture §4.3.1 / §4.3.2, DC-S4a).
2
+ * Where operator words enter the ledger (DES-decision-capture §4.3.1 / §4.3.2 / §4.3.3, DC-S4a + S4b).
3
3
  *
4
4
  * The structured hosts — a gate note, an elicitation answer, a run inject — call
5
- * {@link ingestDecision} POST-COMMIT, after their action succeeded. Only a `human` actor is
5
+ * {@link ingestDecision} POST-COMMIT, after their action succeeded; the studio chat recorder
6
+ * (`chat-recorder.ts`) calls it at the end of a turn with the model's labels. Only a `human` actor is
6
7
  * recorded: an agent's words are never a decision source (operator decision 4). `auth_mode` is the
7
8
  * daemon's resolved auth and decides auto eligibility (§4.4). Derivation is deterministic; under
8
9
  * `WICKED_DECISIONS=on` the record's route is then acted on (auto → `remember()`, offer → the review
@@ -10,19 +11,41 @@
10
11
  */
11
12
  import type { Actor } from '../core/types.js';
12
13
  import { type DecisionService } from './land.js';
13
- import type { DecisionHost, DecisionRecord } from './types.js';
14
+ import type { DecisionHost, DecisionModelLabels, DecisionRecord, DecisionType } from './types.js';
14
15
  export interface HostWords {
15
- host: Extract<DecisionHost, 'gate' | 'elicitation' | 'inject'>;
16
+ host: Extract<DecisionHost, 'gate' | 'elicitation' | 'inject' | 'studio-chat'>;
16
17
  actor: Actor;
17
18
  /** The operator's verbatim free text ('' when the decision was a bare choice). */
18
19
  words: string;
19
20
  /** A bare approve/reject, or a picked elicitation option, when there were no words. */
20
21
  choice?: string;
21
22
  projectId: string | null;
22
- runId: string;
23
+ /** The structured hosts: the run the words steered. */
24
+ runId?: string;
23
25
  ord?: number;
24
26
  gateId?: string;
25
27
  elicitationId?: string;
28
+ /** The chat host: the chat and the turn whose operator message carried the words. */
29
+ chatId?: string;
30
+ turnId?: string;
31
+ /** The chat host: the recorder seat's labels for this span, and the other seats' votes. */
32
+ labels?: DecisionModelLabels;
33
+ votes?: Array<{
34
+ cli_key: string;
35
+ type: DecisionType;
36
+ codify: boolean;
37
+ }>;
38
+ /** The chat host, DOC-4: the proposal a go-ahead approved (the previous turn, the recorder seat). */
39
+ proposal?: {
40
+ turn_id: string;
41
+ cli_key: string;
42
+ excerpt: string;
43
+ } | null;
44
+ /**
45
+ * DOC-4: the decision text written from the approved proposal (+ amendment). It replaces the
46
+ * derived statement — a bare approval has no template of its own — while ORIGIN keeps the words.
47
+ */
48
+ statement?: string;
26
49
  }
27
50
  export declare function ingestDecision(service: DecisionService, input: HostWords): Promise<DecisionRecord | null>;
28
51
  //# sourceMappingURL=ingest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/decisions/ingest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,QAAQ,CAAC,CAAC;IAC/D,KAAK,EAAE,KAAK,CAAC;IACb,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA4E/G"}
1
+ {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/decisions/ingest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAElG,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,aAAa,CAAC,CAAC;IAC/E,KAAK,EAAE,KAAK,CAAC;IACb,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAC;IACd,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,YAAY,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACxE,qGAAqG;IACrG,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACxE;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAmF/G"}
@@ -1,8 +1,9 @@
1
1
  /**
2
- * Where operator words enter the ledger (DES-decision-capture §4.3.1 / §4.3.2, DC-S4a).
2
+ * Where operator words enter the ledger (DES-decision-capture §4.3.1 / §4.3.2 / §4.3.3, DC-S4a + S4b).
3
3
  *
4
4
  * The structured hosts — a gate note, an elicitation answer, a run inject — call
5
- * {@link ingestDecision} POST-COMMIT, after their action succeeded. Only a `human` actor is
5
+ * {@link ingestDecision} POST-COMMIT, after their action succeeded; the studio chat recorder
6
+ * (`chat-recorder.ts`) calls it at the end of a turn with the model's labels. Only a `human` actor is
6
7
  * recorded: an agent's words are never a decision source (operator decision 4). `auth_mode` is the
7
8
  * daemon's resolved auth and decides auto eligibility (§4.4). Derivation is deterministic; under
8
9
  * `WICKED_DECISIONS=on` the record's route is then acted on (auto → `remember()`, offer → the review
@@ -22,6 +23,7 @@ export async function ingestDecision(service, input) {
22
23
  const words = input.words.trim();
23
24
  if (words === '' && input.choice === undefined)
24
25
  return null;
26
+ const where = input.runId !== undefined ? `run ${input.runId}` : `chat ${input.chatId ?? '?'}`;
25
27
  try {
26
28
  const now = service.deps.now?.() ?? Date.now();
27
29
  const inForce = words === '' ? [] : await service.inForce(input.projectId);
@@ -33,8 +35,10 @@ export async function ingestDecision(service, input) {
33
35
  projectId: input.projectId,
34
36
  inForce,
35
37
  recurrence: (key) => ledger.recurrence(key),
38
+ ...(input.labels !== undefined ? { labels: input.labels } : {}),
36
39
  now,
37
40
  });
41
+ const statement = input.statement !== undefined && input.statement.trim() !== '' ? input.statement.trim() : d.statement;
38
42
  const record = {
39
43
  op: 'record',
40
44
  v: 1,
@@ -45,22 +49,26 @@ export async function ingestDecision(service, input) {
45
49
  origin: {
46
50
  actor: { id: input.actor.id, kind: 'human', trust: input.actor.trust },
47
51
  auth_mode: authMode,
48
- run_id: input.runId,
52
+ ...(input.chatId !== undefined ? { chat_id: input.chatId } : {}),
53
+ ...(input.turnId !== undefined ? { turn_id: input.turnId } : {}),
54
+ ...(input.runId !== undefined ? { run_id: input.runId } : {}),
49
55
  ...(input.ord !== undefined ? { ord: input.ord } : {}),
50
56
  ...(input.gateId !== undefined ? { gate_id: input.gateId } : {}),
51
57
  ...(input.elicitationId !== undefined ? { elicitation_id: input.elicitationId } : {}),
52
58
  words: d.words,
53
59
  ...(input.choice !== undefined ? { choice: input.choice } : {}),
54
60
  message_sha256: createHash('sha256').update(input.words).digest('hex'),
55
- proposal: null,
61
+ proposal: input.proposal ?? null,
56
62
  words_source: 'typed',
57
63
  redacted: d.redacted,
58
64
  },
59
65
  labels: {
66
+ ...(input.labels !== undefined ? { model: input.labels } : {}),
67
+ ...(input.votes !== undefined && input.votes.length > 0 ? { votes: input.votes } : {}),
60
68
  deterministic: { template: d.template, exclusions: d.exclusions, dgc: d.dgc, recurrence: d.recurrence },
61
69
  },
62
70
  derived: {
63
- statement: d.statement,
71
+ statement,
64
72
  polarity: d.polarity,
65
73
  key: d.key,
66
74
  scope: d.scope,
@@ -85,7 +93,7 @@ export async function ingestDecision(service, input) {
85
93
  return record;
86
94
  }
87
95
  catch (err) {
88
- log?.(`[decisions] recording ${input.host} words for run ${input.runId} failed: ${err instanceof Error ? err.message : String(err)}`);
96
+ log?.(`[decisions] recording ${input.host} words for ${where} failed: ${err instanceof Error ? err.message : String(err)}`);
89
97
  return null;
90
98
  }
91
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/decisions/ingest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/decisions/ingest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * How seats learn the rules (DES-decision-capture §4.7, DC-S7) — the text halves, pure.
3
+ *
4
+ * - The chat scope statement lists the chat project's in-force rules as `[rule:<id>] statement`
5
+ * lines, severity-ordered and capped at {@link RULES_STATEMENT_CAP}.
6
+ * - A rule remembered mid-chat reaches the seats as a crew-authored `wicked-context` preface on
7
+ * the next send, disclosed to the operator as a `system` transcript record.
8
+ *
9
+ * Both tell the seat to cite a rule it follows as `[rule:<id>]`, and both say what crew does with
10
+ * that: shows it as cited — unchecked. Nothing here (and nothing anywhere in crew) turns a citation into
11
+ * a compliance verdict; that belongs to DES-rule-check (B4).
12
+ */
13
+ import type { ConformanceRule } from '../core/types.js';
14
+ export declare const RULES_STATEMENT_CAP = 20;
15
+ /** Severity first (critical → info), then id — a stable order a seat and an operator both read. */
16
+ export declare function orderBySeverity<T extends Pick<ConformanceRule, 'id' | 'severity'>>(rules: ReadonlyArray<T>): T[];
17
+ /** The `## Rules in force` section of the scope statement (no trailing blank line). */
18
+ export declare function rulesStatementLines(rules: ReadonlyArray<ConformanceRule>): string[];
19
+ /** The preface a send carries when rules landed since the seats last heard from crew. */
20
+ export declare function rulesPreface(rules: ReadonlyArray<ConformanceRule>): string;
21
+ //# sourceMappingURL=rules-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-text.d.ts","sourceRoot":"","sources":["../../src/decisions/rules-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAItC,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,CAAC,SAAS,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAEhH;AAMD,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,MAAM,EAAE,CAgBnF;AAED,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,MAAM,CAQ1E"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * How seats learn the rules (DES-decision-capture §4.7, DC-S7) — the text halves, pure.
3
+ *
4
+ * - The chat scope statement lists the chat project's in-force rules as `[rule:<id>] statement`
5
+ * lines, severity-ordered and capped at {@link RULES_STATEMENT_CAP}.
6
+ * - A rule remembered mid-chat reaches the seats as a crew-authored `wicked-context` preface on
7
+ * the next send, disclosed to the operator as a `system` transcript record.
8
+ *
9
+ * Both tell the seat to cite a rule it follows as `[rule:<id>]`, and both say what crew does with
10
+ * that: shows it as cited — unchecked. Nothing here (and nothing anywhere in crew) turns a citation into
11
+ * a compliance verdict; that belongs to DES-rule-check (B4).
12
+ */
13
+ export const RULES_STATEMENT_CAP = 20;
14
+ const SEVERITY_RANK = { critical: 0, error: 1, warn: 2, info: 3 };
15
+ /** Severity first (critical → info), then id — a stable order a seat and an operator both read. */
16
+ export function orderBySeverity(rules) {
17
+ return [...rules].sort((a, b) => (SEVERITY_RANK[a.severity] ?? 9) - (SEVERITY_RANK[b.severity] ?? 9) || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
18
+ }
19
+ function oneLine(statement) {
20
+ return statement.replace(/\s+/gu, ' ').trim();
21
+ }
22
+ /** The `## Rules in force` section of the scope statement (no trailing blank line). */
23
+ export function rulesStatementLines(rules) {
24
+ const ordered = orderBySeverity(rules);
25
+ const shown = ordered.slice(0, RULES_STATEMENT_CAP);
26
+ const lines = [
27
+ '## Rules in force',
28
+ '',
29
+ "These steering rules apply here. Where you follow one, cite it as `[rule:<id>]`; crew shows it",
30
+ 'as cited — unchecked (a citation, never a verdict).',
31
+ '',
32
+ ...shown.map((r) => `- [rule:${r.id}] ${oneLine(r.statement)}`),
33
+ ];
34
+ if (ordered.length > shown.length) {
35
+ const more = ordered.length - shown.length;
36
+ lines.push(`- … and ${more} more rule${more === 1 ? '' : 's'} (ask for them if a step turns on one).`);
37
+ }
38
+ return lines;
39
+ }
40
+ /** The preface a send carries when rules landed since the seats last heard from crew. */
41
+ export function rulesPreface(rules) {
42
+ const ordered = orderBySeverity(rules);
43
+ return [
44
+ '<wicked-context>',
45
+ `Rule${ordered.length === 1 ? '' : 's'} remembered since your last message (cite as [rule:<id>] where you follow one):`,
46
+ ...ordered.map((r) => `- [rule:${r.id}] ${oneLine(r.statement)}`),
47
+ '</wicked-context>',
48
+ ].join('\n');
49
+ }
50
+ //# sourceMappingURL=rules-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-text.js","sourceRoot":"","sources":["../../src/decisions/rules-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC,MAAM,aAAa,GAAgD,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAE/G,mGAAmG;AACnG,MAAM,UAAU,eAAe,CAAqD,KAAuB;IACzG,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpJ,CAAC;AAED,SAAS,OAAO,CAAC,SAAiB;IAChC,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,mBAAmB,CAAC,KAAqC;IACvE,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG;QACZ,mBAAmB;QACnB,EAAE;QACF,gGAAgG;QAChG,qDAAqD;QACrD,EAAE;QACF,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;KAChE,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,aAAa,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,yCAAyC,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAAC,KAAqC;IAChE,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACvC,OAAO;QACL,kBAAkB;QAClB,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,iFAAiF;QACvH,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;QACjE,mBAAmB;KACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The two Content-Security-Policies of the editor plugin contract (DES-artifact-editor-plugins §8.2,
3
+ * EP-C1). Spelled once, pinned by test — a header is only as good as its exact text.
4
+ *
5
+ * - {@link bundleHeaders}: on the bundle response. `sandbox allow-scripts` sandboxes the bundle even
6
+ * when opened top-level; `default-src 'none'` + `connect-src 'none'` is the line that protects the
7
+ * local no-auth daemon (no fetch, XHR, WebSocket, EventSource or beacon); `form-action 'none'`,
8
+ * `base-uri 'none'`, no workers, no manifest. `script-src 'unsafe-inline'` is acceptable only
9
+ * because the bundle is ONE hashed file and nothing else can load. An editor holding
10
+ * `network.media` (first-party `wicked-page`: agent-authored pages use web images) gets
11
+ * `img-src … https:` and `font-src … https:` — a GET-only channel, never `connect-src`.
12
+ * `navigate-to` / `prefetch-src` are deliberately absent: no browser enforces them (review B1).
13
+ * - {@link shellCsp}: on studio's own shell document. A sandboxed frame may navigate ITSELF, and
14
+ * once it does the bundle's policy is gone — so the shell limits what any frame may point at:
15
+ * crew's own editors route, crew's interactive proxy (today's Document mode), `blob:` and
16
+ * `data:`. The origin is written per response because a path cannot follow `'self'`.
17
+ */
18
+ import type { EditorRecord } from './registry.js';
19
+ export declare const BUNDLE_CSP_BASE: string;
20
+ /** Exactly the §8.2 header set for one editor's bundle. */
21
+ export declare function bundleHeaders(record: Pick<EditorRecord, 'manifest' | 'firstParty'>): Record<string, string>;
22
+ /** The shell's `frame-src` policy for the request's own origin (`scheme://host[:port]`). */
23
+ export declare function shellCsp(origin: string): string;
24
+ /** `scheme://host` of a request, from what the client sent (a hosted skin may sit behind a proxy). */
25
+ export declare function requestOrigin(req: {
26
+ protocol?: string | undefined;
27
+ headers: {
28
+ host?: string | undefined;
29
+ };
30
+ }): string;
31
+ //# sourceMappingURL=csp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csp.d.ts","sourceRoot":"","sources":["../../src/editors/csp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,eAAO,MAAM,eAAe,QAIc,CAAC;AAE3C,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,YAAY,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAY3G;AAED,4FAA4F;AAC5F,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,sGAAsG;AACtG,wBAAgB,aAAa,CAAC,GAAG,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,CAIpH"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The two Content-Security-Policies of the editor plugin contract (DES-artifact-editor-plugins §8.2,
3
+ * EP-C1). Spelled once, pinned by test — a header is only as good as its exact text.
4
+ *
5
+ * - {@link bundleHeaders}: on the bundle response. `sandbox allow-scripts` sandboxes the bundle even
6
+ * when opened top-level; `default-src 'none'` + `connect-src 'none'` is the line that protects the
7
+ * local no-auth daemon (no fetch, XHR, WebSocket, EventSource or beacon); `form-action 'none'`,
8
+ * `base-uri 'none'`, no workers, no manifest. `script-src 'unsafe-inline'` is acceptable only
9
+ * because the bundle is ONE hashed file and nothing else can load. An editor holding
10
+ * `network.media` (first-party `wicked-page`: agent-authored pages use web images) gets
11
+ * `img-src … https:` and `font-src … https:` — a GET-only channel, never `connect-src`.
12
+ * `navigate-to` / `prefetch-src` are deliberately absent: no browser enforces them (review B1).
13
+ * - {@link shellCsp}: on studio's own shell document. A sandboxed frame may navigate ITSELF, and
14
+ * once it does the bundle's policy is gone — so the shell limits what any frame may point at:
15
+ * crew's own editors route, crew's interactive proxy (today's Document mode), `blob:` and
16
+ * `data:`. The origin is written per response because a path cannot follow `'self'`.
17
+ */
18
+ export const BUNDLE_CSP_BASE = "sandbox allow-scripts; default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; " +
19
+ "img-src data: blob:{MEDIA}; media-src blob:; font-src data:{MEDIA}; frame-src blob: data: about:; " +
20
+ "child-src blob: data: about:; connect-src 'none'; form-action 'none'; base-uri 'none'; " +
21
+ "worker-src 'none'; manifest-src 'none'";
22
+ /** Exactly the §8.2 header set for one editor's bundle. */
23
+ export function bundleHeaders(record) {
24
+ // `network.media` widens only for a first-party editor: a third-party one would have to ASK
25
+ // (§6.1), and no third-party editor can be installed before EP-C8.
26
+ const media = record.firstParty && record.manifest.permissions.some((p) => p.id === 'network.media') ? ' https:' : '';
27
+ return {
28
+ 'Content-Security-Policy': BUNDLE_CSP_BASE.replaceAll('{MEDIA}', media),
29
+ 'Cross-Origin-Resource-Policy': 'same-origin',
30
+ 'X-Content-Type-Options': 'nosniff',
31
+ 'X-DNS-Prefetch-Control': 'off',
32
+ 'Referrer-Policy': 'no-referrer',
33
+ 'Cache-Control': 'no-store',
34
+ };
35
+ }
36
+ /** The shell's `frame-src` policy for the request's own origin (`scheme://host[:port]`). */
37
+ export function shellCsp(origin) {
38
+ return `frame-src ${origin}/api/v1/editors/ ${origin}/api/v1/projects/ blob: data:`;
39
+ }
40
+ /** `scheme://host` of a request, from what the client sent (a hosted skin may sit behind a proxy). */
41
+ export function requestOrigin(req) {
42
+ const proto = req.protocol === 'https' ? 'https' : 'http';
43
+ const host = typeof req.headers.host === 'string' && req.headers.host !== '' ? req.headers.host : 'localhost';
44
+ return `${proto}://${host}`;
45
+ }
46
+ //# sourceMappingURL=csp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csp.js","sourceRoot":"","sources":["../../src/editors/csp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,MAAM,CAAC,MAAM,eAAe,GAC1B,oGAAoG;IACpG,oGAAoG;IACpG,yFAAyF;IACzF,wCAAwC,CAAC;AAE3C,2DAA2D;AAC3D,MAAM,UAAU,aAAa,CAAC,MAAqD;IACjF,4FAA4F;IAC5F,mEAAmE;IACnE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACtH,OAAO;QACL,yBAAyB,EAAE,eAAe,CAAC,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC;QACvE,8BAA8B,EAAE,aAAa;QAC7C,wBAAwB,EAAE,SAAS;QACnC,wBAAwB,EAAE,KAAK;QAC/B,iBAAiB,EAAE,aAAa;QAChC,eAAe,EAAE,UAAU;KAC5B,CAAC;AACJ,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,OAAO,aAAa,MAAM,oBAAoB,MAAM,+BAA+B,CAAC;AACtF,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,aAAa,CAAC,GAA8E;IAC1G,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1D,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;IAC9G,OAAO,GAAG,KAAK,MAAM,IAAI,EAAE,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * A pack install, as far as it goes before EP-C8 (DES-artifact-editor-plugins §5.2, §9.2; EP-C1).
3
+ *
4
+ * Install is human-only (§6.4) and runs garden's fail-closed gate FIRST: `pack check --json` on the
5
+ * pack root (schema, every editor's entry inside the pack, its hash, its size, nothing loaded from
6
+ * outside). Then crew reads the spec-2 manifest and lists what the operator would be asked to
7
+ * approve — the editors, the blocks and the pack's skills (§3.2 "Add these") — and REFUSES with 501
8
+ * `third_party_editors_not_available`: an unverified editor must pass the install-time conformance
9
+ * run (cases 1-12 against the bundle, headless Chrome) before it may be installed, and that run is
10
+ * EP-C8. Nothing is written. The refusal carries the check verdict and the approval list, so the
11
+ * operator sees exactly what will be asked once installs open.
12
+ */
13
+ import type { InstallEditorRefusal, PackCheckResult } from '../core/types.js';
14
+ export type PackCheckRunner = (packRoot: string) => Promise<PackCheckResult>;
15
+ /**
16
+ * Garden's gate, run as a child: `python3 <garden>/scripts/pack/check.py <pack> --json --garden-root <garden>`
17
+ * (`python` when `python3` is not on PATH). A missing garden or an unparseable verdict is a FAILED
18
+ * check with the reason — never a pass.
19
+ */
20
+ export declare function gardenPackCheck(gardenRoot: string | null): PackCheckRunner;
21
+ export declare class PackInstallError extends Error {
22
+ readonly status: 400 | 404 | 422;
23
+ readonly check?: PackCheckResult | undefined;
24
+ constructor(status: 400 | 404 | 422, message: string, check?: PackCheckResult | undefined);
25
+ }
26
+ /** What `POST /editors` reads of a pack before refusing: the approval list (§3.2). */
27
+ export declare function previewPackInstall(packRootRaw: string, check: PackCheckRunner): Promise<InstallEditorRefusal>;
28
+ //# sourceMappingURL=pack-install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-install.d.ts","sourceRoot":"","sources":["../../src/editors/pack-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAG9E,MAAM,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;AAiB7E;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,eAAe,CAiC1E;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IAEvC,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG;IAEhC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe;gBAFvB,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAChC,OAAO,EAAE,MAAM,EACN,KAAK,CAAC,EAAE,eAAe,YAAA;CAKnC;AAED,sFAAsF;AACtF,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAgEnH"}