@corenel/harness 0.10.0 → 0.11.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 (247) hide show
  1. package/dist/approvals/decisionLog.d.ts +21 -0
  2. package/dist/approvals/decisionLog.d.ts.map +1 -0
  3. package/dist/approvals/decisionLog.js +129 -0
  4. package/dist/approvals/decisionLog.js.map +1 -0
  5. package/dist/approvals/hooks.d.ts +18 -0
  6. package/dist/approvals/hooks.d.ts.map +1 -0
  7. package/dist/approvals/hooks.js +34 -0
  8. package/dist/approvals/hooks.js.map +1 -0
  9. package/dist/approvals/index.d.ts +10 -0
  10. package/dist/approvals/index.d.ts.map +1 -0
  11. package/dist/approvals/index.js +10 -0
  12. package/dist/approvals/index.js.map +1 -0
  13. package/dist/approvals/service.d.ts +46 -0
  14. package/dist/approvals/service.d.ts.map +1 -0
  15. package/dist/approvals/service.js +181 -0
  16. package/dist/approvals/service.js.map +1 -0
  17. package/dist/approvals/settings.d.ts +20 -0
  18. package/dist/approvals/settings.d.ts.map +1 -0
  19. package/dist/approvals/settings.js +32 -0
  20. package/dist/approvals/settings.js.map +1 -0
  21. package/dist/approvals/shellTools.d.ts +10 -0
  22. package/dist/approvals/shellTools.d.ts.map +1 -0
  23. package/dist/approvals/shellTools.js +17 -0
  24. package/dist/approvals/shellTools.js.map +1 -0
  25. package/dist/approvals/standingStore.d.ts +15 -0
  26. package/dist/approvals/standingStore.d.ts.map +1 -0
  27. package/dist/approvals/standingStore.js +50 -0
  28. package/dist/approvals/standingStore.js.map +1 -0
  29. package/dist/approvals/suggest.d.ts +15 -0
  30. package/dist/approvals/suggest.d.ts.map +1 -0
  31. package/dist/approvals/suggest.js +23 -0
  32. package/dist/approvals/suggest.js.map +1 -0
  33. package/dist/approvals/summarize.d.ts +7 -0
  34. package/dist/approvals/summarize.d.ts.map +1 -0
  35. package/dist/approvals/summarize.js +70 -0
  36. package/dist/approvals/summarize.js.map +1 -0
  37. package/dist/approvals/testTextStore.d.ts +6 -0
  38. package/dist/approvals/testTextStore.d.ts.map +1 -0
  39. package/dist/approvals/testTextStore.js +11 -0
  40. package/dist/approvals/testTextStore.js.map +1 -0
  41. package/dist/approvals/textStore.d.ts +9 -0
  42. package/dist/approvals/textStore.d.ts.map +1 -0
  43. package/dist/approvals/textStore.js +2 -0
  44. package/dist/approvals/textStore.js.map +1 -0
  45. package/dist/audit/canonical.d.ts +5 -0
  46. package/dist/audit/canonical.d.ts.map +1 -0
  47. package/dist/audit/canonical.js +15 -0
  48. package/dist/audit/canonical.js.map +1 -0
  49. package/dist/audit/ids.d.ts +3 -0
  50. package/dist/audit/ids.d.ts.map +1 -0
  51. package/dist/audit/ids.js +11 -0
  52. package/dist/audit/ids.js.map +1 -0
  53. package/dist/audit/index.d.ts +7 -0
  54. package/dist/audit/index.d.ts.map +1 -0
  55. package/dist/audit/index.js +7 -0
  56. package/dist/audit/index.js.map +1 -0
  57. package/dist/audit/log.d.ts +64 -0
  58. package/dist/audit/log.d.ts.map +1 -0
  59. package/dist/audit/log.js +457 -0
  60. package/dist/audit/log.js.map +1 -0
  61. package/dist/audit/recorder.d.ts +31 -0
  62. package/dist/audit/recorder.d.ts.map +1 -0
  63. package/dist/audit/recorder.js +185 -0
  64. package/dist/audit/recorder.js.map +1 -0
  65. package/dist/audit/runAudit.d.ts +38 -0
  66. package/dist/audit/runAudit.d.ts.map +1 -0
  67. package/dist/audit/runAudit.js +99 -0
  68. package/dist/audit/runAudit.js.map +1 -0
  69. package/dist/audit/verify.d.ts +14 -0
  70. package/dist/audit/verify.d.ts.map +1 -0
  71. package/dist/audit/verify.js +47 -0
  72. package/dist/audit/verify.js.map +1 -0
  73. package/dist/conversation.d.ts +31 -0
  74. package/dist/conversation.d.ts.map +1 -1
  75. package/dist/conversation.js +33 -0
  76. package/dist/conversation.js.map +1 -1
  77. package/dist/core/hash.d.ts +2 -0
  78. package/dist/core/hash.d.ts.map +1 -0
  79. package/dist/core/hash.js +9 -0
  80. package/dist/core/hash.js.map +1 -0
  81. package/dist/core/loop.d.ts +18 -0
  82. package/dist/core/loop.d.ts.map +1 -1
  83. package/dist/core/loop.js +61 -5
  84. package/dist/core/loop.js.map +1 -1
  85. package/dist/core/spawn.d.ts +59 -4
  86. package/dist/core/spawn.d.ts.map +1 -1
  87. package/dist/core/spawn.js +83 -5
  88. package/dist/core/spawn.js.map +1 -1
  89. package/dist/core/turnVerify.d.ts +25 -0
  90. package/dist/core/turnVerify.d.ts.map +1 -0
  91. package/dist/core/turnVerify.js +177 -0
  92. package/dist/core/turnVerify.js.map +1 -0
  93. package/dist/dag/executeNode.d.ts +7 -0
  94. package/dist/dag/executeNode.d.ts.map +1 -1
  95. package/dist/dag/executeNode.js +3 -0
  96. package/dist/dag/executeNode.js.map +1 -1
  97. package/dist/guardrail/guardrail.d.ts +7 -0
  98. package/dist/guardrail/guardrail.d.ts.map +1 -1
  99. package/dist/guardrail/guardrail.js +8 -0
  100. package/dist/guardrail/guardrail.js.map +1 -1
  101. package/dist/guardrail/index.d.ts +2 -2
  102. package/dist/guardrail/index.d.ts.map +1 -1
  103. package/dist/guardrail/index.js +2 -2
  104. package/dist/guardrail/index.js.map +1 -1
  105. package/dist/guardrail/permission-service.d.ts +37 -6
  106. package/dist/guardrail/permission-service.d.ts.map +1 -1
  107. package/dist/guardrail/permission-service.js +111 -11
  108. package/dist/guardrail/permission-service.js.map +1 -1
  109. package/dist/guardrail/serialize.d.ts.map +1 -1
  110. package/dist/guardrail/serialize.js +2 -0
  111. package/dist/guardrail/serialize.js.map +1 -1
  112. package/dist/guardrail/validate.d.ts.map +1 -1
  113. package/dist/guardrail/validate.js +3 -1
  114. package/dist/guardrail/validate.js.map +1 -1
  115. package/dist/install/lockfile.d.ts +13 -5
  116. package/dist/install/lockfile.d.ts.map +1 -1
  117. package/dist/install/lockfile.js +31 -2
  118. package/dist/install/lockfile.js.map +1 -1
  119. package/dist/orchestrator/agentSearch.d.ts +15 -0
  120. package/dist/orchestrator/agentSearch.d.ts.map +1 -0
  121. package/dist/orchestrator/agentSearch.js +102 -0
  122. package/dist/orchestrator/agentSearch.js.map +1 -0
  123. package/dist/orchestrator/agentTags.d.ts +13 -0
  124. package/dist/orchestrator/agentTags.d.ts.map +1 -0
  125. package/dist/orchestrator/agentTags.js +48 -0
  126. package/dist/orchestrator/agentTags.js.map +1 -0
  127. package/dist/orchestrator/branch.d.ts +9 -0
  128. package/dist/orchestrator/branch.d.ts.map +1 -0
  129. package/dist/orchestrator/branch.js +26 -0
  130. package/dist/orchestrator/branch.js.map +1 -0
  131. package/dist/orchestrator/checks.d.ts +16 -0
  132. package/dist/orchestrator/checks.d.ts.map +1 -0
  133. package/dist/orchestrator/checks.js +66 -0
  134. package/dist/orchestrator/checks.js.map +1 -0
  135. package/dist/orchestrator/planDoc.d.ts +15 -0
  136. package/dist/orchestrator/planDoc.d.ts.map +1 -0
  137. package/dist/orchestrator/planDoc.js +59 -0
  138. package/dist/orchestrator/planDoc.js.map +1 -0
  139. package/dist/orchestrator/record.d.ts +103 -0
  140. package/dist/orchestrator/record.d.ts.map +1 -0
  141. package/dist/orchestrator/record.js +168 -0
  142. package/dist/orchestrator/record.js.map +1 -0
  143. package/dist/orchestrator/sidecarTools.d.ts +7 -0
  144. package/dist/orchestrator/sidecarTools.d.ts.map +1 -0
  145. package/dist/orchestrator/sidecarTools.js +141 -0
  146. package/dist/orchestrator/sidecarTools.js.map +1 -0
  147. package/dist/prompts/config.d.ts.map +1 -1
  148. package/dist/prompts/config.js +11 -0
  149. package/dist/prompts/config.js.map +1 -1
  150. package/dist/prompts/index.d.ts +0 -6
  151. package/dist/prompts/index.d.ts.map +1 -1
  152. package/dist/prompts/index.js +10 -17
  153. package/dist/prompts/index.js.map +1 -1
  154. package/dist/prompts/library/defaults.generated.d.ts.map +1 -1
  155. package/dist/prompts/library/defaults.generated.js +29 -12
  156. package/dist/prompts/library/defaults.generated.js.map +1 -1
  157. package/dist/redact.d.ts.map +1 -1
  158. package/dist/redact.js +1 -0
  159. package/dist/redact.js.map +1 -1
  160. package/dist/rooms/findings.d.ts +14 -0
  161. package/dist/rooms/findings.d.ts.map +1 -1
  162. package/dist/rooms/findings.js +37 -0
  163. package/dist/rooms/findings.js.map +1 -1
  164. package/dist/sessions/blobGc.d.ts.map +1 -1
  165. package/dist/sessions/blobGc.js +2 -5
  166. package/dist/sessions/blobGc.js.map +1 -1
  167. package/dist/sessions/childSessions.d.ts +12 -0
  168. package/dist/sessions/childSessions.d.ts.map +1 -0
  169. package/dist/sessions/childSessions.js +43 -0
  170. package/dist/sessions/childSessions.js.map +1 -0
  171. package/dist/sessions/fileRecallStore.d.ts.map +1 -1
  172. package/dist/sessions/fileRecallStore.js +1 -3
  173. package/dist/sessions/fileRecallStore.js.map +1 -1
  174. package/dist/sessions/fileSessionStore.d.ts +11 -7
  175. package/dist/sessions/fileSessionStore.d.ts.map +1 -1
  176. package/dist/sessions/fileSessionStore.js +27 -16
  177. package/dist/sessions/fileSessionStore.js.map +1 -1
  178. package/dist/sessions/inflight.js +0 -0
  179. package/dist/sessions/inflight.js.map +1 -1
  180. package/dist/sessions/jsonl.d.ts +4 -0
  181. package/dist/sessions/jsonl.d.ts.map +1 -1
  182. package/dist/sessions/jsonl.js +1 -0
  183. package/dist/sessions/jsonl.js.map +1 -1
  184. package/dist/sessions/testFs.d.ts.map +1 -1
  185. package/dist/sessions/testFs.js +1 -1
  186. package/dist/sessions/testFs.js.map +1 -1
  187. package/dist/sidecar/host.d.ts +178 -1
  188. package/dist/sidecar/host.d.ts.map +1 -1
  189. package/dist/sidecar/host.js +363 -3
  190. package/dist/sidecar/host.js.map +1 -1
  191. package/dist/sidecar/identity.d.ts +44 -0
  192. package/dist/sidecar/identity.d.ts.map +1 -0
  193. package/dist/sidecar/identity.js +45 -0
  194. package/dist/sidecar/identity.js.map +1 -0
  195. package/dist/sidecar/server.d.ts +245 -2
  196. package/dist/sidecar/server.d.ts.map +1 -1
  197. package/dist/sidecar/server.js +833 -45
  198. package/dist/sidecar/server.js.map +1 -1
  199. package/dist/skillSource.js +1 -1
  200. package/dist/skillSource.js.map +1 -1
  201. package/dist/skills.d.ts +23 -7
  202. package/dist/skills.d.ts.map +1 -1
  203. package/dist/skills.js +62 -37
  204. package/dist/skills.js.map +1 -1
  205. package/dist/tools/callAgent.d.ts +29 -12
  206. package/dist/tools/callAgent.d.ts.map +1 -1
  207. package/dist/tools/callAgent.js +120 -14
  208. package/dist/tools/callAgent.js.map +1 -1
  209. package/dist/tools/crewList.d.ts +33 -0
  210. package/dist/tools/crewList.d.ts.map +1 -0
  211. package/dist/tools/crewList.js +66 -0
  212. package/dist/tools/crewList.js.map +1 -0
  213. package/dist/tools/files.d.ts.map +1 -1
  214. package/dist/tools/files.js +11 -5
  215. package/dist/tools/files.js.map +1 -1
  216. package/dist/tools/findAgent.d.ts +23 -0
  217. package/dist/tools/findAgent.d.ts.map +1 -0
  218. package/dist/tools/findAgent.js +58 -0
  219. package/dist/tools/findAgent.js.map +1 -0
  220. package/dist/tools/namespaces.d.ts.map +1 -1
  221. package/dist/tools/namespaces.js +7 -0
  222. package/dist/tools/namespaces.js.map +1 -1
  223. package/dist/tools/orchestrate.d.ts +4 -0
  224. package/dist/tools/orchestrate.d.ts.map +1 -0
  225. package/dist/tools/orchestrate.js +38 -0
  226. package/dist/tools/orchestrate.js.map +1 -0
  227. package/dist/tools/orchestration.d.ts +24 -0
  228. package/dist/tools/orchestration.d.ts.map +1 -0
  229. package/dist/tools/orchestration.js +173 -0
  230. package/dist/tools/orchestration.js.map +1 -0
  231. package/dist/tools/orchestrationSet.d.ts +6 -0
  232. package/dist/tools/orchestrationSet.d.ts.map +1 -0
  233. package/dist/tools/orchestrationSet.js +12 -0
  234. package/dist/tools/orchestrationSet.js.map +1 -0
  235. package/dist/tools/roomTools.d.ts +6 -0
  236. package/dist/tools/roomTools.d.ts.map +1 -1
  237. package/dist/tools/roomTools.js +26 -2
  238. package/dist/tools/roomTools.js.map +1 -1
  239. package/dist/tools/skillTool.d.ts +15 -0
  240. package/dist/tools/skillTool.d.ts.map +1 -0
  241. package/dist/tools/skillTool.js +39 -0
  242. package/dist/tools/skillTool.js.map +1 -0
  243. package/dist/tools/urlGuard.d.ts +7 -0
  244. package/dist/tools/urlGuard.d.ts.map +1 -1
  245. package/dist/tools/urlGuard.js +54 -18
  246. package/dist/tools/urlGuard.js.map +1 -1
  247. package/package.json +6 -2
@@ -0,0 +1,21 @@
1
+ import type { DecisionRecord, FileService } from '@corenel/protocol';
2
+ export declare const ACTIVE_SEGMENT = "decisions.jsonl";
3
+ export interface DecisionLogOptions {
4
+ files: () => Promise<FileService | null>;
5
+ root: string;
6
+ segmentLines?: number;
7
+ maxArchived?: number;
8
+ flushMs?: number;
9
+ flushAt?: number;
10
+ now?: () => number;
11
+ log?: (line: string) => void;
12
+ }
13
+ export interface DecisionLog {
14
+ append(rec: DecisionRecord): void;
15
+ flush(): Promise<void>;
16
+ tail(limit: number): Promise<DecisionRecord[]>;
17
+ lineCount(): Promise<number>;
18
+ clear(): Promise<void>;
19
+ }
20
+ export declare function createDecisionLog(opts: DecisionLogOptions): DecisionLog;
21
+ //# sourceMappingURL=decisionLog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decisionLog.d.ts","sourceRoot":"","sources":["../../approvals/decisionLog.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrE,eAAO,MAAM,cAAc,oBAAoB,CAAC;AAGhD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC/C,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAgBD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,WAAW,CAmGvE"}
@@ -0,0 +1,129 @@
1
+ import { flattenFiles } from '@corenel/protocol';
2
+ export const ACTIVE_SEGMENT = 'decisions.jsonl';
3
+ const ARCHIVE_RE = /^decisions-(\d+)\.jsonl$/;
4
+ function parseLines(text) {
5
+ const out = [];
6
+ for (const line of text.split('\n')) {
7
+ if (!line.trim())
8
+ continue;
9
+ try {
10
+ const v = JSON.parse(line);
11
+ if (v && v.v === 1 && typeof v.tool === 'string')
12
+ out.push(v);
13
+ }
14
+ catch {
15
+ /* a torn or hand-edited line is skipped, not fatal */
16
+ }
17
+ }
18
+ return out;
19
+ }
20
+ export function createDecisionLog(opts) {
21
+ const segmentLines = opts.segmentLines ?? 500;
22
+ const maxArchived = opts.maxArchived ?? 10;
23
+ const flushMs = opts.flushMs ?? 1000;
24
+ const flushAt = opts.flushAt ?? 50;
25
+ const now = opts.now ?? (() => Date.now());
26
+ const activePath = `${opts.root}/${ACTIVE_SEGMENT}`;
27
+ let queue = [];
28
+ let active = null;
29
+ let timer = null;
30
+ let chain = Promise.resolve();
31
+ let reported = false;
32
+ const fail = (e) => {
33
+ if (reported)
34
+ return;
35
+ reported = true;
36
+ opts.log?.(`approvals: decision log write failed (${e instanceof Error ? e.message : String(e)}); further failures are silent`);
37
+ };
38
+ async function archivedNames(fs) {
39
+ const nodes = await fs.list(opts.root).catch(() => []);
40
+ return flattenFiles(nodes)
41
+ .map((n) => n.path.split('/').pop() ?? '')
42
+ .filter((n) => ARCHIVE_RE.test(n))
43
+ .sort((a, b) => Number(ARCHIVE_RE.exec(a)[1]) - Number(ARCHIVE_RE.exec(b)[1]));
44
+ }
45
+ async function loadActive(fs) {
46
+ if (active)
47
+ return active;
48
+ const text = await fs.read(activePath).catch(() => '');
49
+ active = { text, lines: text.split('\n').filter((l) => l.trim()).length };
50
+ return active;
51
+ }
52
+ async function writeBatch(batch) {
53
+ const fs = await opts.files();
54
+ if (!fs)
55
+ return;
56
+ let cur = await loadActive(fs);
57
+ for (const line of batch) {
58
+ if (cur.lines >= segmentLines) {
59
+ await fs.write(activePath, cur.text);
60
+ await fs.rename(activePath, `${opts.root}/decisions-${now()}.jsonl`);
61
+ const names = await archivedNames(fs);
62
+ for (const old of names.slice(0, Math.max(0, names.length - maxArchived))) {
63
+ await fs.remove(`${opts.root}/${old}`).catch(() => undefined);
64
+ }
65
+ cur = active = { text: '', lines: 0 };
66
+ }
67
+ cur.text += line;
68
+ cur.lines += 1;
69
+ }
70
+ await fs.write(activePath, cur.text);
71
+ }
72
+ function flush() {
73
+ if (timer) {
74
+ clearTimeout(timer);
75
+ timer = null;
76
+ }
77
+ const batch = queue;
78
+ queue = [];
79
+ if (!batch.length)
80
+ return chain;
81
+ chain = chain.then(() => writeBatch(batch)).catch((e) => { active = null; fail(e); });
82
+ return chain;
83
+ }
84
+ return {
85
+ append(rec) {
86
+ queue.push(JSON.stringify(rec) + '\n');
87
+ if (queue.length >= flushAt) {
88
+ void flush();
89
+ return;
90
+ }
91
+ if (!timer)
92
+ timer = setTimeout(() => { timer = null; void flush(); }, flushMs);
93
+ },
94
+ flush,
95
+ async tail(limit) {
96
+ await flush();
97
+ const fs = await opts.files();
98
+ if (!fs)
99
+ return [];
100
+ const names = await archivedNames(fs);
101
+ const out = parseLines(await fs.read(activePath).catch(() => ''));
102
+ for (let i = names.length - 1; i >= 0 && out.length < limit; i--) {
103
+ out.unshift(...parseLines(await fs.read(`${opts.root}/${names[i]}`).catch(() => '')));
104
+ }
105
+ return out.slice(-limit);
106
+ },
107
+ async lineCount() {
108
+ await flush();
109
+ const fs = await opts.files();
110
+ if (!fs)
111
+ return 0;
112
+ let n = parseLines(await fs.read(activePath).catch(() => '')).length;
113
+ for (const name of await archivedNames(fs))
114
+ n += parseLines(await fs.read(`${opts.root}/${name}`).catch(() => '')).length;
115
+ return n;
116
+ },
117
+ async clear() {
118
+ await flush();
119
+ const fs = await opts.files();
120
+ if (!fs)
121
+ return;
122
+ for (const name of await archivedNames(fs))
123
+ await fs.remove(`${opts.root}/${name}`).catch(() => undefined);
124
+ await fs.remove(activePath).catch(() => undefined);
125
+ active = { text: '', lines: 0 };
126
+ },
127
+ };
128
+ }
129
+ //# sourceMappingURL=decisionLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decisionLog.js","sourceRoot":"","sources":["../../approvals/decisionLog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { ApprovalSuggestion, DecisionEvent, RecordContext, StandingApprovals } from '@corenel/protocol';
2
+ import type { ApprovalsService } from './service';
3
+ export interface ApprovalsHookOptions {
4
+ /** False = record only (a non-interactive run): the kernel gets no standing lookup. */
5
+ standing: boolean;
6
+ /** Read at decision time, so a session id learned later is recorded. */
7
+ context: () => RecordContext;
8
+ /** A suggestion the service produced. A throw is swallowed. */
9
+ onSuggestion?: (s: ApprovalSuggestion) => void;
10
+ }
11
+ export interface ApprovalsHooks {
12
+ standing?: StandingApprovals;
13
+ onDecision: (e: DecisionEvent) => void;
14
+ /** Resolves once every record started so far has settled. Never rejects. */
15
+ settled: () => Promise<void>;
16
+ }
17
+ export declare function approvalsHooks(service: ApprovalsService, opts: ApprovalsHookOptions): ApprovalsHooks;
18
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../approvals/hooks.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,uFAAuF;IACvF,QAAQ,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,OAAO,EAAE,MAAM,aAAa,CAAC;IAC7B,+DAA+D;IAC/D,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,UAAU,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IACvC,4EAA4E;IAC5E,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,oBAAoB,GAAG,cAAc,CAgCpG"}
@@ -0,0 +1,34 @@
1
+ export function approvalsHooks(service, opts) {
2
+ const inflight = new Set();
3
+ const onDecision = (e) => {
4
+ let ctx;
5
+ try {
6
+ ctx = opts.context();
7
+ }
8
+ catch {
9
+ return;
10
+ }
11
+ let started;
12
+ try {
13
+ started = service.record(e, ctx);
14
+ }
15
+ catch {
16
+ return;
17
+ }
18
+ const p = started.then((s) => {
19
+ if (!s || !opts.onSuggestion)
20
+ return;
21
+ try {
22
+ opts.onSuggestion(s);
23
+ }
24
+ catch { /* a view failure never reaches the run */ }
25
+ }, () => undefined);
26
+ inflight.add(p);
27
+ void p.finally(() => inflight.delete(p));
28
+ };
29
+ const settled = async () => {
30
+ await Promise.allSettled([...inflight]);
31
+ };
32
+ return opts.standing ? { standing: service.standing, onDecision, settled } : { onDecision, settled };
33
+ }
34
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../approvals/hooks.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,cAAc,CAAC,OAAyB,EAAE,IAA0B;IAClF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiB,CAAC;IAE1C,MAAM,UAAU,GAAG,CAAC,CAAgB,EAAQ,EAAE;QAC5C,IAAI,GAAkB,CAAC;QACvB,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,OAA2C,CAAC;QAChD,IAAI,CAAC;YACH,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,MAAM,CAAC,GAAkB,OAAO,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,EAAE;YACJ,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO;YACrC,IAAI,CAAC;gBAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,0CAA0C,CAAC,CAAC;QACpF,CAAC,EACD,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACF,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChB,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,IAAmB,EAAE;QACxC,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACvG,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { summarizeArgs, rawArgs, isPathLike } from './summarize';
2
+ export { createDecisionLog, ACTIVE_SEGMENT, type DecisionLog, type DecisionLogOptions } from './decisionLog';
3
+ export { createStandingStore, subjectMatchesRule, type StandingStore } from './standingStore';
4
+ export { isShellTool, isShellToolKey, isNeverStanding } from './shellTools';
5
+ export { approvalsHooks, type ApprovalsHookOptions, type ApprovalsHooks } from './hooks';
6
+ export type { TextStore } from './textStore';
7
+ export { createSettingsStore, DEFAULT_SETTINGS, type SettingsStore } from './settings';
8
+ export { allowStreak, shouldSuggest, toolKey, type SuggestInput } from './suggest';
9
+ export { createApprovals, isApprovalRelevant, toRecord, type ApprovalsService, type ApprovalsServiceOptions, type ScopeLocation, } from './service';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../approvals/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,KAAK,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AACzF,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACnF,OAAO,EACL,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAC7C,KAAK,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,KAAK,aAAa,GACxE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,10 @@
1
+ /* Approval suggestions + local permission decision log. */
2
+ export { summarizeArgs, rawArgs, isPathLike } from './summarize.js';
3
+ export { createDecisionLog, ACTIVE_SEGMENT } from './decisionLog.js';
4
+ export { createStandingStore, subjectMatchesRule } from './standingStore.js';
5
+ export { isShellTool, isShellToolKey, isNeverStanding } from './shellTools.js';
6
+ export { approvalsHooks } from './hooks.js';
7
+ export { createSettingsStore, DEFAULT_SETTINGS } from './settings.js';
8
+ export { allowStreak, shouldSuggest, toolKey } from './suggest.js';
9
+ export { createApprovals, isApprovalRelevant, toRecord, } from './service.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../approvals/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAA6C,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAsB,MAAM,iBAAiB,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAkD,MAAM,SAAS,CAAC;AAEzF,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAsB,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAqB,MAAM,WAAW,CAAC;AACnF,OAAO,EACL,eAAe,EAAE,kBAAkB,EAAE,QAAQ,GAE9C,MAAM,WAAW,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { ApprovalScope, ApprovalSuggestion, ApprovalsSettings, DecisionEvent, DecisionRecord, FileService, RecordContext, StandingApprovals, StandingRule, SuggestionChoice } from '@corenel/protocol';
2
+ import type { TextStore } from './textStore';
3
+ export interface ScopeLocation {
4
+ files: () => Promise<FileService | null>;
5
+ root: string;
6
+ /** The workspace's identity (its FileService cacheId). Keys workspace-scope
7
+ * standing rules; absent = no workspace-scope rules for this workspace. */
8
+ workspaceId?: string;
9
+ }
10
+ export interface ApprovalsServiceOptions {
11
+ workspace: () => ScopeLocation | null;
12
+ /** Where the GLOBAL decision log lives. Standing rules and settings do not. */
13
+ global: ScopeLocation;
14
+ standing: {
15
+ global: TextStore;
16
+ workspace: (id: string) => TextStore;
17
+ };
18
+ settings: TextStore;
19
+ log?: (line: string) => void;
20
+ now?: () => number;
21
+ }
22
+ export interface ApprovalsService {
23
+ record(e: DecisionEvent, ctx: RecordContext): Promise<ApprovalSuggestion | null>;
24
+ standing: StandingApprovals;
25
+ respond(s: ApprovalSuggestion, choice: SuggestionChoice): Promise<void>;
26
+ listRules(): Promise<{
27
+ workspace: StandingRule[];
28
+ global: StandingRule[];
29
+ }>;
30
+ revoke(scope: ApprovalScope, tool: string): Promise<void>;
31
+ settings(): Promise<ApprovalsSettings>;
32
+ /** Strict read for a caller about to write the whole settings object back
33
+ * (final review M5) -- see SettingsStore.readStrict's doc. */
34
+ settingsStrict(): Promise<ApprovalsSettings>;
35
+ saveSettings(s: ApprovalsSettings): Promise<void>;
36
+ logSize(): Promise<{
37
+ workspace: number;
38
+ global: number;
39
+ }>;
40
+ clearLog(scope: ApprovalScope): Promise<void>;
41
+ flush(): Promise<void>;
42
+ }
43
+ export declare function isApprovalRelevant(e: DecisionEvent): boolean;
44
+ export declare function toRecord(e: DecisionEvent, ctx: RecordContext, captureRaw: boolean, ts: string): DecisionRecord;
45
+ export declare function createApprovals(opts: ApprovalsServiceOptions): ApprovalsService;
46
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../approvals/service.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EACnF,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,gBAAgB,EAC9E,MAAM,mBAAmB,CAAC;AAQ3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb;+EAC2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,aAAa,GAAG,IAAI,CAAC;IACtC,+EAA+E;IAC/E,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,SAAS,CAAA;KAAE,CAAC;IACtE,QAAQ,EAAE,SAAS,CAAC;IACpB,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACjF,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,CAAC,CAAC,EAAE,kBAAkB,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,SAAS,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,YAAY,EAAE,CAAC;QAAC,MAAM,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC,CAAC;IAC5E,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,QAAQ,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACvC;kEAC8D;IAC9D,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC7C,YAAY,CAAC,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,aAAa,GAAG,OAAO,CAE5D;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,cAAc,CAU9G;AASD,wBAAgB,eAAe,CAAC,IAAI,EAAE,uBAAuB,GAAG,gBAAgB,CAyJ/E"}
@@ -0,0 +1,181 @@
1
+ import { isCheckpointTool } from '@corenel/protocol';
2
+ import { createDecisionLog } from './decisionLog.js';
3
+ import { createSettingsStore } from './settings.js';
4
+ import { isShellTool, isShellToolKey } from './shellTools.js';
5
+ import { createStandingStore } from './standingStore.js';
6
+ import { allowStreak, shouldSuggest, toolKey } from './suggest.js';
7
+ import { rawArgs, summarizeArgs } from './summarize.js';
8
+ export function isApprovalRelevant(e) {
9
+ return !(e.by === 'policy' && e.decision === 'allow' && e.subject.mutates !== true);
10
+ }
11
+ export function toRecord(e, ctx, captureRaw, ts) {
12
+ return {
13
+ v: 1, ts, ...ctx,
14
+ tool: e.subject.name,
15
+ ...(e.subject.address ? { address: e.subject.address } : {}),
16
+ ...(e.subject.mutates !== undefined ? { mutates: e.subject.mutates } : {}),
17
+ level: e.level, decision: e.decision, by: e.by,
18
+ args: summarizeArgs(e.input),
19
+ ...(captureRaw ? { raw: rawArgs(e.input) } : {}),
20
+ };
21
+ }
22
+ const SEED_TAIL = 500;
23
+ export function createApprovals(opts) {
24
+ const now = opts.now ?? (() => Date.now());
25
+ const settingsStore = createSettingsStore({ store: opts.settings });
26
+ const globalStanding = createStandingStore({ store: opts.standing.global });
27
+ /* Scope state is keyed by the concrete FileService INSTANCE (plus root) and
28
+ * its log is bound to that instance. A cached state never re-resolves
29
+ * loc.files(): that returns whatever is active at CALL time, so a folder
30
+ * switch inside the log's flush window would write one workspace's queued
31
+ * records into another's log, and two folders sharing a cacheId (dir:<name>)
32
+ * would share one state. `all` is only for flush(). */
33
+ const byInstance = new WeakMap();
34
+ const noFiles = new Map();
35
+ const all = new Set();
36
+ const suggested = new Set();
37
+ async function stateFor(loc) {
38
+ const fs = await loc.files();
39
+ let byRoot = noFiles;
40
+ if (fs) {
41
+ byRoot = byInstance.get(fs) ?? new Map();
42
+ byInstance.set(fs, byRoot);
43
+ }
44
+ let s = byRoot.get(loc.root);
45
+ if (!s) {
46
+ s = {
47
+ log: createDecisionLog({ files: async () => fs, root: loc.root, ...(opts.log ? { log: opts.log } : {}) }),
48
+ streaks: null,
49
+ };
50
+ byRoot.set(loc.root, s);
51
+ all.add(s);
52
+ }
53
+ return s;
54
+ }
55
+ /** The workspace-scope standing store, or null when the active workspace has
56
+ * no identity to key it by (or there is no workspace). */
57
+ function workspaceStanding(ws) {
58
+ return ws?.workspaceId ? createStandingStore({ store: opts.standing.workspace(ws.workspaceId) }) : null;
59
+ }
60
+ /** The standing store for a scope, falling back to global when the workspace
61
+ * scope has no store. */
62
+ function standingFor(scope, ws) {
63
+ return (scope === 'workspace' ? workspaceStanding(ws) : null) ?? globalStanding;
64
+ }
65
+ function active() {
66
+ const ws = opts.workspace();
67
+ return ws ? { ws, loc: ws, scope: 'workspace' } : { ws, loc: opts.global, scope: 'global' };
68
+ }
69
+ async function streaksOf(s) {
70
+ if (s.streaks)
71
+ return s.streaks;
72
+ const tail = await s.log.tail(SEED_TAIL);
73
+ const m = new Map();
74
+ for (const key of new Set(tail.map(toolKey)))
75
+ m.set(key, allowStreak(tail, key));
76
+ s.streaks = m;
77
+ return m;
78
+ }
79
+ async function anyStanding(subject) {
80
+ const wsStore = workspaceStanding(opts.workspace());
81
+ const stores = [globalStanding, ...(wsStore ? [wsStore] : [])];
82
+ for (const st of stores) {
83
+ if (await st.matches(subject).catch(() => false))
84
+ return true;
85
+ }
86
+ return false;
87
+ }
88
+ // A checkpoint never matches a standing rule, including one written before
89
+ // checkpoints existed (see CHECKPOINT_TOOLS): only the policy lifts its ask.
90
+ const standing = {
91
+ matches: (subject) => (isCheckpointTool(subject) || isShellTool(subject) ? Promise.resolve(false) : anyStanding(subject).catch(() => false)),
92
+ };
93
+ return {
94
+ standing,
95
+ async record(e, ctx) {
96
+ try {
97
+ if (!isApprovalRelevant(e))
98
+ return null;
99
+ const settings = await settingsStore.read();
100
+ const { ws, loc, scope } = active();
101
+ const s = await stateFor(loc);
102
+ const streaks = await streaksOf(s);
103
+ s.log.append(toRecord(e, ctx, settings.captureRawArgs, new Date(now()).toISOString()));
104
+ if (e.by !== 'human')
105
+ return null;
106
+ // Never offer to stop asking at a checkpoint or for a shell tool: both are
107
+ // logged, never suggested.
108
+ if (isCheckpointTool(e.subject) || isShellTool(e.subject))
109
+ return null;
110
+ const key = toolKey({ tool: e.subject.name, ...(e.subject.address ? { address: e.subject.address } : {}) });
111
+ const streak = e.decision === 'deny' ? 0 : (streaks.get(key) ?? 0) + 1;
112
+ streaks.set(key, streak);
113
+ if (e.decision !== 'allow')
114
+ return null;
115
+ const runKey = `${ctx.runId ?? ''}::${key}`;
116
+ if (suggested.has(runKey))
117
+ return null;
118
+ const file = await standingFor(scope, ws).read();
119
+ const dismissal = file.dismissed.find((d) => d.tool === key);
120
+ const due = shouldSuggest({
121
+ key, streak, threshold: settings.threshold,
122
+ standing: await anyStanding(e.subject),
123
+ ...(dismissal ? { dismissal } : {}),
124
+ });
125
+ if (!due)
126
+ return null;
127
+ suggested.add(runKey);
128
+ return { tool: key, count: streak, scope, scopeChoice: !!workspaceStanding(ws) };
129
+ }
130
+ catch {
131
+ return null;
132
+ }
133
+ },
134
+ async respond(sug, choice) {
135
+ const ws = opts.workspace();
136
+ if ((choice === 'workspace' || choice === 'global') && isShellToolKey(sug.tool)) {
137
+ throw new Error(`shell tools are never always-allowed: ${sug.tool}`);
138
+ }
139
+ if (isShellToolKey(sug.tool))
140
+ return;
141
+ if (choice === 'workspace' || choice === 'global') {
142
+ if (isCheckpointTool(sug.tool))
143
+ return;
144
+ await standingFor(choice, ws).addRule(sug.tool, 'suggestion');
145
+ return;
146
+ }
147
+ const threshold = (await settingsStore.read()).threshold;
148
+ await standingFor(sug.scope, ws).setDismissal(choice === 'never' ? { tool: sug.tool } : { tool: sug.tool, snoozeUntilCount: sug.count + threshold });
149
+ },
150
+ async listRules() {
151
+ const wsStore = workspaceStanding(opts.workspace());
152
+ return {
153
+ workspace: wsStore ? (await wsStore.read()).rules : [],
154
+ global: (await globalStanding.read()).rules,
155
+ };
156
+ },
157
+ async revoke(scope, tool) {
158
+ await standingFor(scope, opts.workspace()).removeRule(tool);
159
+ },
160
+ settings: () => settingsStore.read(),
161
+ settingsStrict: () => settingsStore.readStrict(),
162
+ saveSettings: (s) => settingsStore.write(s),
163
+ async logSize() {
164
+ const ws = opts.workspace();
165
+ return {
166
+ workspace: ws ? await (await stateFor(ws)).log.lineCount() : 0,
167
+ global: await (await stateFor(opts.global)).log.lineCount(),
168
+ };
169
+ },
170
+ async clearLog(scope) {
171
+ const ws = opts.workspace();
172
+ const s = await stateFor(scope === 'workspace' && ws ? ws : opts.global);
173
+ await s.log.clear();
174
+ s.streaks = new Map();
175
+ },
176
+ async flush() {
177
+ await Promise.all([...all].map((s) => s.log.flush()));
178
+ },
179
+ };
180
+ }
181
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../approvals/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ApprovalsSettings } from '@corenel/protocol';
2
+ import type { TextStore } from './textStore';
3
+ export declare const DEFAULT_SETTINGS: ApprovalsSettings;
4
+ export interface SettingsStore {
5
+ read(): Promise<ApprovalsSettings>;
6
+ /** Like `read()`, but a genuine I/O failure PROPAGATES instead of silently
7
+ * falling back to defaults -- missing (ENOENT) still means defaults, and
8
+ * malformed-but-READABLE JSON still falls back too (that is a corrupt file,
9
+ * not an unreadable one). Only for a caller that is about to WRITE the
10
+ * whole settings object back after changing one field: reading leniently
11
+ * there would let a transient EBUSY/EACCES silently reset every other
12
+ * field to its default (final review M5) -- `corenel approvals set` uses
13
+ * this, `list`'s best-effort display does not. */
14
+ readStrict(): Promise<ApprovalsSettings>;
15
+ write(s: ApprovalsSettings): Promise<void>;
16
+ }
17
+ export declare function createSettingsStore(opts: {
18
+ store: TextStore;
19
+ }): SettingsStore;
20
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../approvals/settings.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,gBAAgB,EAAE,iBAAuE,CAAC;AASvG,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACnC;;;;;;;sDAOkD;IAClD,UAAU,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACzC,KAAK,CAAC,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,GAAG,aAAa,CAgB7E"}
@@ -0,0 +1,32 @@
1
+ export const DEFAULT_SETTINGS = { version: 1, threshold: 5, captureRawArgs: false };
2
+ function coerce(v) {
3
+ if (!v || typeof v !== 'object' || Array.isArray(v))
4
+ return { ...DEFAULT_SETTINGS };
5
+ const o = v;
6
+ const t = typeof o.threshold === 'number' && Number.isFinite(o.threshold) ? Math.max(0, Math.floor(o.threshold)) : DEFAULT_SETTINGS.threshold;
7
+ return { version: 1, threshold: t, captureRawArgs: o.captureRawArgs === true };
8
+ }
9
+ export function createSettingsStore(opts) {
10
+ const parse = (raw) => {
11
+ if (raw == null)
12
+ return { ...DEFAULT_SETTINGS };
13
+ try {
14
+ return coerce(JSON.parse(raw));
15
+ }
16
+ catch {
17
+ return { ...DEFAULT_SETTINGS };
18
+ }
19
+ };
20
+ return {
21
+ async read() {
22
+ return parse(await opts.store.read().catch(() => null));
23
+ },
24
+ async readStrict() {
25
+ return parse(await opts.store.read());
26
+ },
27
+ async write(s) {
28
+ await opts.store.write(JSON.stringify(coerce(s), null, 2) + '\n');
29
+ },
30
+ };
31
+ }
32
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../approvals/settings.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,gBAAgB,GAAsB,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;AAEvG,SAAS,MAAM,CAAC,CAAU;IACxB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACpF,MAAM,CAAC,GAAG,CAA4B,CAAC;IACvC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC;IAC9I,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;AACjF,CAAC;AAgBD,MAAM,UAAU,mBAAmB,CAAC,IAA0B;IAC5D,MAAM,KAAK,GAAG,CAAC,GAAkB,EAAqB,EAAE;QACtD,IAAI,GAAG,IAAI,IAAI;YAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAAC;QAChD,IAAI,CAAC;YAAC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAAC;QAAC,CAAC;IACnF,CAAC,CAAC;IACF,OAAO;QACL,KAAK,CAAC,IAAI;YACR,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,KAAK,CAAC,UAAU;YACd,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,CAAC;YACX,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACpE,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ApprovalSubject } from '@corenel/protocol';
2
+ export declare function isShellToolKey(key: string): boolean;
3
+ export declare function isShellTool(subject: ApprovalSubject): boolean;
4
+ /** Never answered by a standing rule and never offered as one: a shell-type
5
+ * tool (above) or a checkpoint (plan, push, pull request, delegation --
6
+ * @corenel/protocol CHECKPOINT_TOOLS, decided by a person every time). The
7
+ * one predicate a prompt-side lookup (the daemon's, the ACP gate's) uses to
8
+ * mark an ask standing-eligible, so it agrees with createApprovals. */
9
+ export declare function isNeverStanding(subject: ApprovalSubject): boolean;
10
+ //# sourceMappingURL=shellTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellTools.d.ts","sourceRoot":"","sources":["../../approvals/shellTools.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKzD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAE7D;AAED;;;;uEAIuE;AACvE,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAEjE"}
@@ -0,0 +1,17 @@
1
+ import { isCheckpointTool } from '@corenel/protocol';
2
+ const SHELL_KEYS = new Set(['sidecar:shell_exec', 'shell', 'sidecar_shell_exec', 'proc_start', 'proc_stop', 'sidecar:run_check', 'sidecar_run_check']);
3
+ export function isShellToolKey(key) {
4
+ return key.startsWith('shell:') || SHELL_KEYS.has(key);
5
+ }
6
+ export function isShellTool(subject) {
7
+ return isShellToolKey(subject.name) || (!!subject.address && isShellToolKey(subject.address));
8
+ }
9
+ /** Never answered by a standing rule and never offered as one: a shell-type
10
+ * tool (above) or a checkpoint (plan, push, pull request, delegation --
11
+ * @corenel/protocol CHECKPOINT_TOOLS, decided by a person every time). The
12
+ * one predicate a prompt-side lookup (the daemon's, the ACP gate's) uses to
13
+ * mark an ask standing-eligible, so it agrees with createApprovals. */
14
+ export function isNeverStanding(subject) {
15
+ return isShellTool(subject) || isCheckpointTool(subject);
16
+ }
17
+ //# sourceMappingURL=shellTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shellTools.js","sourceRoot":"","sources":["../../approvals/shellTools.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,UAAU,GAAwB,IAAI,GAAG,CAAC,CAAC,oBAAoB,EAAE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAE5K,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAwB;IAClD,OAAO,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAChG,CAAC;AAED;;;;uEAIuE;AACvE,MAAM,UAAU,eAAe,CAAC,OAAwB;IACtD,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ApprovalSubject, Dismissal, StandingFile, StandingRule } from '@corenel/protocol';
2
+ import type { TextStore } from './textStore';
3
+ export declare function subjectMatchesRule(subject: ApprovalSubject, tool: string): boolean;
4
+ export interface StandingStore {
5
+ read(): Promise<StandingFile>;
6
+ matches(subject: ApprovalSubject): Promise<boolean>;
7
+ addRule(tool: string, source: StandingRule['source']): Promise<void>;
8
+ removeRule(tool: string): Promise<void>;
9
+ setDismissal(d: Dismissal): Promise<void>;
10
+ }
11
+ export declare function createStandingStore(opts: {
12
+ store: TextStore;
13
+ now?: () => string;
14
+ }): StandingStore;
15
+ //# sourceMappingURL=standingStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standingStore.d.ts","sourceRoot":"","sources":["../../approvals/standingStore.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAElF;AAgBD,MAAM,WAAW,aAAa;IAC5B,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9B,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,YAAY,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAE,GAAG,aAAa,CA8BjG"}