@they-juanreina/compost-cli 0.1.3 → 0.1.4

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 (205) hide show
  1. package/dist/commands/agreement.d.ts.map +1 -1
  2. package/dist/commands/agreement.js +2 -2
  3. package/dist/commands/agreement.js.map +1 -1
  4. package/dist/commands/backup.d.ts +3 -0
  5. package/dist/commands/backup.d.ts.map +1 -0
  6. package/dist/commands/backup.js +31 -0
  7. package/dist/commands/backup.js.map +1 -0
  8. package/dist/commands/chat.d.ts.map +1 -1
  9. package/dist/commands/chat.js +3 -2
  10. package/dist/commands/chat.js.map +1 -1
  11. package/dist/commands/export.d.ts.map +1 -1
  12. package/dist/commands/export.js +2 -2
  13. package/dist/commands/export.js.map +1 -1
  14. package/dist/commands/import.d.ts.map +1 -1
  15. package/dist/commands/import.js +5 -0
  16. package/dist/commands/import.js.map +1 -1
  17. package/dist/commands/ingest.d.ts.map +1 -1
  18. package/dist/commands/ingest.js +1 -0
  19. package/dist/commands/ingest.js.map +1 -1
  20. package/dist/commands/init.d.ts.map +1 -1
  21. package/dist/commands/init.js +1 -0
  22. package/dist/commands/init.js.map +1 -1
  23. package/dist/commands/reindex.d.ts.map +1 -1
  24. package/dist/commands/reindex.js +18 -8
  25. package/dist/commands/reindex.js.map +1 -1
  26. package/dist/commands/search.d.ts.map +1 -1
  27. package/dist/commands/search.js +10 -0
  28. package/dist/commands/search.js.map +1 -1
  29. package/dist/commands/secrets.d.ts.map +1 -1
  30. package/dist/commands/secrets.js +13 -11
  31. package/dist/commands/secrets.js.map +1 -1
  32. package/dist/commands/setup.d.ts.map +1 -1
  33. package/dist/commands/setup.js +5 -1
  34. package/dist/commands/setup.js.map +1 -1
  35. package/dist/commands/setupItem.d.ts +26 -0
  36. package/dist/commands/setupItem.d.ts.map +1 -0
  37. package/dist/commands/setupItem.js +145 -0
  38. package/dist/commands/setupItem.js.map +1 -0
  39. package/dist/commands/transcribe.d.ts.map +1 -1
  40. package/dist/commands/transcribe.js +25 -8
  41. package/dist/commands/transcribe.js.map +1 -1
  42. package/dist/commands/watch.d.ts.map +1 -1
  43. package/dist/commands/watch.js +53 -6
  44. package/dist/commands/watch.js.map +1 -1
  45. package/dist/errors.d.ts +5 -1
  46. package/dist/errors.d.ts.map +1 -1
  47. package/dist/errors.js +6 -0
  48. package/dist/errors.js.map +1 -1
  49. package/dist/exporters/pdf.d.ts.map +1 -1
  50. package/dist/exporters/pdf.js +2 -1
  51. package/dist/exporters/pdf.js.map +1 -1
  52. package/dist/legacy_client.d.ts.map +1 -1
  53. package/dist/legacy_client.js +2 -1
  54. package/dist/legacy_client.js.map +1 -1
  55. package/dist/lib/artifacts.d.ts +3 -1
  56. package/dist/lib/artifacts.d.ts.map +1 -1
  57. package/dist/lib/artifacts.js +15 -20
  58. package/dist/lib/artifacts.js.map +1 -1
  59. package/dist/lib/backup.d.ts +37 -0
  60. package/dist/lib/backup.d.ts.map +1 -0
  61. package/dist/lib/backup.js +57 -0
  62. package/dist/lib/backup.js.map +1 -0
  63. package/dist/lib/childEnv.d.ts +13 -0
  64. package/dist/lib/childEnv.d.ts.map +1 -0
  65. package/dist/lib/childEnv.js +45 -0
  66. package/dist/lib/childEnv.js.map +1 -0
  67. package/dist/lib/events.d.ts +10 -0
  68. package/dist/lib/events.d.ts.map +1 -1
  69. package/dist/lib/events.js +20 -1
  70. package/dist/lib/events.js.map +1 -1
  71. package/dist/lib/journal.d.ts +0 -4
  72. package/dist/lib/journal.d.ts.map +1 -1
  73. package/dist/lib/journal.js +8 -18
  74. package/dist/lib/journal.js.map +1 -1
  75. package/dist/lib/legacyNative.d.ts +1 -8
  76. package/dist/lib/legacyNative.d.ts.map +1 -1
  77. package/dist/lib/legacyNative.js +10 -23
  78. package/dist/lib/legacyNative.js.map +1 -1
  79. package/dist/lib/migrate.d.ts.map +1 -1
  80. package/dist/lib/migrate.js +9 -2
  81. package/dist/lib/migrate.js.map +1 -1
  82. package/dist/lib/nativeRuntime.d.ts +31 -0
  83. package/dist/lib/nativeRuntime.d.ts.map +1 -1
  84. package/dist/lib/nativeRuntime.js +38 -0
  85. package/dist/lib/nativeRuntime.js.map +1 -1
  86. package/dist/lib/pathSafe.d.ts +8 -0
  87. package/dist/lib/pathSafe.d.ts.map +1 -0
  88. package/dist/lib/pathSafe.js +12 -0
  89. package/dist/lib/pathSafe.js.map +1 -0
  90. package/dist/lib/provisionNative.d.ts.map +1 -1
  91. package/dist/lib/provisionNative.js +6 -2
  92. package/dist/lib/provisionNative.js.map +1 -1
  93. package/dist/lib/reads.d.ts.map +1 -1
  94. package/dist/lib/reads.js +2 -2
  95. package/dist/lib/reads.js.map +1 -1
  96. package/dist/lib/redact.d.ts +7 -0
  97. package/dist/lib/redact.d.ts.map +1 -0
  98. package/dist/lib/redact.js +45 -0
  99. package/dist/lib/redact.js.map +1 -0
  100. package/dist/lib/rerun.d.ts.map +1 -1
  101. package/dist/lib/rerun.js +3 -9
  102. package/dist/lib/rerun.js.map +1 -1
  103. package/dist/lib/retrieve.d.ts.map +1 -1
  104. package/dist/lib/retrieve.js +2 -1
  105. package/dist/lib/retrieve.js.map +1 -1
  106. package/dist/lib/saturate.js +3 -3
  107. package/dist/lib/saturate.js.map +1 -1
  108. package/dist/lib/secrets.d.ts.map +1 -1
  109. package/dist/lib/secrets.js +84 -77
  110. package/dist/lib/secrets.js.map +1 -1
  111. package/dist/lib/seedResolve.d.ts +5 -0
  112. package/dist/lib/seedResolve.d.ts.map +1 -1
  113. package/dist/lib/seedResolve.js +12 -3
  114. package/dist/lib/seedResolve.js.map +1 -1
  115. package/dist/lib/session.d.ts.map +1 -1
  116. package/dist/lib/session.js +6 -4
  117. package/dist/lib/session.js.map +1 -1
  118. package/dist/lib/sessionId.d.ts +9 -0
  119. package/dist/lib/sessionId.d.ts.map +1 -0
  120. package/dist/lib/sessionId.js +37 -0
  121. package/dist/lib/sessionId.js.map +1 -0
  122. package/dist/lib/setup.d.ts +4 -0
  123. package/dist/lib/setup.d.ts.map +1 -1
  124. package/dist/lib/setup.js +28 -23
  125. package/dist/lib/setup.js.map +1 -1
  126. package/dist/lib/setupItem.d.ts +99 -0
  127. package/dist/lib/setupItem.d.ts.map +1 -0
  128. package/dist/lib/setupItem.js +262 -0
  129. package/dist/lib/setupItem.js.map +1 -0
  130. package/dist/lib/setupWizard.d.ts +2 -0
  131. package/dist/lib/setupWizard.d.ts.map +1 -1
  132. package/dist/lib/setupWizard.js +144 -20
  133. package/dist/lib/setupWizard.js.map +1 -1
  134. package/dist/lib/snap.d.ts.map +1 -1
  135. package/dist/lib/snap.js +5 -0
  136. package/dist/lib/snap.js.map +1 -1
  137. package/dist/lib/stdin.d.ts +5 -0
  138. package/dist/lib/stdin.d.ts.map +1 -0
  139. package/dist/lib/stdin.js +12 -0
  140. package/dist/lib/stdin.js.map +1 -0
  141. package/dist/lib/transcribeNative.d.ts +4 -9
  142. package/dist/lib/transcribeNative.d.ts.map +1 -1
  143. package/dist/lib/transcribeNative.js +11 -26
  144. package/dist/lib/transcribeNative.js.map +1 -1
  145. package/dist/lib/validate.d.ts.map +1 -1
  146. package/dist/lib/validate.js +2 -1
  147. package/dist/lib/validate.js.map +1 -1
  148. package/dist/lib/version.d.ts.map +1 -1
  149. package/dist/lib/version.js +2 -10
  150. package/dist/lib/version.js.map +1 -1
  151. package/dist/llm/adapter.d.ts +5 -0
  152. package/dist/llm/adapter.d.ts.map +1 -1
  153. package/dist/llm/adapter.js +25 -8
  154. package/dist/llm/adapter.js.map +1 -1
  155. package/dist/llm/http.d.ts +22 -1
  156. package/dist/llm/http.d.ts.map +1 -1
  157. package/dist/llm/http.js +52 -30
  158. package/dist/llm/http.js.map +1 -1
  159. package/dist/llm/providers/anthropic.d.ts.map +1 -1
  160. package/dist/llm/providers/anthropic.js +6 -9
  161. package/dist/llm/providers/anthropic.js.map +1 -1
  162. package/dist/llm/providers/ollama.d.ts.map +1 -1
  163. package/dist/llm/providers/ollama.js +2 -7
  164. package/dist/llm/providers/ollama.js.map +1 -1
  165. package/dist/llm/providers/openai_compatible.d.ts.map +1 -1
  166. package/dist/llm/providers/openai_compatible.js +2 -7
  167. package/dist/llm/providers/openai_compatible.js.map +1 -1
  168. package/dist/logging.d.ts.map +1 -1
  169. package/dist/logging.js +3 -1
  170. package/dist/logging.js.map +1 -1
  171. package/dist/loops/embed_worker.d.ts +3 -0
  172. package/dist/loops/embed_worker.d.ts.map +1 -1
  173. package/dist/loops/embed_worker.js +11 -4
  174. package/dist/loops/embed_worker.js.map +1 -1
  175. package/dist/loops/legacy_worker.d.ts.map +1 -1
  176. package/dist/loops/legacy_worker.js +12 -3
  177. package/dist/loops/legacy_worker.js.map +1 -1
  178. package/dist/loops/supervisor.d.ts +4 -0
  179. package/dist/loops/supervisor.d.ts.map +1 -1
  180. package/dist/loops/supervisor.js +6 -2
  181. package/dist/loops/supervisor.js.map +1 -1
  182. package/dist/loops/transcribe_worker.d.ts +3 -0
  183. package/dist/loops/transcribe_worker.d.ts.map +1 -1
  184. package/dist/loops/transcribe_worker.js +13 -4
  185. package/dist/loops/transcribe_worker.js.map +1 -1
  186. package/dist/output.d.ts.map +1 -1
  187. package/dist/output.js +5 -4
  188. package/dist/output.js.map +1 -1
  189. package/dist/render/glyphs.d.ts +30 -0
  190. package/dist/render/glyphs.d.ts.map +1 -0
  191. package/dist/render/glyphs.js +38 -0
  192. package/dist/render/glyphs.js.map +1 -0
  193. package/dist/render/human.d.ts +2 -0
  194. package/dist/render/human.d.ts.map +1 -1
  195. package/dist/render/human.js +12 -4
  196. package/dist/render/human.js.map +1 -1
  197. package/dist/router.d.ts.map +1 -1
  198. package/dist/router.js +16 -3
  199. package/dist/router.js.map +1 -1
  200. package/dist/transcriber_client.d.ts.map +1 -1
  201. package/dist/transcriber_client.js +2 -1
  202. package/dist/transcriber_client.js.map +1 -1
  203. package/package.json +4 -4
  204. package/templates/AGENTS.md +1 -1
  205. package/transcriber/app/transcribe_cli.py +15 -1
@@ -0,0 +1,145 @@
1
+ import { CompostError, isCompostError } from '../errors.js';
2
+ import { HF_ALIASES, resolveSecret } from '../lib/secrets.js';
3
+ import { runSetup } from '../lib/setup.js';
4
+ import { actionsFor, runItem, validateHfToken, } from '../lib/setupItem.js';
5
+ import { readStdin } from '../lib/stdin.js';
6
+ import { emit, emitError, getOutputOpts } from '../output.js';
7
+ import { statusGlyph } from '../render/glyphs.js';
8
+ /** Everything except `validate` changes state; only renew needs a value. */
9
+ const READONLY = new Set(['validate']);
10
+ const NEEDS_VALUE = new Set(['renew']);
11
+ /**
12
+ * Gate a `setup item run` invocation before it mutates anything. Extracted so
13
+ * the (security-relevant) refusal logic is unit-testable without driving
14
+ * commander: renew/set need a value (piped, so it stays out of shell history),
15
+ * and any mutating action run non-interactively requires an explicit --yes.
16
+ * `interactive` is the REAL terminal signal (`process.stdout.isTTY`), not the
17
+ * `--human` output flag: `--human` is user/agent-forceable even when piped, so
18
+ * gating on it would let an automated caller add `--human` to skip the --yes
19
+ * confirmation. Throws INVALID_INPUT otherwise; returns void when the call may
20
+ * proceed.
21
+ */
22
+ export function assertRunAllowed(id, action, ctx) {
23
+ if (NEEDS_VALUE.has(action) && ctx.value === '') {
24
+ throw new CompostError('INVALID_INPUT', `Pipe the new value: \`printf %s "$TOKEN" | compost setup item run ${id} ${action}\` (keeps it out of shell history).`);
25
+ }
26
+ if (!READONLY.has(action) && !ctx.interactive && ctx.yes !== true) {
27
+ throw new CompostError('INVALID_INPUT', `Refusing a mutating action non-interactively without --yes.`);
28
+ }
29
+ }
30
+ /**
31
+ * Register the `compost setup item …` group on the existing `setup` command.
32
+ * This is the per-item maintenance surface: it has its OWN `command:'setup
33
+ * item …'` JSON envelope, so the read-only `compost setup` report is untouched
34
+ * byte-for-byte. The TTY wizard and the plugin skill are meant to wrap these
35
+ * verbs rather than reimplement the behavior.
36
+ */
37
+ export function registerSetupItem(setup) {
38
+ const item = setup
39
+ .command('item')
40
+ .description('Inspect and fix ONE setup prerequisite at a time — change/renew/revoke a token, re-validate a live credential, repair a single check.');
41
+ // setup item list — the directory of what's addressable + its actions.
42
+ item
43
+ .command('list')
44
+ .description('List every setup item with its status and the lifecycle actions available on it.')
45
+ .action(async (_flags, cmd) => {
46
+ const out = getOutputOpts(cmd);
47
+ try {
48
+ // Reuse the canonical runSetup probes (single source of truth) and
49
+ // filter, rather than maintaining a separate per-id probe. It runs the
50
+ // full check set — acceptable for an on-demand command; a dedicated
51
+ // single-check probe is a future optimization, not a correctness need.
52
+ const report = await runSetup({ cwd: process.cwd() });
53
+ const items = report.checks.map((c) => ({
54
+ id: c.id,
55
+ label: c.label,
56
+ status: c.status,
57
+ actions: actionsFor(c.id),
58
+ }));
59
+ emit({ command: 'setup item list', schema_version: '1.0', items }, out, (d) => d.items
60
+ .map((it) => {
61
+ const acts = it.actions.length
62
+ ? ` actions: ${it.actions.map((a) => a.id).join(', ')}`
63
+ : '';
64
+ return ` ${statusGlyph(it.status)} ${it.id.padEnd(28)} ${it.label}${acts}`;
65
+ })
66
+ .join('\n'));
67
+ }
68
+ catch (err) {
69
+ if (isCompostError(err))
70
+ emitError(err, out);
71
+ throw err;
72
+ }
73
+ });
74
+ // setup item show <id> [--validate] — re-probe ONE item; --validate adds the
75
+ // live credential signal as a SEPARATE field (presence vs validity).
76
+ item
77
+ .command('show')
78
+ .description('Show one setup item: its presence status, fix, and actions. --validate adds a live credential probe.')
79
+ .argument('<id>', 'Stable check id, e.g. hf-token (see `setup item list`)')
80
+ .option('--validate', 'Also probe whether a stored credential is LIVE (network; credential items only)')
81
+ .action(async (id, flags, cmd) => {
82
+ const out = getOutputOpts(cmd);
83
+ try {
84
+ const report = await runSetup({ cwd: process.cwd() });
85
+ const check = report.checks.find((c) => c.id === id);
86
+ if (!check) {
87
+ throw new CompostError('INVALID_INPUT', `Unknown item "${id}". Run \`compost setup item list\` for valid ids.`);
88
+ }
89
+ const actions = actionsFor(id);
90
+ let live;
91
+ if (flags.validate === true && id === 'hf-token') {
92
+ const found = resolveSecret('HUGGINGFACE_TOKEN', { aliases: HF_ALIASES });
93
+ live = found
94
+ ? await validateHfToken(found.value)
95
+ : { status: 'fail', detail: 'no token set to validate' };
96
+ }
97
+ emit({ command: 'setup item show', id, check, actions, ...(live ? { live } : {}) }, out, (d) => {
98
+ const lines = [`${d.check.label} [${d.check.status}] — ${d.check.detail}`];
99
+ if (d.check.fix)
100
+ lines.push(` fix: ${d.check.fix}`);
101
+ if (d.live)
102
+ lines.push(` live: ${d.live.status} — ${d.live.detail}`);
103
+ if (d.actions.length)
104
+ lines.push(` actions: ${d.actions.map((a) => `${a.id} (${a.side})`).join(', ')}`);
105
+ return lines.join('\n');
106
+ });
107
+ if (check.status === 'fail' || live?.status === 'fail')
108
+ process.exitCode = 1;
109
+ }
110
+ catch (err) {
111
+ if (isCompostError(err))
112
+ emitError(err, out);
113
+ throw err;
114
+ }
115
+ });
116
+ // setup item run <id> <action> [--yes] — the generic mutation primitive.
117
+ item
118
+ .command('run')
119
+ .description('Run one lifecycle action on one item, e.g. `setup item run hf-token renew`.')
120
+ .argument('<id>', 'Stable check id, e.g. hf-token, model:bge-m3, secret-perms:<path>')
121
+ .argument('<action>', 'validate | renew | forget | pull | fix')
122
+ .option('-y, --yes', 'Confirm a mutating action when not at a TTY (required for --json / piped use)')
123
+ .action(async (id, action, flags, cmd) => {
124
+ const out = getOutputOpts(cmd);
125
+ try {
126
+ const value = NEEDS_VALUE.has(action) ? (await readStdin()).trim() : '';
127
+ assertRunAllowed(id, action, {
128
+ // Real terminal, not the forceable --human flag (see assertRunAllowed).
129
+ interactive: process.stdout.isTTY === true,
130
+ yes: flags.yes === true,
131
+ value,
132
+ });
133
+ const result = await runItem(id, action, value ? { value } : {});
134
+ emit({ command: 'setup item run', ...result }, out, (d) => `${d.id} ${d.action}: ${d.recheck.status} — ${d.recheck.detail}`);
135
+ if (result.recheck.status === 'fail')
136
+ process.exitCode = 1;
137
+ }
138
+ catch (err) {
139
+ if (isCompostError(err))
140
+ emitError(err, out);
141
+ throw err;
142
+ }
143
+ });
144
+ }
145
+ //# sourceMappingURL=setupItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupItem.js","sourceRoot":"","sources":["../../src/commands/setupItem.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAmB,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EACL,UAAU,EAGV,OAAO,EAEP,eAAe,GAChB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD,4EAA4E;AAC5E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;AACtC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;AAEtC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC9B,EAAU,EACV,MAAc,EACd,GAA0D;IAE1D,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC;QAChD,MAAM,IAAI,YAAY,CACpB,eAAe,EACf,qEAAqE,EAAE,IAAI,MAAM,qCAAqC,CACvH,CAAA;IACH,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QAClE,MAAM,IAAI,YAAY,CACpB,eAAe,EACf,6DAA6D,CAC9D,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,MAAM,IAAI,GAAG,KAAK;SACf,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CACV,uIAAuI,CACxI,CAAA;IAEH,uEAAuE;IACvE,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kFAAkF,CAAC;SAC/F,MAAM,CAAC,KAAK,EAAE,MAAe,EAAE,GAAY,EAAE,EAAE;QAC9C,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,CAAC;YACH,mEAAmE;YACnE,uEAAuE;YACvE,oEAAoE;YACpE,uEAAuE;YACvE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YACrD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1B,CAAC,CAAC,CAAA;YACH,IAAI,CACF,EAAE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,EAC5D,GAAG,EACH,CAAC,CAA0B,EAAE,EAAE,CAC7B,CAAC,CAAC,KAAK;iBACJ,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;gBACV,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM;oBAC5B,CAAC,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACxD,CAAC,CAAC,EAAE,CAAA;gBACN,OAAO,KAAK,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,CAAA;YAC7E,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC,CAChB,CAAA;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,cAAc,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YAC5C,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,6EAA6E;IAC7E,qEAAqE;IACrE,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CACV,sGAAsG,CACvG;SACA,QAAQ,CAAC,MAAM,EAAE,wDAAwD,CAAC;SAC1E,MAAM,CACL,YAAY,EACZ,iFAAiF,CAClF;SACA,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,KAA6B,EAAE,GAAY,EAAE,EAAE;QACxE,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YACrD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;YACpD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,YAAY,CACpB,eAAe,EACf,iBAAiB,EAAE,mDAAmD,CACvE,CAAA;YACH,CAAC;YACD,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC,CAAA;YAC9B,IAAI,IAA4B,CAAA;YAChC,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;gBACjD,MAAM,KAAK,GAAG,aAAa,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAA;gBACzE,IAAI,GAAG,KAAK;oBACV,CAAC,CAAC,MAAM,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;oBACpC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAA;YAC5D,CAAC;YACD,IAAI,CACF,EAAE,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAC7E,GAAG,EACH,CAAC,CAAuE,EAAE,EAAE;gBAC1E,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;gBAC1E,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG;oBAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAA;gBACpD,IAAI,CAAC,CAAC,IAAI;oBAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;gBACrE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM;oBAClB,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACpF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzB,CAAC,CACF,CAAA;YACD,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,EAAE,MAAM,KAAK,MAAM;gBAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QAC9E,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,cAAc,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YAC5C,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,yEAAyE;IACzE,IAAI;SACD,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,6EAA6E,CAAC;SAC1F,QAAQ,CAAC,MAAM,EAAE,mEAAmE,CAAC;SACrF,QAAQ,CAAC,UAAU,EAAE,wCAAwC,CAAC;SAC9D,MAAM,CACL,WAAW,EACX,+EAA+E,CAChF;SACA,MAAM,CAAC,KAAK,EAAE,EAAU,EAAE,MAAc,EAAE,KAAwB,EAAE,GAAY,EAAE,EAAE;QACnF,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;YACvE,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE;gBAC3B,wEAAwE;gBACxE,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI;gBAC1C,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,IAAI;gBACvB,KAAK;aACN,CAAC,CAAA;YACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAChE,IAAI,CACF,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,EAAE,EACxC,GAAG,EACH,CAAC,CAAgB,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CACvF,CAAA;YACD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,cAAc,CAAC,GAAG,CAAC;gBAAE,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YAC5C,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"transcribe.d.ts","sourceRoot":"","sources":["../../src/commands/transcribe.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA+BxC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiIzD"}
1
+ {"version":3,"file":"transcribe.d.ts","sourceRoot":"","sources":["../../src/commands/transcribe.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAwCxC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4IzD"}
@@ -4,6 +4,7 @@ import { CompostError, isCompostError } from '../errors.js';
4
4
  import { isAppleSilicon, pickRuntime, resolveNativeRuntime } from '../lib/nativeRuntime.js';
5
5
  import { HF_ALIASES, resolveSecret } from '../lib/secrets.js';
6
6
  import { resolveSeedPath } from '../lib/seedResolve.js';
7
+ import { assertSessionContained } from '../lib/sessionId.js';
7
8
  import { applySidecar } from '../lib/speakers.js';
8
9
  import { transcribeNative } from '../lib/transcribeNative.js';
9
10
  import { emit, emitError, getOutputOpts } from '../output.js';
@@ -18,6 +19,14 @@ function resolveSource(seedPath, sessionId) {
18
19
  throw new CompostError('FILE_NOT_FOUND', `No source media in ${dir}`);
19
20
  return join(dir, src);
20
21
  }
22
+ /** After a transcript lands, re-apply persisted speaker names (#177) and render
23
+ * the human-readable transcript.md. No-op if the file isn't there. */
24
+ function finalizeTranscript(path) {
25
+ if (!existsSync(path))
26
+ return;
27
+ applySidecar(path);
28
+ writeTranscriptMd(path);
29
+ }
21
30
  export function registerTranscribe(program) {
22
31
  program
23
32
  .command('transcribe')
@@ -31,10 +40,16 @@ export function registerTranscribe(program) {
31
40
  .option('--model <id>', 'ASR model id (engine default when omitted)')
32
41
  .option('--python <path>', 'Native-runtime venv python (or env COMPOST_TRANSCRIBER_PYTHON)')
33
42
  .option('--transcriber-dir <path>', 'transcriber/ package dir for the native runtime (or env COMPOST_TRANSCRIBER_DIR)')
43
+ .addHelpText('after', '\nExamples:\n $ compost transcribe S001\n $ compost transcribe S001 --language es-CO --runtime native')
34
44
  .action(async (sessionId, flags, cmd) => {
35
45
  const out = getOutputOpts(cmd);
36
46
  try {
37
47
  const seedPath = resolveSeedPath(process.cwd(), flags.seed);
48
+ // Guard both branches: sessionId is passed verbatim to the native Python
49
+ // entrypoint (--session-id, no regex there) and the Docker route. Validate
50
+ // it (regex + containment under <seed>/sessions/) before any path join or
51
+ // subprocess (#211 followup).
52
+ assertSessionContained(seedPath, sessionId);
38
53
  const source = resolveSource(seedPath, sessionId);
39
54
  if (flags.runtime !== undefined &&
40
55
  flags.runtime !== 'native' &&
@@ -62,6 +77,11 @@ export function registerTranscribe(program) {
62
77
  // secrets.env) and pass it explicitly to the python subprocess, so a
63
78
  // keychain-stored token works even though it isn't in process.env.
64
79
  const hf = resolveSecret('HUGGINGFACE_TOKEN', { aliases: HF_ALIASES });
80
+ // Native ASR captures the subprocess's stdio, so the terminal is blank
81
+ // for minutes otherwise. Heartbeat to stderr in human mode at a TTY.
82
+ if (out.human && process.stderr.isTTY === true) {
83
+ process.stderr.write(`transcribing ${sessionId} (native; this can take minutes)…\n`);
84
+ }
65
85
  const resp = transcribeNative(seedPath, sessionId, source, {
66
86
  python: native.python,
67
87
  transcriberDir: native.transcriberDir,
@@ -70,10 +90,7 @@ export function registerTranscribe(program) {
70
90
  ...(flags.language !== undefined ? { language: flags.language } : {}),
71
91
  ...(hf ? { env: { HUGGINGFACE_TOKEN: hf.value } } : {}),
72
92
  });
73
- if (existsSync(resp.transcript_path)) {
74
- applySidecar(resp.transcript_path); // re-apply persisted speaker names (#177)
75
- writeTranscriptMd(resp.transcript_path);
76
- }
93
+ finalizeTranscript(resp.transcript_path);
77
94
  emit({
78
95
  status: resp.status,
79
96
  command: 'transcribe',
@@ -91,11 +108,11 @@ export function registerTranscribe(program) {
91
108
  '`compost setup` to enable native Apple-Silicon transcription (~20× faster).\n');
92
109
  }
93
110
  const client = new TranscriberClient(flags.baseUrl !== undefined ? { baseUrl: flags.baseUrl } : {});
94
- const resp = await client.transcribe(source, sessionId, seedPath, flags.language);
95
- if (existsSync(resp.transcript_path)) {
96
- applySidecar(resp.transcript_path); // re-apply persisted speaker names (#177)
97
- writeTranscriptMd(resp.transcript_path);
111
+ if (out.human && process.stderr.isTTY === true) {
112
+ process.stderr.write(`transcribing ${sessionId} (docker; this can take minutes)…\n`);
98
113
  }
114
+ const resp = await client.transcribe(source, sessionId, seedPath, flags.language);
115
+ finalizeTranscript(resp.transcript_path);
99
116
  emit({
100
117
  status: resp.status,
101
118
  command: 'transcribe',
@@ -1 +1 @@
1
- {"version":3,"file":"transcribe.js","sourceRoot":"","sources":["../../src/commands/transcribe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transcribe.js","sourceRoot":"","sources":["../../src/commands/transcribe.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAaxC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiDpD"}
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAaxC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoGpD"}
@@ -1,4 +1,4 @@
1
- import { isCompostError } from '../errors.js';
1
+ import { errMessage, isCompostError } from '../errors.js';
2
2
  import { resolveSeedPath } from '../lib/seedResolve.js';
3
3
  import { runLive, runSupervisorOnce } from '../loops/supervisor.js';
4
4
  import { emit, emitError, getOutputOpts } from '../output.js';
@@ -9,12 +9,19 @@ export function registerWatch(program) {
9
9
  .option('--once', 'Drain the queues once and exit instead of looping')
10
10
  .option('--seed <name>', 'Seed (default: the only seed under ./Seeds)')
11
11
  .option('--interval-ms <ms>', 'Poll interval for live mode', '2000')
12
+ .addHelpText('after', '\nExamples:\n $ compost watch --once # process the queue once, then exit (CI-friendly)\n $ compost watch # live: keep draining every 2s until Ctrl-C')
12
13
  .action(async (flags, cmd) => {
13
14
  const out = getOutputOpts(cmd);
14
15
  try {
15
16
  const seedPath = resolveSeedPath(process.cwd(), flags.seed);
17
+ // Per-item progress to stderr in human mode at a TTY only; stdout (the
18
+ // machine result) stays clean and the agent/JSON path is unaffected.
19
+ const showProgress = out.human && process.stderr.isTTY === true;
20
+ const onProgress = showProgress
21
+ ? (msg) => process.stderr.write(`${msg}\n`)
22
+ : undefined;
16
23
  if (flags.once === true) {
17
- const result = await runSupervisorOnce(seedPath);
24
+ const result = await runSupervisorOnce(seedPath, onProgress ? { onProgress } : {});
18
25
  // A drained-but-failed job is not success (#164): non-ok status + exit 1
19
26
  // so scripts/CI can gate, with the failures surfaced inline.
20
27
  const ok = result.failures.length === 0;
@@ -32,13 +39,53 @@ export function registerWatch(program) {
32
39
  const controller = new AbortController();
33
40
  process.on('SIGINT', () => controller.abort());
34
41
  process.on('SIGTERM', () => controller.abort());
35
- process.stderr.write(`${JSON.stringify({ status: 'watching', seed: seedPath, interval_ms: Number(flags.intervalMs ?? 2000) })}\n`);
42
+ const intervalMs = Number(flags.intervalMs ?? 2000);
43
+ // Track silent failures across passes so a long-lived watch can report a
44
+ // non-zero exit instead of always exiting 0 on Ctrl-C (#164 follow-up).
45
+ let crashedPasses = 0;
46
+ let failedJobPasses = 0;
47
+ let lastDeadJobs = 0;
48
+ if (out.human) {
49
+ process.stderr.write(`watching ${seedPath} every ${intervalMs}ms — Ctrl-C to stop\n`);
50
+ }
51
+ else {
52
+ process.stderr.write(`${JSON.stringify({ status: 'watching', seed: seedPath, interval_ms: intervalMs })}\n`);
53
+ }
36
54
  await runLive(seedPath, {
37
- intervalMs: Number(flags.intervalMs ?? 2000),
55
+ intervalMs,
38
56
  signal: controller.signal,
39
- onError: (loop, err) => process.stderr.write(`${JSON.stringify({ loop, error: err instanceof Error ? err.message : String(err) })}\n`),
57
+ ...(onProgress ? { onProgress } : {}),
58
+ onError: (loop, err) => {
59
+ crashedPasses += 1;
60
+ const message = errMessage(err);
61
+ if (out.human)
62
+ process.stderr.write(`loop ${loop} error: ${message}\n`);
63
+ else
64
+ process.stderr.write(`${JSON.stringify({ loop, error: message })}\n`);
65
+ },
66
+ onPass: (result) => {
67
+ if (result.failures.length > 0)
68
+ failedJobPasses += 1;
69
+ lastDeadJobs = result.dead_jobs;
70
+ // Surface drained-but-failed / dead jobs that don't throw, so they
71
+ // aren't only visible via `compost status`/`jobs`.
72
+ if (out.human && (result.failures.length > 0 || result.dead_jobs > 0)) {
73
+ process.stderr.write(`pass: ${result.failures.length} failure(s), ${result.dead_jobs} dead job(s) — see \`compost jobs\`\n`);
74
+ }
75
+ },
40
76
  });
41
- emit({ status: 'stopped', command: 'watch' }, out);
77
+ const clean = crashedPasses === 0 && failedJobPasses === 0 && lastDeadJobs === 0;
78
+ emit({
79
+ status: clean ? 'stopped' : 'stopped_with_failures',
80
+ command: 'watch',
81
+ crashed_passes: crashedPasses,
82
+ failed_job_passes: failedJobPasses,
83
+ dead_jobs: lastDeadJobs,
84
+ }, out, (d) => clean
85
+ ? 'watch stopped — no failures'
86
+ : `watch stopped with failures: ${d.crashed_passes} crashed pass(es), ${d.failed_job_passes} pass(es) with failed jobs, ${d.dead_jobs} dead job(s)`);
87
+ if (!clean)
88
+ process.exitCode = 1;
42
89
  }
43
90
  catch (err) {
44
91
  if (isCompostError(err))
@@ -1 +1 @@
1
- {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
package/dist/errors.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type CompostErrorCode = 'NOT_IMPLEMENTED' | 'NOT_IN_SEED' | 'INVALID_INPUT' | 'FILE_NOT_FOUND' | 'IO_ERROR' | 'CONFIG_ERROR' | 'PROVIDER_ERROR' | 'SCHEMA_VIOLATION' | 'INTERNAL';
1
+ export type CompostErrorCode = 'NOT_IMPLEMENTED' | 'NOT_IN_SEED' | 'INVALID_INPUT' | 'FILE_NOT_FOUND' | 'IO_ERROR' | 'CONFIG_ERROR' | 'PROVIDER_ERROR' | 'PROVIDER_AUTH' | 'SCHEMA_VIOLATION' | 'INTERNAL';
2
2
  export declare class CompostError extends Error {
3
3
  readonly code: CompostErrorCode;
4
4
  constructor(code: CompostErrorCode, message: string, options?: {
@@ -6,4 +6,8 @@ export declare class CompostError extends Error {
6
6
  });
7
7
  }
8
8
  export declare function isCompostError(value: unknown): value is CompostError;
9
+ /** Best-effort human string for any thrown value: an Error's message, else its
10
+ * String() form. The single source of truth for the `err instanceof Error ?
11
+ * err.message : String(err)` idiom used across the catch sites. */
12
+ export declare function errMessage(err: unknown): string;
9
13
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB,aAAa,GACb,eAAe,GACf,gBAAgB,GAChB,UAAU,GACV,cAAc,GACd,gBAAgB,GAChB,kBAAkB,GAClB,UAAU,CAAA;AAEd,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAgB,IAAI,EAAE,gBAAgB,CAAA;gBAE1B,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;CAKvF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB,aAAa,GACb,eAAe,GACf,gBAAgB,GAChB,UAAU,GACV,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,UAAU,CAAA;AAEd,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAgB,IAAI,EAAE,gBAAgB,CAAA;gBAE1B,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;CAKvF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAED;;mEAEmE;AACnE,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAE/C"}
package/dist/errors.js CHANGED
@@ -9,4 +9,10 @@ export class CompostError extends Error {
9
9
  export function isCompostError(value) {
10
10
  return value instanceof CompostError;
11
11
  }
12
+ /** Best-effort human string for any thrown value: an Error's message, else its
13
+ * String() form. The single source of truth for the `err instanceof Error ?
14
+ * err.message : String(err)` idiom used across the catch sites. */
15
+ export function errMessage(err) {
16
+ return err instanceof Error ? err.message : String(err);
17
+ }
12
18
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrB,IAAI,CAAkB;IAEtC,YAAY,IAAsB,EAAE,OAAe,EAAE,UAA+B,EAAE;QACpF,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAClF,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,YAAY,CAAA;AACtC,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrB,IAAI,CAAkB;IAEtC,YAAY,IAAsB,EAAE,OAAe,EAAE,UAA+B,EAAE;QACpF,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAClF,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,YAAY,CAAA;AACtC,CAAC;AAED;;mEAEmE;AACnE,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AACzD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../src/exporters/pdf.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,WAAW,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAI9C;sFACsF;AACtF,eAAO,MAAM,gBAAgB,EAAE,WAqB9B,CAAA;AAED;4EAC4E;AAC5E,wBAAsB,eAAe,CACnC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,WAA8B,GACvC,OAAO,CAAC,MAAM,CAAC,CAIjB"}
1
+ {"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../src/exporters/pdf.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,WAAW,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAI9C;sFACsF;AACtF,eAAO,MAAM,gBAAgB,EAAE,WAyB9B,CAAA;AAED;4EAC4E;AAC5E,wBAAsB,eAAe,CACnC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,WAA8B,GACvC,OAAO,CAAC,MAAM,CAAC,CAIjB"}
@@ -3,6 +3,7 @@ import { mkdtempSync, writeFileSync } from 'node:fs';
3
3
  import { tmpdir } from 'node:os';
4
4
  import { join } from 'node:path';
5
5
  import { promisify } from 'node:util';
6
+ import { scrubbedEnv } from '../lib/childEnv.js';
6
7
  import { reportToHtml } from './html.js';
7
8
  const execFileAsync = promisify(execFile);
8
9
  /** Default renderer: headless Chromium (Chrome/Chromium must be on PATH).
@@ -21,7 +22,7 @@ export const chromiumRenderer = async (html, outPath) => {
21
22
  `--print-to-pdf=${outPath}`,
22
23
  '--no-pdf-header-footer',
23
24
  `file://${htmlPath}`,
24
- ]);
25
+ ], { env: scrubbedEnv() });
25
26
  return;
26
27
  }
27
28
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../src/exporters/pdf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAoB,YAAY,EAAE,MAAM,WAAW,CAAA;AAG1D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAEzC;sFACsF;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAAgB,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IACnE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACzC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACrC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,sBAAsB,CAAC,CAAA;IACtF,IAAI,OAAgB,CAAA;IACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,GAAG,EAAE;gBACvB,YAAY;gBACZ,cAAc;gBACd,kBAAkB,OAAO,EAAE;gBAC3B,wBAAwB;gBACxB,UAAU,QAAQ,EAAE;aACrB,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,GAAG,GAAG,CAAA;QACf,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;AAC9F,CAAC,CAAA;AAED;4EAC4E;AAC5E,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAmB,EACnB,OAAe,EACf,WAAwB,gBAAgB;IAExC,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACjC,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,IAAI,CAAA;AACb,CAAC"}
1
+ {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../src/exporters/pdf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAoB,YAAY,EAAE,MAAM,WAAW,CAAA;AAG1D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAEzC;sFACsF;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAAgB,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IACnE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACzC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACrC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,sBAAsB,CAAC,CAAA;IACtF,IAAI,OAAgB,CAAA;IACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,aAAa,CACjB,GAAG,EACH;gBACE,YAAY;gBACZ,cAAc;gBACd,kBAAkB,OAAO,EAAE;gBAC3B,wBAAwB;gBACxB,UAAU,QAAQ,EAAE;aACrB,EACD,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,CACvB,CAAA;YACD,OAAM;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,GAAG,GAAG,CAAA;QACf,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;AAC9F,CAAC,CAAA;AAED;4EAC4E;AAC5E,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAmB,EACnB,OAAe,EACf,WAAwB,gBAAgB;IAExC,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACjC,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"legacy_client.d.ts","sourceRoot":"","sources":["../src/legacy_client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAA;IACjC;oEACgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC;0CACsC;IACtC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,eAAe,GAAG,QAAQ;gBADzE,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,eAAe,GAAG,QAAQ;CAK5E;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,sEAAsE;AACtE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,IAAI,GAAE,mBAAwB;IAMpC,MAAM,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CA+BtE"}
1
+ {"version":3,"file":"legacy_client.d.ts","sourceRoot":"","sources":["../src/legacy_client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAA;IACjC;oEACgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC;0CACsC;IACtC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,eAAe,GAAG,QAAQ;gBADzE,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,eAAe,GAAG,QAAQ;CAK5E;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,sEAAsE;AACtE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,IAAI,GAAE,mBAAwB;IAMpC,MAAM,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CA+BtE"}
@@ -1,3 +1,4 @@
1
+ import { errMessage } from './errors.js';
1
2
  import { resolveFetch } from './llm/http.js';
2
3
  export class LegacyServiceError extends Error {
3
4
  kind;
@@ -27,7 +28,7 @@ export class LegacyIngestClient {
27
28
  });
28
29
  }
29
30
  catch (err) {
30
- throw new LegacyServiceError(`legacy-ingest service unreachable at ${this.base}: ${err instanceof Error ? err.message : String(err)}`, 'down');
31
+ throw new LegacyServiceError(`legacy-ingest service unreachable at ${this.base}: ${errMessage(err)}`, 'down');
31
32
  }
32
33
  if (res.status === 503)
33
34
  throw new LegacyServiceError('legacy-ingest dep missing (install transcriber [legacy] extras)', 'dep_missing');
@@ -1 +1 @@
1
- {"version":3,"file":"legacy_client.js","sourceRoot":"","sources":["../src/legacy_client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAwB5C,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzB;IAFlB,YACE,OAAe,EACC,IAAyD;QAEzE,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,SAAI,GAAJ,IAAI,CAAqD;QAGzE,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAQD,sEAAsE;AACtE,MAAM,OAAO,kBAAkB;IACZ,IAAI,CAAQ;IACZ,SAAS,CAAW;IACpB,SAAS,CAAQ;IAElC,YAAY,OAA4B,EAAE;QACxC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,uBAAuB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACxE,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAA,CAAC,oCAAoC;IACjF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAwB;QACnC,IAAI,GAAmC,CAAA;QACvC,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,IAAI,gBAAgB,EAAE;gBACvD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;aAC1B,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,kBAAkB,CAC1B,wCAAwC,IAAI,CAAC,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACxG,MAAM,CACP,CAAA;QACH,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YACpB,MAAM,IAAI,kBAAkB,CAC1B,iEAAiE,EACjE,aAAa,CACd,CAAA;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwB,CAAA;YACtD,MAAM,IAAI,kBAAkB,CAAC,kBAAkB,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,EAAE,eAAe,CAAC,CAAA;QAC7F,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,kBAAkB,CAC1B,yBAAyB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,EACvD,QAAQ,CACT,CAAA;QACH,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAA;IACnD,CAAC;CACF"}
1
+ {"version":3,"file":"legacy_client.js","sourceRoot":"","sources":["../src/legacy_client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAwB5C,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzB;IAFlB,YACE,OAAe,EACC,IAAyD;QAEzE,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,SAAI,GAAJ,IAAI,CAAqD;QAGzE,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAQD,sEAAsE;AACtE,MAAM,OAAO,kBAAkB;IACZ,IAAI,CAAQ;IACZ,SAAS,CAAW;IACpB,SAAS,CAAQ;IAElC,YAAY,OAA4B,EAAE;QACxC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,uBAAuB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACxE,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAA,CAAC,oCAAoC;IACjF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAwB;QACnC,IAAI,GAAmC,CAAA;QACvC,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,IAAI,gBAAgB,EAAE;gBACvD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;aAC1B,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,kBAAkB,CAC1B,wCAAwC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,GAAG,CAAC,EAAE,EACvE,MAAM,CACP,CAAA;QACH,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YACpB,MAAM,IAAI,kBAAkB,CAC1B,iEAAiE,EACjE,aAAa,CACd,CAAA;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwB,CAAA;YACtD,MAAM,IAAI,kBAAkB,CAAC,kBAAkB,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,EAAE,eAAe,CAAC,CAAA;QAC7F,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,kBAAkB,CAC1B,yBAAyB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,EACvD,QAAQ,CACT,CAAA;QACH,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAA;IACnD,CAAC;CACF"}
@@ -1,4 +1,4 @@
1
- import Database from 'better-sqlite3';
1
+ import type Database from 'better-sqlite3';
2
2
  import { type AiInputBundle, type Author } from './events.js';
3
3
  export interface CreatedArtifact {
4
4
  id: string;
@@ -34,6 +34,8 @@ export declare function createTheme(seedPath: string, input: CreateThemeInput):
34
34
  interface CreateEventRow {
35
35
  id: string;
36
36
  artifact_kind: string;
37
+ /** actor_id of the create event — used to refuse a self-endorse (#236). */
38
+ actor_id: string;
37
39
  }
38
40
  /**
39
41
  * Human-id form for an artifact ref: `H-NNN`, `C-slug`, `T-slug` — the id
@@ -1 +1 @@
1
- {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/lib/artifacts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/lib/artifacts.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,7 @@
1
1
  import { existsSync, mkdirSync, readdirSync, rmSync, writeFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
- import Database from 'better-sqlite3';
4
3
  import { CompostError } from '../errors.js';
5
- import { artifactId, emitCreate, emitEndorse, emitReject, emitUpdate, openSeedEvents, } from './events.js';
4
+ import { artifactId, emitCreate, emitEndorse, emitReject, emitUpdate, openReadonlyEvents, openSeedEvents, } from './events.js';
6
5
  // ---------------------------------------------------------------- helpers
7
6
  /** Next sequential H-NNN in highlights/, scanning existing files. */
8
7
  function nextHighlightId(dir) {
@@ -171,7 +170,7 @@ export function tryResolveHumanRef(db, ref) {
171
170
  if (!HUMAN_REF_RE.test(ref))
172
171
  return undefined;
173
172
  return db
174
- .prepare("SELECT id, artifact_kind, artifact_id FROM events WHERE action = 'create' AND json_extract(payload, '$.id') = ? ORDER BY ts, rowid LIMIT 1")
173
+ .prepare("SELECT id, artifact_kind, artifact_id, actor_id FROM events WHERE action = 'create' AND json_extract(payload, '$.id') = ? ORDER BY ts, rowid LIMIT 1")
175
174
  .get(ref);
176
175
  }
177
176
  /**
@@ -190,12 +189,12 @@ function findCreateEvent(db, artifactRef) {
190
189
  if (latest) {
191
190
  const kind = latest[1];
192
191
  return db
193
- .prepare("SELECT id, artifact_kind, artifact_id FROM events WHERE artifact_kind = ? AND action = 'create' ORDER BY ts DESC, rowid DESC LIMIT 1")
192
+ .prepare("SELECT id, artifact_kind, artifact_id, actor_id FROM events WHERE artifact_kind = ? AND action = 'create' ORDER BY ts DESC, rowid DESC LIMIT 1")
194
193
  .get(kind);
195
194
  }
196
195
  if (/^[a-f0-9]{8,64}$/i.test(artifactRef)) {
197
196
  return db
198
- .prepare("SELECT id, artifact_kind, artifact_id FROM events WHERE artifact_id LIKE ? AND action = 'create' ORDER BY ts, rowid LIMIT 1")
197
+ .prepare("SELECT id, artifact_kind, artifact_id, actor_id FROM events WHERE artifact_id LIKE ? AND action = 'create' ORDER BY ts, rowid LIMIT 1")
199
198
  .get(`${artifactRef.toLowerCase()}%`);
200
199
  }
201
200
  if (!HUMAN_REF_RE.test(artifactRef)) {
@@ -220,11 +219,7 @@ function latestEventId(db, artifactId) {
220
219
  * blame's ref resolution so `compost endorse <id-from-create>` works (#168).
221
220
  */
222
221
  export function endorseArtifact(seedPath, artifactRef, researcherId) {
223
- const eventsDb = join(seedPath, '.compost', 'events.sqlite');
224
- if (!existsSync(eventsDb)) {
225
- throw new CompostError('FILE_NOT_FOUND', `No events.sqlite in seed; nothing to endorse.`);
226
- }
227
- const db = new Database(eventsDb, { readonly: true, fileMustExist: true });
222
+ const db = openReadonlyEvents(seedPath, 'No events.sqlite in seed; nothing to endorse.');
228
223
  let createRow;
229
224
  // Same (artifact_id, researcher) endorse already on the timeline → idempotent
230
225
  // no-op (#169). Looked up alongside the create row so we hold the read-only
@@ -244,6 +239,14 @@ export function endorseArtifact(seedPath, artifactRef, researcherId) {
244
239
  if (createRow === undefined) {
245
240
  throw new CompostError('FILE_NOT_FOUND', `No create event found for ref "${artifactRef}".`);
246
241
  }
242
+ // Refuse a self-endorse: the actor who created an artifact can't also be the
243
+ // one who endorses it (#236, defense-in-depth). The [draft]→endorsed gate is a
244
+ // human approving an AI/agent suggestion; an agent endorsing under the same
245
+ // actor_id it created with would collapse the gate. The endorsing identity is
246
+ // bound to $COMPOST_USER server-side (commands/endorse.ts), not a tool arg.
247
+ if (researcherId === createRow.actor_id) {
248
+ throw new CompostError('INVALID_INPUT', `Refusing to self-endorse: "${researcherId}" is the actor that created this artifact. Endorsement is a second actor approving it — set COMPOST_USER (or pass --researcher) to a human reviewer distinct from the author.`);
249
+ }
247
250
  if (existingEndorse !== undefined) {
248
251
  return {
249
252
  artifact_id: createRow.artifact_id,
@@ -278,11 +281,7 @@ export function endorseArtifact(seedPath, artifactRef, researcherId) {
278
281
  * no-op returning the existing reject.
279
282
  */
280
283
  export function rejectArtifact(seedPath, artifactRef, researcherId, note) {
281
- const eventsDb = join(seedPath, '.compost', 'events.sqlite');
282
- if (!existsSync(eventsDb)) {
283
- throw new CompostError('FILE_NOT_FOUND', `No events.sqlite in seed; nothing to reject.`);
284
- }
285
- const db = new Database(eventsDb, { readonly: true, fileMustExist: true });
284
+ const db = openReadonlyEvents(seedPath, 'No events.sqlite in seed; nothing to reject.');
286
285
  let resolved;
287
286
  let existingReject;
288
287
  try {
@@ -338,11 +337,7 @@ export function rejectArtifact(seedPath, artifactRef, researcherId, note) {
338
337
  * applies only `after`.
339
338
  */
340
339
  export function updateArtifact(seedPath, artifactRef, patch, author) {
341
- const eventsDb = join(seedPath, '.compost', 'events.sqlite');
342
- if (!existsSync(eventsDb)) {
343
- throw new CompostError('FILE_NOT_FOUND', `No events.sqlite in seed; nothing to update.`);
344
- }
345
- const db = new Database(eventsDb, { readonly: true, fileMustExist: true });
340
+ const db = openReadonlyEvents(seedPath, 'No events.sqlite in seed; nothing to update.');
346
341
  let resolved;
347
342
  try {
348
343
  const createRow = findCreateEvent(db, artifactRef);