@akasecurity/ai-tc-claude-code 0.9.2 → 0.9.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.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/commands/setup.md +123 -35
- package/hooks/hooks.json +11 -0
- package/package.json +4 -4
- package/scripts/apply-suppressions.js +670 -109
- package/scripts/backfill.js +2050 -151
- package/scripts/filescan.js +734 -116
- package/scripts/firstrun.js +607 -75
- package/scripts/intro.js +179 -22
- package/scripts/message-display.js +28945 -0
- package/scripts/onboard.js +632 -71
- package/scripts/post-tool-use.js +2035 -139
- package/scripts/pre-tool-use.js +2206 -163
- package/scripts/query.js +612 -76
- package/scripts/reconcile.js +2075 -186
- package/scripts/remediate.js +2025 -165
- package/scripts/session-start.js +770 -153
- package/scripts/start-light.js +177 -20
- package/scripts/statusline.js +607 -75
- package/scripts/stop.js +189 -32
- package/scripts/user-prompt-submit.js +2002 -152
package/scripts/stop.js
CHANGED
|
@@ -492,11 +492,11 @@ var require_ignore = __commonJS({
|
|
|
492
492
|
});
|
|
493
493
|
|
|
494
494
|
// ../../packages/plugin-sdk/src/config.ts
|
|
495
|
-
import { existsSync as
|
|
496
|
-
import { join as
|
|
495
|
+
import { existsSync as existsSync4 } from "fs";
|
|
496
|
+
import { join as join7 } from "path";
|
|
497
497
|
|
|
498
498
|
// ../../packages/persistence/src/database.ts
|
|
499
|
-
import { randomUUID as
|
|
499
|
+
import { randomUUID as randomUUID9 } from "crypto";
|
|
500
500
|
import { existsSync, renameSync as renameSync2, rmSync as rmSync2 } from "fs";
|
|
501
501
|
import { join, sep } from "path";
|
|
502
502
|
import { DatabaseSync } from "node:sqlite";
|
|
@@ -16001,6 +16001,7 @@ var ExceptionConditions = external_exports.object({
|
|
|
16001
16001
|
sourceTool: external_exports.string().optional(),
|
|
16002
16002
|
provider: external_exports.string().optional()
|
|
16003
16003
|
}).strict();
|
|
16004
|
+
var ExceptionCapability = external_exports.enum(["suppress", "reveal_to_model"]);
|
|
16004
16005
|
var DetectionException = external_exports.object({
|
|
16005
16006
|
id: external_exports.guid(),
|
|
16006
16007
|
ruleId: external_exports.string(),
|
|
@@ -16017,6 +16018,7 @@ var DetectionException = external_exports.object({
|
|
|
16017
16018
|
keyVersion: external_exports.number().int().positive(),
|
|
16018
16019
|
// maskMatch() preview of the approved value — never the raw value.
|
|
16019
16020
|
maskedValue: external_exports.string(),
|
|
16021
|
+
capability: ExceptionCapability.default("suppress"),
|
|
16020
16022
|
scope: ExceptionScope,
|
|
16021
16023
|
expiresAt: external_exports.iso.datetime().nullable(),
|
|
16022
16024
|
maxUses: external_exports.number().int().positive().nullable(),
|
|
@@ -16040,6 +16042,7 @@ var ExceptionBundleEntry = DetectionException.pick({
|
|
|
16040
16042
|
ruleId: true,
|
|
16041
16043
|
valueFingerprint: true,
|
|
16042
16044
|
keyVersion: true,
|
|
16045
|
+
capability: true,
|
|
16043
16046
|
expiresAt: true,
|
|
16044
16047
|
maxUses: true,
|
|
16045
16048
|
useCount: true,
|
|
@@ -16800,8 +16803,116 @@ var PatchInstalledPackRequest = external_exports.object({
|
|
|
16800
16803
|
message: "At least one field must be provided"
|
|
16801
16804
|
}).meta({ id: "PatchInstalledPackRequest" });
|
|
16802
16805
|
|
|
16806
|
+
// ../../packages/schema/src/zod/vault.ts
|
|
16807
|
+
var CATEGORY_ALTERNATION = DetectionCategory.options.join("|");
|
|
16808
|
+
var POINTER_TOKEN_PATTERN = new RegExp(
|
|
16809
|
+
`\\[\\[aka:(?:${CATEGORY_ALTERNATION}):[A-Z2-7]{2,7}\\.[A-Z2-7]{26}\\.[A-Z2-7]{16}\\]\\]`
|
|
16810
|
+
);
|
|
16811
|
+
var POINTER_TOKEN_ANCHORED = new RegExp(`^${POINTER_TOKEN_PATTERN.source}$`);
|
|
16812
|
+
var PointerToken = external_exports.string().regex(POINTER_TOKEN_ANCHORED);
|
|
16813
|
+
var ParsedPointer = external_exports.object({
|
|
16814
|
+
category: DetectionCategory,
|
|
16815
|
+
keyVersion: external_exports.number().int().positive(),
|
|
16816
|
+
pointerId: external_exports.string(),
|
|
16817
|
+
tag: external_exports.string()
|
|
16818
|
+
});
|
|
16819
|
+
var VaultEntry = external_exports.object({
|
|
16820
|
+
pointerId: external_exports.string(),
|
|
16821
|
+
// The keyed HMAC of the raw value under `exception.key`, and the epoch it was
|
|
16822
|
+
// derived under. This is what a reveal-to-model grant matches on, and it rotates
|
|
16823
|
+
// independently of the vault encryption key below.
|
|
16824
|
+
valueFingerprint: external_exports.string().regex(/^[0-9a-f]{64}$/),
|
|
16825
|
+
fingerprintKeyVersion: external_exports.number().int().positive(),
|
|
16826
|
+
// The vault-key epoch this row's ciphertext was sealed under.
|
|
16827
|
+
keyVersion: external_exports.number().int().positive(),
|
|
16828
|
+
// Fixed at first mint and never updated: the same value detected later under a
|
|
16829
|
+
// different rule's category keeps the category it was minted with, so one
|
|
16830
|
+
// value always produces exactly one wire token.
|
|
16831
|
+
category: DetectionCategory,
|
|
16832
|
+
ruleId: external_exports.string(),
|
|
16833
|
+
// Partial-reveal preview for badges and listings. Never the raw value.
|
|
16834
|
+
maskedMatch: external_exports.string(),
|
|
16835
|
+
provider: external_exports.string().optional(),
|
|
16836
|
+
ciphertext: external_exports.string(),
|
|
16837
|
+
nonce: external_exports.string(),
|
|
16838
|
+
authTag: external_exports.string(),
|
|
16839
|
+
// How many times this value has been detected on this machine — the reuse
|
|
16840
|
+
// signal the vault dashboard reads. Distinct from VaultDeref.pointerCount.
|
|
16841
|
+
occurrenceCount: external_exports.number().int().nonnegative(),
|
|
16842
|
+
firstSeen: external_exports.string(),
|
|
16843
|
+
lastSeen: external_exports.string()
|
|
16844
|
+
});
|
|
16845
|
+
var PointerDescriptor = external_exports.object({
|
|
16846
|
+
category: DetectionCategory,
|
|
16847
|
+
provider: external_exports.string().optional(),
|
|
16848
|
+
maskedMatch: external_exports.string(),
|
|
16849
|
+
occurrences: external_exports.number().int().nonnegative(),
|
|
16850
|
+
firstSeen: external_exports.string(),
|
|
16851
|
+
lastSeen: external_exports.string()
|
|
16852
|
+
});
|
|
16853
|
+
var PointerIdentity = external_exports.object({
|
|
16854
|
+
ruleId: external_exports.string(),
|
|
16855
|
+
valueFingerprint: external_exports.string().regex(/^[0-9a-f]{64}$/),
|
|
16856
|
+
fingerprintKeyVersion: external_exports.number().int().positive()
|
|
16857
|
+
});
|
|
16858
|
+
var DetokenizeTarget = external_exports.enum(["human", "model"]);
|
|
16859
|
+
var VaultDerefReason = external_exports.enum([
|
|
16860
|
+
"display",
|
|
16861
|
+
"explicit-reveal",
|
|
16862
|
+
"view-render",
|
|
16863
|
+
"model-input",
|
|
16864
|
+
"remediation",
|
|
16865
|
+
"purge"
|
|
16866
|
+
]);
|
|
16867
|
+
var VaultDerefOutcome = external_exports.enum(["revealed", "refused", "unavailable"]);
|
|
16868
|
+
var VaultDeref = external_exports.object({
|
|
16869
|
+
id: external_exports.guid(),
|
|
16870
|
+
pointerId: external_exports.string(),
|
|
16871
|
+
at: external_exports.string(),
|
|
16872
|
+
target: DetokenizeTarget,
|
|
16873
|
+
reason: VaultDerefReason,
|
|
16874
|
+
outcome: VaultDerefOutcome,
|
|
16875
|
+
// Present only on a model-target crossing that a reveal grant authorized.
|
|
16876
|
+
grantId: external_exports.string().optional(),
|
|
16877
|
+
// How many pointers ONE batched render resolved. 1 for unbatched rows. Named
|
|
16878
|
+
// apart from VaultEntry.occurrenceCount, which counts detections of a value.
|
|
16879
|
+
pointerCount: external_exports.number().int().positive().default(1)
|
|
16880
|
+
});
|
|
16881
|
+
var VaultSightingKind = external_exports.enum([
|
|
16882
|
+
"prompt",
|
|
16883
|
+
"tool-input",
|
|
16884
|
+
"tool-output",
|
|
16885
|
+
"file",
|
|
16886
|
+
"transcript"
|
|
16887
|
+
]);
|
|
16888
|
+
var VaultSighting = external_exports.object({
|
|
16889
|
+
location: external_exports.string(),
|
|
16890
|
+
kind: VaultSightingKind,
|
|
16891
|
+
firstSeen: external_exports.string(),
|
|
16892
|
+
lastSeen: external_exports.string()
|
|
16893
|
+
});
|
|
16894
|
+
var VaultInventoryEntry = external_exports.object({
|
|
16895
|
+
pointerId: external_exports.string(),
|
|
16896
|
+
category: DetectionCategory,
|
|
16897
|
+
provider: external_exports.string().optional(),
|
|
16898
|
+
maskedMatch: external_exports.string(),
|
|
16899
|
+
occurrences: external_exports.number().int().nonnegative(),
|
|
16900
|
+
firstSeen: external_exports.string(),
|
|
16901
|
+
lastSeen: external_exports.string(),
|
|
16902
|
+
// The active reveal-to-model grant covering this value, when one exists —
|
|
16903
|
+
// the inventory badges it, the row links to revocation.
|
|
16904
|
+
revealGrantId: external_exports.string().nullable(),
|
|
16905
|
+
sightings: external_exports.array(VaultSighting)
|
|
16906
|
+
});
|
|
16907
|
+
var VaultKeyCustody = external_exports.string();
|
|
16908
|
+
var VaultInlineReveal = external_exports.enum(["masked", "full", "off"]);
|
|
16909
|
+
var VaultConsent = external_exports.object({
|
|
16910
|
+
acknowledgedAt: external_exports.iso.datetime(),
|
|
16911
|
+
version: external_exports.number().int().positive()
|
|
16912
|
+
});
|
|
16913
|
+
|
|
16803
16914
|
// ../../packages/schema/src/zod/local.ts
|
|
16804
|
-
var WORKSPACE_SETTINGS_SPEC_VERSION =
|
|
16915
|
+
var WORKSPACE_SETTINGS_SPEC_VERSION = 5;
|
|
16805
16916
|
var RunMode = external_exports.enum(["standalone"]);
|
|
16806
16917
|
var SimpleDetectionPolicy = external_exports.enum(["redact", "warn"]);
|
|
16807
16918
|
var HistoricalAccess = external_exports.enum(["full", "session-only"]);
|
|
@@ -16823,6 +16934,16 @@ var WorkspaceSettings = external_exports.object({
|
|
|
16823
16934
|
// In-place egress extraction on the scan paths; disable to stop all Data
|
|
16824
16935
|
// Shares writes.
|
|
16825
16936
|
dataSharesInPlace: external_exports.boolean().default(true),
|
|
16937
|
+
// Consent to keep a RECOVERABLE encrypted copy of detected values in the local
|
|
16938
|
+
// vault, instead of destroying them. Absent by default: this is a custody
|
|
16939
|
+
// change from one-way redaction, so it is never an assumed grant on upgrade.
|
|
16940
|
+
// Revoking stops future vaulting; it does not erase what is already stored —
|
|
16941
|
+
// purging the vault is the eraser.
|
|
16942
|
+
vaultConsent: VaultConsent.optional(),
|
|
16943
|
+
// Where the vault master key lives.
|
|
16944
|
+
vaultKeyCustody: VaultKeyCustody.default("file"),
|
|
16945
|
+
// How a pointer renders in assistant prose on screen (see VaultInlineReveal).
|
|
16946
|
+
vaultInlineReveal: VaultInlineReveal.default("masked"),
|
|
16826
16947
|
// Absent until /aka:setup completes; its presence is what "onboarded" means.
|
|
16827
16948
|
onboardedAt: external_exports.iso.datetime().optional(),
|
|
16828
16949
|
// Records that the user consented to sending findings to the model API for
|
|
@@ -17253,6 +17374,12 @@ var LIVE_ACTIVITY_WINDOW_MS = 30 * 6e4;
|
|
|
17253
17374
|
import { randomUUID } from "crypto";
|
|
17254
17375
|
var BLOCKED_DETECTIONS_TTL_MS = 30 * 60 * 1e3;
|
|
17255
17376
|
var BLOCKED_DETECTIONS_RETENTION_MS = 24 * 60 * 60 * 1e3;
|
|
17377
|
+
var ACTIVE_PREDICATE = `revoked_at IS NULL
|
|
17378
|
+
AND (expires_at IS NULL OR expires_at > :now)
|
|
17379
|
+
AND (max_uses IS NULL OR use_count < max_uses)`;
|
|
17380
|
+
var ACTIVE_REVEAL_GRANT_PREDICATE = `capability = 'reveal_to_model'
|
|
17381
|
+
AND conditions IS NULL
|
|
17382
|
+
AND ${ACTIVE_PREDICATE}`;
|
|
17256
17383
|
|
|
17257
17384
|
// ../../packages/persistence/src/repositories/installed-packs.ts
|
|
17258
17385
|
import { createHash as createHash2, randomUUID as randomUUID2 } from "crypto";
|
|
@@ -17271,16 +17398,20 @@ import { randomUUID as randomUUID5 } from "crypto";
|
|
|
17271
17398
|
// ../../packages/persistence/src/repositories/resolutions.ts
|
|
17272
17399
|
import { randomUUID as randomUUID6 } from "crypto";
|
|
17273
17400
|
|
|
17274
|
-
// ../../packages/persistence/src/repositories/
|
|
17401
|
+
// ../../packages/persistence/src/repositories/secret-vault.ts
|
|
17275
17402
|
import { randomUUID as randomUUID7 } from "crypto";
|
|
17276
17403
|
|
|
17404
|
+
// ../../packages/persistence/src/repositories/shares.ts
|
|
17405
|
+
import { randomUUID as randomUUID8 } from "crypto";
|
|
17406
|
+
|
|
17277
17407
|
// ../../packages/persistence/src/finding-key.ts
|
|
17278
17408
|
import { createHash as createHash3 } from "crypto";
|
|
17279
17409
|
|
|
17280
17410
|
// ../../packages/persistence/src/fingerprint.ts
|
|
17281
17411
|
import { createHmac, randomBytes } from "crypto";
|
|
17282
|
-
import { readFileSync } from "fs";
|
|
17412
|
+
import { existsSync as existsSync2, readFileSync } from "fs";
|
|
17283
17413
|
import { join as join2 } from "path";
|
|
17414
|
+
import { DatabaseSync as DatabaseSync2 } from "node:sqlite";
|
|
17284
17415
|
|
|
17285
17416
|
// ../../packages/persistence/src/local-layout.ts
|
|
17286
17417
|
import { renameSync as renameSync3 } from "fs";
|
|
@@ -17340,10 +17471,36 @@ function readJson(file2) {
|
|
|
17340
17471
|
return parseJsonObject(text) ?? null;
|
|
17341
17472
|
}
|
|
17342
17473
|
|
|
17343
|
-
// ../../packages/persistence/src/
|
|
17344
|
-
import {
|
|
17474
|
+
// ../../packages/persistence/src/vault/crypto.ts
|
|
17475
|
+
import {
|
|
17476
|
+
createCipheriv,
|
|
17477
|
+
createDecipheriv,
|
|
17478
|
+
createHmac as createHmac2,
|
|
17479
|
+
hkdfSync,
|
|
17480
|
+
timingSafeEqual
|
|
17481
|
+
} from "crypto";
|
|
17482
|
+
|
|
17483
|
+
// ../../packages/persistence/src/vault/key-provider.ts
|
|
17484
|
+
import { execFileSync } from "child_process";
|
|
17485
|
+
import { randomBytes as randomBytes2 } from "crypto";
|
|
17486
|
+
import {
|
|
17487
|
+
chmodSync as chmodSync2,
|
|
17488
|
+
mkdirSync as mkdirSync2,
|
|
17489
|
+
readFileSync as readFileSync3,
|
|
17490
|
+
renameSync as renameSync4,
|
|
17491
|
+
rmSync as rmSync3,
|
|
17492
|
+
statSync,
|
|
17493
|
+
writeFileSync as writeFileSync2
|
|
17494
|
+
} from "fs";
|
|
17345
17495
|
import { join as join5 } from "path";
|
|
17346
17496
|
|
|
17497
|
+
// ../../packages/persistence/src/vault/vault.ts
|
|
17498
|
+
import { randomBytes as randomBytes3, randomUUID as randomUUID10 } from "crypto";
|
|
17499
|
+
|
|
17500
|
+
// ../../packages/persistence/src/warn-era-cap.ts
|
|
17501
|
+
import { existsSync as existsSync3, writeFileSync as writeFileSync3 } from "fs";
|
|
17502
|
+
import { join as join6 } from "path";
|
|
17503
|
+
|
|
17347
17504
|
// ../../packages/plugin-sdk/src/provider-env.ts
|
|
17348
17505
|
var DEFAULT_ANTHROPIC_HOST = "api.anthropic.com";
|
|
17349
17506
|
var booleanish = external_exports.string().optional().transform((v) => {
|
|
@@ -17396,8 +17553,8 @@ function resolveProvider() {
|
|
|
17396
17553
|
function loadConfig(base = defaultDataDir()) {
|
|
17397
17554
|
try {
|
|
17398
17555
|
ensureLayoutDirSync(base);
|
|
17399
|
-
const settingsFile =
|
|
17400
|
-
if (
|
|
17556
|
+
const settingsFile = join7(settingsDir(base), "settings.json");
|
|
17557
|
+
if (existsSync4(settingsFile)) tightenFile(settingsFile);
|
|
17401
17558
|
} catch {
|
|
17402
17559
|
}
|
|
17403
17560
|
migrateLegacyLayout(base);
|
|
@@ -17420,9 +17577,9 @@ function resolveProviderSafe() {
|
|
|
17420
17577
|
}
|
|
17421
17578
|
|
|
17422
17579
|
// ../../packages/plugin-sdk/src/config-inventory.ts
|
|
17423
|
-
import { readdirSync, readFileSync as
|
|
17580
|
+
import { readdirSync, readFileSync as readFileSync5, realpathSync, statSync as statSync3 } from "fs";
|
|
17424
17581
|
import { homedir as homedir2 } from "os";
|
|
17425
|
-
import { basename as basename2, join as
|
|
17582
|
+
import { basename as basename2, join as join9 } from "path";
|
|
17426
17583
|
|
|
17427
17584
|
// ../../packages/detections/src/egress/registry.ts
|
|
17428
17585
|
var EXTRACTOR_VERSION = "1";
|
|
@@ -18133,18 +18290,18 @@ var POLYNOMIAL_PROBES = ["abc-", "a.", "a ", "a=", "x", "0", "a@", "a/", "ab"].m
|
|
|
18133
18290
|
);
|
|
18134
18291
|
|
|
18135
18292
|
// ../../packages/plugin-sdk/src/repo.ts
|
|
18136
|
-
import { existsSync as
|
|
18137
|
-
import { basename, dirname, isAbsolute, join as
|
|
18293
|
+
import { existsSync as existsSync5, readFileSync as readFileSync4, statSync as statSync2 } from "fs";
|
|
18294
|
+
import { basename, dirname, isAbsolute, join as join8, sep as sep2 } from "path";
|
|
18138
18295
|
|
|
18139
18296
|
// ../../packages/plugin-sdk/src/events.ts
|
|
18140
|
-
import { createHash as createHash4, randomUUID as
|
|
18297
|
+
import { createHash as createHash4, randomUUID as randomUUID11 } from "crypto";
|
|
18141
18298
|
|
|
18142
18299
|
// ../../packages/plugin-sdk/src/inventory-resolver.ts
|
|
18143
18300
|
import { arch, hostname as hostname3, platform, release } from "os";
|
|
18144
18301
|
|
|
18145
18302
|
// ../../packages/plugin-sdk/src/nudge.ts
|
|
18146
|
-
import { mkdirSync as
|
|
18147
|
-
import { join as
|
|
18303
|
+
import { mkdirSync as mkdirSync3, readFileSync as readFileSync6, writeFileSync as writeFileSync4 } from "fs";
|
|
18304
|
+
import { join as join10 } from "path";
|
|
18148
18305
|
|
|
18149
18306
|
// ../../packages/plugin-sdk/src/paths.ts
|
|
18150
18307
|
import { readdirSync as readdirSync2, realpathSync as realpathSync2 } from "fs";
|
|
@@ -18152,27 +18309,27 @@ import { basename as basename3, dirname as dirname2, sep as sep3 } from "path";
|
|
|
18152
18309
|
|
|
18153
18310
|
// ../../packages/plugin-sdk/src/project-files.ts
|
|
18154
18311
|
var import_ignore = __toESM(require_ignore(), 1);
|
|
18155
|
-
import { existsSync as
|
|
18156
|
-
import { basename as basename4, join as
|
|
18312
|
+
import { existsSync as existsSync6, readdirSync as readdirSync3, readFileSync as readFileSync7 } from "fs";
|
|
18313
|
+
import { basename as basename4, join as join11, relative, sep as sep4 } from "path";
|
|
18157
18314
|
|
|
18158
18315
|
// ../../packages/plugin-sdk/src/runtime.ts
|
|
18159
|
-
import { randomUUID as
|
|
18316
|
+
import { randomUUID as randomUUID12 } from "crypto";
|
|
18160
18317
|
|
|
18161
18318
|
// ../../packages/plugin-sdk/src/suppressions.ts
|
|
18162
18319
|
var THIRTY_DAYS_MS = 30 * 24 * 60 * 60 * 1e3;
|
|
18163
18320
|
|
|
18164
18321
|
// ../../packages/plugin-sdk/src/throttle.ts
|
|
18165
|
-
import { mkdirSync as
|
|
18166
|
-
import { join as
|
|
18322
|
+
import { mkdirSync as mkdirSync4, statSync as statSync4, writeFileSync as writeFileSync5 } from "fs";
|
|
18323
|
+
import { join as join12 } from "path";
|
|
18167
18324
|
function throttled(dataDir2, markerName, windowMs) {
|
|
18168
|
-
const marker =
|
|
18325
|
+
const marker = join12(dataDir2, markerName);
|
|
18169
18326
|
try {
|
|
18170
|
-
if (Date.now() -
|
|
18327
|
+
if (Date.now() - statSync4(marker).mtimeMs < windowMs) return true;
|
|
18171
18328
|
} catch {
|
|
18172
18329
|
}
|
|
18173
18330
|
try {
|
|
18174
|
-
|
|
18175
|
-
|
|
18331
|
+
mkdirSync4(dataDir2, { recursive: true, mode: DATA_DIR_MODE });
|
|
18332
|
+
writeFileSync5(marker, String(Date.now()), { mode: DATA_FILE_MODE });
|
|
18176
18333
|
} catch {
|
|
18177
18334
|
}
|
|
18178
18335
|
return false;
|
|
@@ -18180,7 +18337,7 @@ function throttled(dataDir2, markerName, windowMs) {
|
|
|
18180
18337
|
|
|
18181
18338
|
// src/history/reconcile-trigger.ts
|
|
18182
18339
|
import { spawn } from "child_process";
|
|
18183
|
-
import { dirname as dirname3, join as
|
|
18340
|
+
import { dirname as dirname3, join as join14 } from "path";
|
|
18184
18341
|
import { fileURLToPath } from "url";
|
|
18185
18342
|
|
|
18186
18343
|
// src/history/tail.ts
|
|
@@ -18188,13 +18345,13 @@ import { createHash as createHash5 } from "crypto";
|
|
|
18188
18345
|
import {
|
|
18189
18346
|
closeSync,
|
|
18190
18347
|
fstatSync,
|
|
18191
|
-
mkdirSync as
|
|
18348
|
+
mkdirSync as mkdirSync5,
|
|
18192
18349
|
openSync,
|
|
18193
|
-
readFileSync as
|
|
18350
|
+
readFileSync as readFileSync8,
|
|
18194
18351
|
readSync,
|
|
18195
|
-
writeFileSync as
|
|
18352
|
+
writeFileSync as writeFileSync6
|
|
18196
18353
|
} from "fs";
|
|
18197
|
-
import { join as
|
|
18354
|
+
import { join as join13 } from "path";
|
|
18198
18355
|
var SAFE_SESSION_ID = /^[A-Za-z0-9._-]+$/;
|
|
18199
18356
|
function safeSessionId(sessionId) {
|
|
18200
18357
|
if (SAFE_SESSION_ID.test(sessionId) && sessionId !== "." && sessionId !== "..") {
|
|
@@ -18211,7 +18368,7 @@ function triggerReconcile(dataDir2, sessionId, transcriptPath) {
|
|
|
18211
18368
|
const marker = `${RECONCILE_MARKER_PREFIX}-${safeSessionId(sessionId)}`;
|
|
18212
18369
|
if (throttled(dataDir2, marker, RECONCILE_THROTTLE_MS)) return;
|
|
18213
18370
|
const here = dirname3(fileURLToPath(import.meta.url));
|
|
18214
|
-
const child = spawn(process.execPath, [
|
|
18371
|
+
const child = spawn(process.execPath, [join14(here, "reconcile.js"), sessionId, transcriptPath], {
|
|
18215
18372
|
detached: true,
|
|
18216
18373
|
stdio: "ignore"
|
|
18217
18374
|
});
|