@gitroll/tacitt-cli 0.6.10 → 0.6.12

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 (63) hide show
  1. package/README.md +47 -4
  2. package/bin/INDEX.md +6 -4
  3. package/bin/tacitt.cjs +1 -0
  4. package/dist/{agent-setup-LPd8WEsN.mjs → agent-setup-B12VbvN_.mjs} +2 -2
  5. package/dist/agent-setup-worker.mjs +5 -5
  6. package/dist/cli.mjs +39 -25
  7. package/dist/codex-title-worker.mjs +2 -2
  8. package/dist/configured-preview-worker.mjs +5 -5
  9. package/dist/configured-session-worker.mjs +27 -27
  10. package/dist/{frame-ByT1xayJ.mjs → frame-B3He21G8.mjs} +1 -1
  11. package/dist/{heap-CM298Yu0.mjs → heap-Blrat--4.mjs} +469 -30
  12. package/dist/inspection-worker.mjs +4 -4
  13. package/dist/{job-BHIwElNF.mjs → job-CBuIMTQ0.mjs} +57 -22
  14. package/dist/{locate-Cwv6WH8n.mjs → locate-D-ZaHpI0.mjs} +184 -18
  15. package/dist/{model-zvn5GUJ9.mjs → model-DR9odhWP.mjs} +1 -1
  16. package/dist/operation-executor.mjs +3 -3
  17. package/dist/preview-worker.mjs +1 -1
  18. package/dist/privacy-validator.mjs +49 -2
  19. package/dist/{query-By41gaKm.mjs → query-BYDcNKy2.mjs} +1869 -716
  20. package/dist/{run-ZQx7p4Rw.mjs → run-DQ9xyKSt.mjs} +4 -4
  21. package/dist/session-process.mjs +20 -0
  22. package/dist/{src-D_DfY--2.mjs → src-CKQlTA2Z.mjs} +297 -207
  23. package/dist/{src-3jvMvSQn.mjs → src-DeNJ8vOD.mjs} +535 -140
  24. package/dist/{src-BqtdFVq7.mjs → src-Do-qzuMn.mjs} +2329 -1786
  25. package/dist/store-database-worker.mjs +1 -1
  26. package/dist/web/assets/index-BgDdPL1c.js +172 -0
  27. package/dist/web/assets/index-DzOozqms.css +1 -0
  28. package/dist/web/index.html +3 -2
  29. package/package.json +2 -1
  30. package/skills/INDEX.md +6 -4
  31. package/skills/tacitt/INDEX.md +7 -6
  32. package/skills/tacitt/SKILL.md +11 -11
  33. package/skills/tacitt/references/INDEX.md +14 -11
  34. package/skills/tacitt/references/b-method.md +4 -4
  35. package/skills/tacitt/references/bootstrap.md +19 -5
  36. package/skills/tacitt/references/classification.md +4 -4
  37. package/skills/tacitt/references/commands.md +51 -34
  38. package/skills/tacitt/references/journey.md +7 -7
  39. package/skills/tacitt/references/parallel-review.md +35 -35
  40. package/skills/tacitt/references/send.md +15 -6
  41. package/skills/tacitt/scripts/INDEX.md +40 -37
  42. package/skills/tacitt/scripts/answer.mjs +91 -15
  43. package/skills/tacitt/scripts/journey-card-consolidation.mjs +1 -1
  44. package/skills/tacitt/scripts/journey-classification-metadata.mjs +75 -26
  45. package/skills/tacitt/scripts/journey-classification-progress.mjs +1 -2
  46. package/skills/tacitt/scripts/journey-classification-tasks.mjs +28 -8
  47. package/skills/tacitt/scripts/journey-classification.mjs +6 -1
  48. package/skills/tacitt/scripts/journey-consolidation.mjs +1 -0
  49. package/skills/tacitt/scripts/journey-panel-host.d.mts +2 -0
  50. package/skills/tacitt/scripts/journey-panel-host.mjs +25 -2
  51. package/skills/tacitt/scripts/journey-scan-timing.d.mts +5 -0
  52. package/skills/tacitt/scripts/journey-scan-timing.mjs +31 -4
  53. package/skills/tacitt/scripts/journey-state.d.mts +9 -1
  54. package/skills/tacitt/scripts/journey-state.mjs +95 -8
  55. package/skills/tacitt/scripts/journey-tasks.d.mts +1 -0
  56. package/skills/tacitt/scripts/journey-tasks.mjs +24 -9
  57. package/skills/tacitt/scripts/journey.d.mts +44 -31
  58. package/skills/tacitt/scripts/journey.mjs +34 -7
  59. package/skills/tacitt/scripts/privacy-validator.mjs +188 -11
  60. package/skills/tacitt/scripts/review.d.mts +7 -6
  61. package/skills/tacitt/scripts/review.mjs +922 -205
  62. package/dist/web/assets/index-B14e6_-z.js +0 -174
  63. package/dist/web/assets/index-CYJBq1px.css +0 -1
package/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ <!-- index: Package guide | Documents public npm Manual/Skill installation, intentional updates and bundled notices. -->
2
+
1
3
  # Tacitt CLI
2
4
 
3
5
  Local session review, privacy decisions and reviewed export/Send for coding agents.
@@ -15,18 +17,57 @@ CLI version, preserves verified previous release assets for existing tasks, and
15
17
  reports unmanaged-file collisions. Installation alone starts no scan and resets
16
18
  no source logs, state or existing exports.
17
19
 
18
- For the standalone Manual browser interface, run:
20
+ Tacitt has three surfaces: the Skill, the Skill panel that the Skill opens, and
21
+ the CLI commands the Skill runs (`tacitt --help` lists them). Running `tacitt`
22
+ with no command prints how to start the Skill.
23
+
24
+ For a local export without Send, run these CLI commands in order. `tacitt` stands for
25
+ `npx --yes @gitroll/tacitt-cli@latest`. Each command prints JSON. Take `runId`,
26
+ `revision`, `settingsVersion` and `dictionaryRevision` from the previous command's output,
27
+ because each step raises the revision. `slots` picks workspace ZIPs by position. The
28
+ `echo ... | tacitt ... --input -` form works in sh and PowerShell; in cmd.exe, save the JSON
29
+ to a file and pass `--input FILE`. Manual upload to Passport from the CLI is not available yet.
19
30
 
20
31
  ```sh
21
- npx --yes @gitroll/tacitt-cli@latest
32
+ tacitt workflow.startDiscovery # operationId
33
+ tacitt operation.wait <operationId>
34
+ tacitt workflow.getCurrent # runId, revision
35
+ echo '{"protocolVersion":1,"runId":"<runId>","expectedRevision":<revision>}' | tacitt workflow.chooseMethod --input -
36
+ echo '{"protocolVersion":1,"runId":"<runId>","expectedRevision":<revision>,"expectedSettingsVersion":<settingsVersion>,"mode":"configured","changes":[]}' | tacitt processing.batch --input -
37
+ echo '{"protocolVersion":1,"runId":"<runId>","expectedRevision":<revision>}' | tacitt workflow.reviewPending --input -
38
+ echo '{"protocolVersion":1,"runId":"<runId>","expectedRevision":<revision>,"expectedDictionaryRevision":"<dictionaryRevision>"}' | tacitt workflow.package --input - --async
39
+ tacitt operation.wait <operationId>
40
+ tacitt delivery.list # result id
41
+ echo '{"resultId":"<id>","slots":[0],"artifact":"primary","output":"export.zip"}' | tacitt delivery.issue --input -
42
+ ```
43
+
44
+ The `processing.batch` step applies the configured cleanup and redaction. Without it, the
45
+ export is the original session content with no redaction or anonymization.
46
+
47
+ Global sensitive terms and the bundle library are set through the CLI only.
48
+ `sensitiveTerms.replace` replaces the whole list; take `revision` from `sensitiveTerms.get`
49
+ (`"empty"` before the first save). `bundleLibrary.save` takes effect at the next CLI start.
50
+
51
+ ```sh
52
+ tacitt sensitiveTerms.get
53
+ echo '{"expectedRevision":"<revision>","terms":["Acme Corp","project-x"]}' | tacitt sensitiveTerms.replace --input -
54
+ tacitt bundleLibrary.get
55
+ echo '{"directory":"/absolute/path/to/bundles"}' | tacitt bundleLibrary.save --input -
56
+ ```
57
+
58
+ The `echo '...' |` lines work in sh and PowerShell. In cmd.exe, drop the single quotes and
59
+ put `|` right after the JSON:
60
+
61
+ ```bat
62
+ echo {"expectedRevision":"<revision>","terms":["Acme Corp","project-x"]}| tacitt sensitiveTerms.replace --input -
22
63
  ```
23
64
 
24
65
  The native Skill presents decisions in a focused panel. Source consent precedes
25
66
  classification and privacy analysis. The current model provider receives frozen
26
67
  original main conversations and retained tool results before privacy masking;
27
68
  this workflow is not local-only. Send separately authorizes packaging/upload of
28
- the selected reviewed material to the signed-in Tacitt account. Use Manual for
29
- standalone local export. Keep session data and panel capability URLs private.
69
+ the selected reviewed material to the signed-in Tacitt account. Keep session data
70
+ and panel capability URLs private.
30
71
 
31
72
  State from incompatible previews is not silently migrated. Keep the pinned CLI
32
73
  for old tasks and use a separate state directory when required; installing the
@@ -40,3 +81,5 @@ at [gitroll-dev/tacitt-cli](https://github.com/gitroll-dev/tacitt-cli). The
40
81
  repository contains proprietary source; public visibility does not grant an
41
82
  open-source license. All rights are reserved; reuse requires separate permission
42
83
  from the rights holders.
84
+
85
+ For a custom Passport deployment, set `SESS_PILOT_PASSPORT_WEB_ORIGIN` to its trusted profile website origin alongside the custom API origin. The published-ID lookup uses the declared web origins for the standard production and development APIs.
package/bin/INDEX.md CHANGED
@@ -3,7 +3,9 @@
3
3
  > Audience: contributors and reviewers
4
4
  > Ownership: root-maintained distribution boundary
5
5
 
6
- | Entry | Kind | Responsibility |
7
- | ------------------------ | --------------- | -------------------------------------------------------------------------------------------------- |
8
- | [INDEX.md](INDEX.md) | Directory index | Navigates the minimal executable boundary. |
9
- | [tacitt.cjs](tacitt.cjs) | Executable shim | Checks supported Node before loading the packaged ESM CLI and emits safe startup failure guidance. |
6
+ <!-- index-entries
7
+ ./ | Executable prerequisite | Checks Node before application imports for npm/npx startup.
8
+ INDEX.md | Directory index | Navigates the minimal executable boundary.
9
+ -->
10
+
11
+ The entry table is not committed: run `pnpm run write:indexes`, then open `INDEX.local.md` in this directory.
package/bin/tacitt.cjs CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ // index: Executable shim | Checks supported Node before loading the packaged ESM CLI and emits safe startup failure guidance.
2
3
  // This boundary must parse before loading Node24-only application modules.
3
4
  const [major, minor] = process.versions.node.split('.').map(Number)
4
5
  if (major !== 24 || minor < 19) {
@@ -1,5 +1,5 @@
1
- import "./locate-Cwv6WH8n.mjs";
2
- import "./src-BqtdFVq7.mjs";
1
+ import "./locate-D-ZaHpI0.mjs";
2
+ import "./src-Do-qzuMn.mjs";
3
3
  import { z } from "zod";
4
4
  import { Worker } from "node:worker_threads";
5
5
  //#region apps/cli/src/agent-setup/index.ts
@@ -1,8 +1,8 @@
1
- import { J as listAgentSetup } from "./src-3jvMvSQn.mjs";
2
- import { Dn as createStaticProcessor, dn as workspaceSchema, ln as sessionSchema } from "./locate-Cwv6WH8n.mjs";
3
- import { l as createNativeAdapters, u as createGitNameSeedProvider } from "./src-D_DfY--2.mjs";
4
- import { ct as maximumAgentSetupSessions, gi as effectiveTreatmentSchema } from "./src-BqtdFVq7.mjs";
5
- import "./agent-setup-LPd8WEsN.mjs";
1
+ import { X as listAgentSetup } from "./src-DeNJ8vOD.mjs";
2
+ import { Nn as createStaticProcessor, _n as workspaceSchema, hn as sessionSchema } from "./locate-D-ZaHpI0.mjs";
3
+ import { l as createNativeAdapters, u as createGitNameSeedProvider } from "./src-CKQlTA2Z.mjs";
4
+ import { Pi as effectiveTreatmentSchema, ct as maximumAgentSetupSessions } from "./src-Do-qzuMn.mjs";
5
+ import "./agent-setup-B12VbvN_.mjs";
6
6
  import { z } from "zod";
7
7
  import { parentPort, workerData } from "node:worker_threads";
8
8
  //#region apps/cli/src/agent-setup/worker.ts
package/dist/cli.mjs CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { _ as longCommands, a as readAgentPresence, b as traceStartup, d as serveDetached, f as guardDetachedStartup, g as businessCommands, h as parseOptions, i as invoke, l as awaitingPassport, m as helpText, n as readOperation, o as createRuntime, p as createRenderActivity, r as waitOperation, s as executorEventSchema, t as cancelOperation, u as hostDrives, v as permissionDiagnostic, y as startupFailure } from "./query-By41gaKm.mjs";
3
- import { nt as makePrivateDirectory, rt as openPrivateFile } from "./src-3jvMvSQn.mjs";
4
- import { A as createExecutionPort, I as inBackgroundStatusPoll, j as startHost, k as readStateDump } from "./job-BHIwElNF.mjs";
5
- import { $t as safeField, Qt as safeCode, Xt as ApplicationError } from "./locate-Cwv6WH8n.mjs";
6
- import { fi as stateSchema, rt as readWorkspaceOutcomes, tr as reviewTransportBytes, ut as resolveFailureLocation } from "./src-BqtdFVq7.mjs";
7
- import { _t as isCoordinationBusy } from "./heap-CM298Yu0.mjs";
2
+ import { _ as permissionDiagnostic, a as readAgentPresence, d as packageIdentity, f as createRenderActivity, g as longCommands, h as businessCommands, i as invoke, l as serveDetached, m as parseOptions, n as readOperation, o as createRuntime, p as helpText, r as waitOperation, s as executorEventSchema, t as cancelOperation, u as guardDetachedStartup, v as startupFailure, y as traceStartup } from "./query-BYDcNKy2.mjs";
3
+ import { at as makePrivateDirectory, ot as openPrivateFile } from "./src-DeNJ8vOD.mjs";
4
+ import { A as createExecutionPort, I as inBackgroundStatusPoll, j as startHost, k as readStateDump } from "./job-CBuIMTQ0.mjs";
5
+ import { an as safeField, in as safeCode, nn as ApplicationError } from "./locate-D-ZaHpI0.mjs";
6
+ import { Ai as stateSchema, Kr as hostDrives, Wr as awaitingPassport, rt as readWorkspaceOutcomes, ut as resolveFailureLocation, yn as reviewTransportBytes } from "./src-Do-qzuMn.mjs";
7
+ import { vt as isCoordinationBusy } from "./heap-Blrat--4.mjs";
8
8
  import { constants, createReadStream, write } from "node:fs";
9
9
  import { z } from "zod";
10
10
  import { lstat, mkdir, mkdtemp, open, readFile, readdir, realpath, rename, rm, writeFile } from "node:fs/promises";
@@ -149,6 +149,7 @@ function hostFinished(now, endedAt, settledAt) {
149
149
  return now - endedAt >= 108e5 || settledAt !== void 0 && now - settledAt >= 18e5;
150
150
  }
151
151
  async function serve(options, journeyId) {
152
+ const detached = process.env["TACITT_DETACHED_STARTUP"] === "1" && process.send !== void 0;
152
153
  guardDetachedStartup();
153
154
  let initializing;
154
155
  let shutdownPhase = "application-and-account";
@@ -309,19 +310,19 @@ async function serve(options, journeyId) {
309
310
  const ended = journey?.phase === "completed" || journey?.abandonedAt !== void 0;
310
311
  const send = (await inBackgroundStatusPoll(async () => journeys?.get({})))?.journeyId === journeyId ? (await journeySend?.get({ journeyId }))?.send : null;
311
312
  const waiting = Boolean(send && awaitingPassport(send));
312
- const driving = Boolean(send && hostDrives(send));
313
+ const driving = Boolean(journey && send && hostDrives(journey, send));
313
314
  const now = Date.now();
314
315
  endedAt = ended ? endedAt ?? now : void 0;
315
316
  settledAt = ended && !waiting ? settledAt ?? now : void 0;
316
317
  if (endedAt !== void 0 && hostFinished(now, endedAt, settledAt)) return scheduleStop();
317
- if (driving && send && journeySend) {
318
+ if (driving && journey && send && journeySend) {
318
319
  let previous = send;
319
320
  while (!hostLife.signal.aborted) {
320
321
  const result = await journeySend.advance({
321
322
  journeyId,
322
323
  sendId: previous.id
323
324
  }, hostLife.signal);
324
- if (result.status !== "applied" || !result.send || !hostDrives(result.send) || result.send.revision === previous.revision) break;
325
+ if (result.status !== "applied" || !result.send || !hostDrives(journey, result.send) || result.send.revision === previous.revision) break;
325
326
  if ((await inBackgroundStatusPoll(async () => journeys?.get({})))?.journeyId !== journeyId) break;
326
327
  previous = result.send;
327
328
  }
@@ -334,14 +335,16 @@ async function serve(options, journeyId) {
334
335
  const url = new URL(host.url);
335
336
  url.searchParams.set("view", "skill");
336
337
  url.searchParams.set("journey", journeyId);
337
- process.stdout.write(`${JSON.stringify({
338
+ const ready = {
338
339
  ok: true,
339
340
  event: "ready",
340
341
  result: {
341
342
  url: url.href,
342
343
  journeyId
343
344
  }
344
- })}\n`);
345
+ };
346
+ if (detached) process.send?.(ready);
347
+ else process.stdout.write(`${JSON.stringify(ready)}\n`);
345
348
  } else {
346
349
  process.stdout.write(`Open this private URL to review sessions:\n${host.url}\nBundle library: ${runtime.library.path}${runtime.library.source === "fallback" ? ` (fallback from ${runtime.library.fallbackFrom})` : ""}\nLocal diagnostic logs: ${join(runtime.stateDir, "diagnostics")}\n`);
347
350
  initializing = runtime.application.initialize().catch((error) => {
@@ -377,13 +380,6 @@ async function serve(options, journeyId) {
377
380
  }
378
381
  }
379
382
  //#endregion
380
- //#region apps/cli/src/package-identity.ts
381
- /** Release identity stays independent of producer/processing format versions. */
382
- const packageIdentity = Object.freeze(z.object({
383
- name: z.literal("@gitroll/tacitt-cli"),
384
- version: z.string().regex(/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/)
385
- }).parse(JSON.parse(await readFile(new URL("../package.json", import.meta.url), "utf8"))));
386
- //#endregion
387
383
  //#region apps/cli/skills/tacitt/scripts/local-cli.mjs
388
384
  const fail = () => {
389
385
  throw new Error("LOCAL_CLI_BINDING_INVALID");
@@ -514,14 +510,15 @@ async function exists(path) {
514
510
  throw error;
515
511
  }
516
512
  }
517
- async function filesAt(directory, prefix = "") {
513
+ async function filesAt(directory, prefix = "", source = false) {
518
514
  const info = await lstat(directory);
519
515
  if (!info.isDirectory() || info.isSymbolicLink()) collision();
520
516
  const files = /* @__PURE__ */ new Map();
521
517
  for (const item of (await readdir(directory, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
518
+ if (source && item.name === "INDEX.local.md") continue;
522
519
  const path = join(directory, item.name);
523
520
  const key = `${prefix}${item.name}`;
524
- if (item.isDirectory()) for (const [name, value] of await filesAt(path, `${key}/`)) files.set(name, value);
521
+ if (item.isDirectory()) for (const [name, value] of await filesAt(path, `${key}/`, source)) files.set(name, value);
525
522
  else if (item.isFile()) files.set(key, await readFile(path));
526
523
  else collision();
527
524
  }
@@ -554,10 +551,10 @@ async function createRelease(identity, source, directory, local) {
554
551
  const root = join(directory, "releases", identity.version);
555
552
  const render = (value) => helperCommands(value, root, local?.binding.nodePath ?? "node");
556
553
  const entry = render(template).replaceAll("](references/", `](releases/${identity.version}/references/`).replaceAll("](scripts/", `](releases/${identity.version}/scripts/`).replace(marker, () => `<!-- sess-pilot-managed:${identity.version} -->\n\nCLI release: \`${identity.name}@${identity.version}\`. ${instructions}`);
557
- const files = await filesAt(join(source, "references"), "references/");
554
+ const files = await filesAt(join(source, "references"), "references/", true);
558
555
  for (const [name, value] of files) if (name.endsWith(".md")) files.set(name, Buffer.from(render(value.toString("utf8")).replaceAll("](../SKILL.md", "](../../../SKILL.md")));
559
556
  const scripts = join(source, "scripts");
560
- if (await exists(scripts)) for (const [name, value] of await filesAt(scripts, "scripts/")) files.set(name, value);
557
+ if (await exists(scripts)) for (const [name, value] of await filesAt(scripts, "scripts/", true)) files.set(name, value);
561
558
  if (receipt !== null) files.set("cli-binding.json", Buffer.from(receipt));
562
559
  return {
563
560
  identity,
@@ -999,6 +996,7 @@ const writeJson = (value) => new Promise((resolve, reject) => {
999
996
  /** Procedures the review helper sends; each runs exactly as its own `--input` command would. */
1000
997
  const streamProcedures = /* @__PURE__ */ new Set([
1001
998
  "journey.get",
999
+ "journey.respond",
1002
1000
  "journey.remoteWorkers",
1003
1001
  "journey.prepare",
1004
1002
  "journey.catalog",
@@ -1012,6 +1010,7 @@ const streamProcedures = /* @__PURE__ */ new Set([
1012
1010
  "journey.read",
1013
1011
  "review.guidance",
1014
1012
  "review.status",
1013
+ "review.reopenEmpty",
1015
1014
  "review.terms"
1016
1015
  ]);
1017
1016
  const request = z.object({
@@ -1059,11 +1058,20 @@ async function reviewStream(options) {
1059
1058
  const call = request.parse(JSON.parse(line));
1060
1059
  id = call.id;
1061
1060
  if (!streamProcedures.has(call.procedure)) throw new ApplicationError("INVALID_ARGUMENTS");
1062
- const result = await invoke(runtime, call.procedure, call.input ?? null, abort.signal);
1061
+ if (call.procedure === "journey.respond" && !z.object({ action: z.object({ kind: z.enum(["review-interrupted", "review-reader-closed"]) }) }).safeParse(call.input).success) throw new ApplicationError("INVALID_ARGUMENTS");
1062
+ const result = await invoke(runtime, call.procedure, call.input ?? null, abort.signal, "review-helper");
1063
+ const output = call.procedure === "journey.respond" ? z.object({
1064
+ status: z.enum([
1065
+ "applied",
1066
+ "replayed",
1067
+ "stale"
1068
+ ]),
1069
+ state: z.object({ revision: z.number().int().nonnegative() })
1070
+ }).parse(result) : result;
1063
1071
  await writeJson({
1064
1072
  id,
1065
1073
  ok: true,
1066
- result
1074
+ result: output
1067
1075
  });
1068
1076
  } catch (error) {
1069
1077
  runtime.diagnostics.onFailure("command", error);
@@ -1305,6 +1313,8 @@ async function business(options, args) {
1305
1313
  //#endregion
1306
1314
  //#region apps/cli/src/cli.ts
1307
1315
  const stateDumpSchema = z.object({ state: z.unknown() });
1316
+ /** Printed by bare `tacitt`. Owner approved this text on 2026-11-12 (ADR 0278). */
1317
+ const skillPointer = "Tacitt runs from the Skill. In Claude Code, run /tacitt. In Codex, run $tacitt.\nTo install the Skill: npx --yes @gitroll/tacitt-cli@latest skill.install\n";
1308
1318
  async function main() {
1309
1319
  traceStartup("entry-ready");
1310
1320
  process.umask(63);
@@ -1368,7 +1378,11 @@ async function main() {
1368
1378
  return;
1369
1379
  }
1370
1380
  if (options.command) await business(options, process.argv.slice(2));
1371
- else await serve(options);
1381
+ else if (process.env["CI"] === "true" && process.env["SESS_PILOT_TEST_MANUAL_HOST"] === "1") await serve({
1382
+ ...options,
1383
+ "no-open": true
1384
+ });
1385
+ else process.stdout.write(skillPointer);
1372
1386
  }
1373
1387
  main().catch(async (error) => {
1374
1388
  if (process.argv.slice(2).find((argument) => businessCommands.some((name) => name === argument))) {
@@ -1,9 +1,9 @@
1
- import { i as errorCode } from "./model-zvn5GUJ9.mjs";
1
+ import { i as errorCode } from "./model-DR9odhWP.mjs";
2
2
  import { a as titleHintLimits, i as encodeTitleError, o as titleInputSchema, t as assertTitleHeap } from "./heap-1FYhGds4.mjs";
3
3
  import { stat } from "node:fs/promises";
4
4
  import { isAbsolute, join } from "node:path";
5
- import { DatabaseSync } from "node:sqlite";
6
5
  import { parentPort, workerData } from "node:worker_threads";
6
+ import { DatabaseSync } from "node:sqlite";
7
7
  //#region packages/harnesses/src/metadata/codex-database/files.ts
8
8
  const absent = (error) => ["ENOENT", "ENOTDIR"].includes(errorCode(error) ?? "");
9
9
  async function databaseFile(path) {
@@ -1,8 +1,8 @@
1
- import { Y as createConfiguredPreviewStream } from "./src-3jvMvSQn.mjs";
2
- import { Dn as createStaticProcessor, dn as workspaceSchema, ln as sessionSchema } from "./locate-Cwv6WH8n.mjs";
3
- import { l as createNativeAdapters, u as createGitNameSeedProvider } from "./src-D_DfY--2.mjs";
4
- import { gi as effectiveTreatmentSchema } from "./src-BqtdFVq7.mjs";
5
- import { a as classifyRecord, n as assertPreviewHeap, t as runPreview } from "./run-ZQx7p4Rw.mjs";
1
+ import { Z as createConfiguredPreviewStream } from "./src-DeNJ8vOD.mjs";
2
+ import { Nn as createStaticProcessor, _n as workspaceSchema, hn as sessionSchema } from "./locate-D-ZaHpI0.mjs";
3
+ import { l as createNativeAdapters, u as createGitNameSeedProvider } from "./src-CKQlTA2Z.mjs";
4
+ import { Pi as effectiveTreatmentSchema } from "./src-Do-qzuMn.mjs";
5
+ import { a as classifyRecord, n as assertPreviewHeap, t as runPreview } from "./run-DQ9xyKSt.mjs";
6
6
  import { z } from "zod";
7
7
  import { parentPort, workerData } from "node:worker_threads";
8
8
  //#region apps/cli/src/preview/run.ts
@@ -1,9 +1,22 @@
1
- import { et as safeError, h as captureConfiguredSessionJob, j as runConfiguredSessionJob, u as runConfiguredScanJob, z as gitSeedsProvider } from "./src-3jvMvSQn.mjs";
2
- import { d as runJourneyBaseJob, i as runJourneyOutputVerifyJob, n as runJourneyOutputJob, r as runJourneyOutputShardJob } from "./job-BHIwElNF.mjs";
3
- import { Dn as createStaticProcessor, Qt as safeCode } from "./locate-Cwv6WH8n.mjs";
4
- import { l as createNativeAdapters } from "./src-D_DfY--2.mjs";
5
- import "./src-BqtdFVq7.mjs";
1
+ import { N as runConfiguredSessionJob, V as gitSeedsProvider, _ as captureConfiguredSessionJob, f as runConfiguredScanJob, rt as safeError } from "./src-DeNJ8vOD.mjs";
2
+ import { d as runJourneyBaseJob, i as runJourneyOutputVerifyJob, n as runJourneyOutputJob, r as runJourneyOutputShardJob } from "./job-CBuIMTQ0.mjs";
3
+ import { Nn as createStaticProcessor, br as processingSite, in as safeCode } from "./locate-D-ZaHpI0.mjs";
4
+ import { l as createNativeAdapters } from "./src-CKQlTA2Z.mjs";
5
+ import "./src-Do-qzuMn.mjs";
6
6
  import { parentPort } from "node:worker_threads";
7
+ //#region packages/artifact/src/configured/parallel/spool-claim.ts
8
+ /** A worker may create a named file only after the host has recorded its cleanup ownership. */
9
+ function claimWorkerSpool(path) {
10
+ if (!parentPort) throw new Error("ARTIFACT_PROCESSING_FAILED");
11
+ const receipt = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
12
+ parentPort.postMessage({
13
+ kind: "spool-claim",
14
+ path,
15
+ receipt: receipt.buffer
16
+ });
17
+ Atomics.wait(receipt, 0, 0);
18
+ }
19
+ //#endregion
7
20
  //#region apps/cli/src/configured-session-worker.ts
8
21
  const port = parentPort;
9
22
  const adapters = createNativeAdapters();
@@ -46,7 +59,8 @@ function reportFailure(error) {
46
59
  post({
47
60
  kind: "error",
48
61
  code,
49
- ...sourceId === void 0 ? {} : { sourceId }
62
+ ...sourceId === void 0 ? {} : { sourceId },
63
+ ...processingSite(error)
50
64
  });
51
65
  }
52
66
  function processingFor(job) {
@@ -71,20 +85,14 @@ port?.on("message", async (message) => {
71
85
  result: await runConfiguredScanJob(message.job, processingFor(message.job), signal, (bytes) => post({
72
86
  kind: "source",
73
87
  bytes
74
- }), (path) => post({
75
- kind: "spool",
76
- path
77
- }))
88
+ }), claimWorkerSpool)
78
89
  });
79
90
  else if (isJourneyOutputRequest(message)) post({
80
91
  kind: "result",
81
92
  result: await runJourneyOutputJob(message.job, {
82
93
  adapters,
83
94
  processor
84
- }, signal, (path) => post({
85
- kind: "spool",
86
- path
87
- }))
95
+ }, signal, claimWorkerSpool)
88
96
  });
89
97
  else if (isJourneyBaseRequest(message)) try {
90
98
  post({
@@ -92,15 +100,13 @@ port?.on("message", async (message) => {
92
100
  result: await runJourneyBaseJob(message.job, {
93
101
  adapters,
94
102
  processor
95
- }, signal, (path) => post({
96
- kind: "spool",
97
- path
98
- }))
103
+ }, signal, claimWorkerSpool)
99
104
  });
100
105
  } catch (error) {
101
106
  post({
102
107
  kind: "error",
103
- code: safeCode(error)
108
+ code: safeCode(error),
109
+ ...processingSite(error)
104
110
  });
105
111
  }
106
112
  else if (isJourneyOutputShardRequest(message)) post({
@@ -108,10 +114,7 @@ port?.on("message", async (message) => {
108
114
  result: await runJourneyOutputShardJob(message.job, {
109
115
  adapters,
110
116
  processor
111
- }, signal, (path) => post({
112
- kind: "spool",
113
- path
114
- }))
117
+ }, signal, claimWorkerSpool)
115
118
  });
116
119
  else if (isJourneyOutputVerifyRequest(message)) post({
117
120
  kind: "result",
@@ -124,10 +127,7 @@ port?.on("message", async (message) => {
124
127
  result: await runConfiguredSessionJob(job, processingFor(job), signal, (bytes) => post({
125
128
  kind: "source",
126
129
  bytes
127
- }), (path) => post({
128
- kind: "spool",
129
- path
130
- }))
130
+ }), claimWorkerSpool)
131
131
  });
132
132
  }
133
133
  } catch (error) {
@@ -1,4 +1,4 @@
1
- import { ur as ProcessingError } from "./locate-Cwv6WH8n.mjs";
1
+ import { gr as ProcessingError } from "./locate-D-ZaHpI0.mjs";
2
2
  //#region packages/processing/src/compression/frame.ts
3
3
  function createZstdFrameCheck(fail = () => {
4
4
  throw new ProcessingError("PROCESSING_INVALID_RECORD");