@akasecurity/ai-tc-claude-code 0.9.3 → 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/scripts/stop.js CHANGED
@@ -493,10 +493,10 @@ var require_ignore = __commonJS({
493
493
 
494
494
  // ../../packages/plugin-sdk/src/config.ts
495
495
  import { existsSync as existsSync4 } from "fs";
496
- import { join as join6 } from "path";
496
+ import { join as join7 } from "path";
497
497
 
498
498
  // ../../packages/persistence/src/database.ts
499
- import { randomUUID as randomUUID8 } from "crypto";
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 = 4;
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,9 +17398,12 @@ 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/shares.ts
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
 
@@ -17341,10 +17471,36 @@ function readJson(file2) {
17341
17471
  return parseJsonObject(text) ?? null;
17342
17472
  }
17343
17473
 
17344
- // ../../packages/persistence/src/warn-era-cap.ts
17345
- import { existsSync as existsSync3, writeFileSync as writeFileSync2 } from "fs";
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";
17346
17495
  import { join as join5 } from "path";
17347
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
+
17348
17504
  // ../../packages/plugin-sdk/src/provider-env.ts
17349
17505
  var DEFAULT_ANTHROPIC_HOST = "api.anthropic.com";
17350
17506
  var booleanish = external_exports.string().optional().transform((v) => {
@@ -17397,7 +17553,7 @@ function resolveProvider() {
17397
17553
  function loadConfig(base = defaultDataDir()) {
17398
17554
  try {
17399
17555
  ensureLayoutDirSync(base);
17400
- const settingsFile = join6(settingsDir(base), "settings.json");
17556
+ const settingsFile = join7(settingsDir(base), "settings.json");
17401
17557
  if (existsSync4(settingsFile)) tightenFile(settingsFile);
17402
17558
  } catch {
17403
17559
  }
@@ -17421,9 +17577,9 @@ function resolveProviderSafe() {
17421
17577
  }
17422
17578
 
17423
17579
  // ../../packages/plugin-sdk/src/config-inventory.ts
17424
- import { readdirSync, readFileSync as readFileSync4, realpathSync, statSync as statSync2 } from "fs";
17580
+ import { readdirSync, readFileSync as readFileSync5, realpathSync, statSync as statSync3 } from "fs";
17425
17581
  import { homedir as homedir2 } from "os";
17426
- import { basename as basename2, join as join8 } from "path";
17582
+ import { basename as basename2, join as join9 } from "path";
17427
17583
 
17428
17584
  // ../../packages/detections/src/egress/registry.ts
17429
17585
  var EXTRACTOR_VERSION = "1";
@@ -18134,18 +18290,18 @@ var POLYNOMIAL_PROBES = ["abc-", "a.", "a ", "a=", "x", "0", "a@", "a/", "ab"].m
18134
18290
  );
18135
18291
 
18136
18292
  // ../../packages/plugin-sdk/src/repo.ts
18137
- import { existsSync as existsSync5, readFileSync as readFileSync3, statSync } from "fs";
18138
- import { basename, dirname, isAbsolute, join as join7, sep as sep2 } from "path";
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";
18139
18295
 
18140
18296
  // ../../packages/plugin-sdk/src/events.ts
18141
- import { createHash as createHash4, randomUUID as randomUUID9 } from "crypto";
18297
+ import { createHash as createHash4, randomUUID as randomUUID11 } from "crypto";
18142
18298
 
18143
18299
  // ../../packages/plugin-sdk/src/inventory-resolver.ts
18144
18300
  import { arch, hostname as hostname3, platform, release } from "os";
18145
18301
 
18146
18302
  // ../../packages/plugin-sdk/src/nudge.ts
18147
- import { mkdirSync as mkdirSync2, readFileSync as readFileSync5, writeFileSync as writeFileSync3 } from "fs";
18148
- import { join as join9 } from "path";
18303
+ import { mkdirSync as mkdirSync3, readFileSync as readFileSync6, writeFileSync as writeFileSync4 } from "fs";
18304
+ import { join as join10 } from "path";
18149
18305
 
18150
18306
  // ../../packages/plugin-sdk/src/paths.ts
18151
18307
  import { readdirSync as readdirSync2, realpathSync as realpathSync2 } from "fs";
@@ -18153,27 +18309,27 @@ import { basename as basename3, dirname as dirname2, sep as sep3 } from "path";
18153
18309
 
18154
18310
  // ../../packages/plugin-sdk/src/project-files.ts
18155
18311
  var import_ignore = __toESM(require_ignore(), 1);
18156
- import { existsSync as existsSync6, readdirSync as readdirSync3, readFileSync as readFileSync6 } from "fs";
18157
- import { basename as basename4, join as join10, relative, sep as sep4 } from "path";
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";
18158
18314
 
18159
18315
  // ../../packages/plugin-sdk/src/runtime.ts
18160
- import { randomUUID as randomUUID10 } from "crypto";
18316
+ import { randomUUID as randomUUID12 } from "crypto";
18161
18317
 
18162
18318
  // ../../packages/plugin-sdk/src/suppressions.ts
18163
18319
  var THIRTY_DAYS_MS = 30 * 24 * 60 * 60 * 1e3;
18164
18320
 
18165
18321
  // ../../packages/plugin-sdk/src/throttle.ts
18166
- import { mkdirSync as mkdirSync3, statSync as statSync3, writeFileSync as writeFileSync4 } from "fs";
18167
- import { join as join11 } from "path";
18322
+ import { mkdirSync as mkdirSync4, statSync as statSync4, writeFileSync as writeFileSync5 } from "fs";
18323
+ import { join as join12 } from "path";
18168
18324
  function throttled(dataDir2, markerName, windowMs) {
18169
- const marker = join11(dataDir2, markerName);
18325
+ const marker = join12(dataDir2, markerName);
18170
18326
  try {
18171
- if (Date.now() - statSync3(marker).mtimeMs < windowMs) return true;
18327
+ if (Date.now() - statSync4(marker).mtimeMs < windowMs) return true;
18172
18328
  } catch {
18173
18329
  }
18174
18330
  try {
18175
- mkdirSync3(dataDir2, { recursive: true, mode: DATA_DIR_MODE });
18176
- writeFileSync4(marker, String(Date.now()), { mode: DATA_FILE_MODE });
18331
+ mkdirSync4(dataDir2, { recursive: true, mode: DATA_DIR_MODE });
18332
+ writeFileSync5(marker, String(Date.now()), { mode: DATA_FILE_MODE });
18177
18333
  } catch {
18178
18334
  }
18179
18335
  return false;
@@ -18181,7 +18337,7 @@ function throttled(dataDir2, markerName, windowMs) {
18181
18337
 
18182
18338
  // src/history/reconcile-trigger.ts
18183
18339
  import { spawn } from "child_process";
18184
- import { dirname as dirname3, join as join13 } from "path";
18340
+ import { dirname as dirname3, join as join14 } from "path";
18185
18341
  import { fileURLToPath } from "url";
18186
18342
 
18187
18343
  // src/history/tail.ts
@@ -18189,13 +18345,13 @@ import { createHash as createHash5 } from "crypto";
18189
18345
  import {
18190
18346
  closeSync,
18191
18347
  fstatSync,
18192
- mkdirSync as mkdirSync4,
18348
+ mkdirSync as mkdirSync5,
18193
18349
  openSync,
18194
- readFileSync as readFileSync7,
18350
+ readFileSync as readFileSync8,
18195
18351
  readSync,
18196
- writeFileSync as writeFileSync5
18352
+ writeFileSync as writeFileSync6
18197
18353
  } from "fs";
18198
- import { join as join12 } from "path";
18354
+ import { join as join13 } from "path";
18199
18355
  var SAFE_SESSION_ID = /^[A-Za-z0-9._-]+$/;
18200
18356
  function safeSessionId(sessionId) {
18201
18357
  if (SAFE_SESSION_ID.test(sessionId) && sessionId !== "." && sessionId !== "..") {
@@ -18212,7 +18368,7 @@ function triggerReconcile(dataDir2, sessionId, transcriptPath) {
18212
18368
  const marker = `${RECONCILE_MARKER_PREFIX}-${safeSessionId(sessionId)}`;
18213
18369
  if (throttled(dataDir2, marker, RECONCILE_THROTTLE_MS)) return;
18214
18370
  const here = dirname3(fileURLToPath(import.meta.url));
18215
- const child = spawn(process.execPath, [join13(here, "reconcile.js"), sessionId, transcriptPath], {
18371
+ const child = spawn(process.execPath, [join14(here, "reconcile.js"), sessionId, transcriptPath], {
18216
18372
  detached: true,
18217
18373
  stdio: "ignore"
18218
18374
  });