@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.
- package/README.md +47 -4
- package/bin/INDEX.md +6 -4
- package/bin/tacitt.cjs +1 -0
- package/dist/{agent-setup-LPd8WEsN.mjs → agent-setup-B12VbvN_.mjs} +2 -2
- package/dist/agent-setup-worker.mjs +5 -5
- package/dist/cli.mjs +39 -25
- package/dist/codex-title-worker.mjs +2 -2
- package/dist/configured-preview-worker.mjs +5 -5
- package/dist/configured-session-worker.mjs +27 -27
- package/dist/{frame-ByT1xayJ.mjs → frame-B3He21G8.mjs} +1 -1
- package/dist/{heap-CM298Yu0.mjs → heap-Blrat--4.mjs} +469 -30
- package/dist/inspection-worker.mjs +4 -4
- package/dist/{job-BHIwElNF.mjs → job-CBuIMTQ0.mjs} +57 -22
- package/dist/{locate-Cwv6WH8n.mjs → locate-D-ZaHpI0.mjs} +184 -18
- package/dist/{model-zvn5GUJ9.mjs → model-DR9odhWP.mjs} +1 -1
- package/dist/operation-executor.mjs +3 -3
- package/dist/preview-worker.mjs +1 -1
- package/dist/privacy-validator.mjs +49 -2
- package/dist/{query-By41gaKm.mjs → query-BYDcNKy2.mjs} +1869 -716
- package/dist/{run-ZQx7p4Rw.mjs → run-DQ9xyKSt.mjs} +4 -4
- package/dist/session-process.mjs +20 -0
- package/dist/{src-D_DfY--2.mjs → src-CKQlTA2Z.mjs} +297 -207
- package/dist/{src-3jvMvSQn.mjs → src-DeNJ8vOD.mjs} +535 -140
- package/dist/{src-BqtdFVq7.mjs → src-Do-qzuMn.mjs} +2329 -1786
- package/dist/store-database-worker.mjs +1 -1
- package/dist/web/assets/index-BgDdPL1c.js +172 -0
- package/dist/web/assets/index-DzOozqms.css +1 -0
- package/dist/web/index.html +3 -2
- package/package.json +2 -1
- package/skills/INDEX.md +6 -4
- package/skills/tacitt/INDEX.md +7 -6
- package/skills/tacitt/SKILL.md +11 -11
- package/skills/tacitt/references/INDEX.md +14 -11
- package/skills/tacitt/references/b-method.md +4 -4
- package/skills/tacitt/references/bootstrap.md +19 -5
- package/skills/tacitt/references/classification.md +4 -4
- package/skills/tacitt/references/commands.md +51 -34
- package/skills/tacitt/references/journey.md +7 -7
- package/skills/tacitt/references/parallel-review.md +35 -35
- package/skills/tacitt/references/send.md +15 -6
- package/skills/tacitt/scripts/INDEX.md +40 -37
- package/skills/tacitt/scripts/answer.mjs +91 -15
- package/skills/tacitt/scripts/journey-card-consolidation.mjs +1 -1
- package/skills/tacitt/scripts/journey-classification-metadata.mjs +75 -26
- package/skills/tacitt/scripts/journey-classification-progress.mjs +1 -2
- package/skills/tacitt/scripts/journey-classification-tasks.mjs +28 -8
- package/skills/tacitt/scripts/journey-classification.mjs +6 -1
- package/skills/tacitt/scripts/journey-consolidation.mjs +1 -0
- package/skills/tacitt/scripts/journey-panel-host.d.mts +2 -0
- package/skills/tacitt/scripts/journey-panel-host.mjs +25 -2
- package/skills/tacitt/scripts/journey-scan-timing.d.mts +5 -0
- package/skills/tacitt/scripts/journey-scan-timing.mjs +31 -4
- package/skills/tacitt/scripts/journey-state.d.mts +9 -1
- package/skills/tacitt/scripts/journey-state.mjs +95 -8
- package/skills/tacitt/scripts/journey-tasks.d.mts +1 -0
- package/skills/tacitt/scripts/journey-tasks.mjs +24 -9
- package/skills/tacitt/scripts/journey.d.mts +44 -31
- package/skills/tacitt/scripts/journey.mjs +34 -7
- package/skills/tacitt/scripts/privacy-validator.mjs +188 -11
- package/skills/tacitt/scripts/review.d.mts +7 -6
- package/skills/tacitt/scripts/review.mjs +922 -205
- package/dist/web/assets/index-B14e6_-z.js +0 -174
- 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
|
-
|
|
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
|
-
|
|
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.
|
|
29
|
-
|
|
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
|
-
|
|
7
|
-
|
|
|
8
|
-
|
|
9
|
-
|
|
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,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { l as createNativeAdapters, u as createGitNameSeedProvider } from "./src-
|
|
4
|
-
import {
|
|
5
|
-
import "./agent-setup-
|
|
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
|
|
3
|
-
import {
|
|
4
|
-
import { A as createExecutionPort, I as inBackgroundStatusPoll, j as startHost, k as readStateDump } from "./job-
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
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
|
-
|
|
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
|
-
}
|
|
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}
|
|
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
|
-
|
|
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(
|
|
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-
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import { l as createNativeAdapters, u as createGitNameSeedProvider } from "./src-
|
|
4
|
-
import {
|
|
5
|
-
import { a as classifyRecord, n as assertPreviewHeap, t as runPreview } from "./run-
|
|
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 {
|
|
2
|
-
import { d as runJourneyBaseJob, i as runJourneyOutputVerifyJob, n as runJourneyOutputJob, r as runJourneyOutputShardJob } from "./job-
|
|
3
|
-
import {
|
|
4
|
-
import { l as createNativeAdapters } from "./src-
|
|
5
|
-
import "./src-
|
|
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
|
-
}),
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
}),
|
|
128
|
-
kind: "spool",
|
|
129
|
-
path
|
|
130
|
-
}))
|
|
130
|
+
}), claimWorkerSpool)
|
|
131
131
|
});
|
|
132
132
|
}
|
|
133
133
|
} catch (error) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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");
|