@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/.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 +581 -69
- package/scripts/backfill.js +1954 -147
- package/scripts/filescan.js +602 -76
- package/scripts/firstrun.js +517 -34
- package/scripts/intro.js +176 -20
- package/scripts/message-display.js +28945 -0
- package/scripts/onboard.js +542 -30
- package/scripts/post-tool-use.js +1943 -139
- package/scripts/pre-tool-use.js +2114 -163
- package/scripts/query.js +522 -35
- package/scripts/reconcile.js +2082 -242
- package/scripts/remediate.js +1872 -104
- package/scripts/session-start.js +680 -112
- package/scripts/start-light.js +174 -18
- package/scripts/statusline.js +517 -34
- package/scripts/stop.js +185 -29
- package/scripts/user-prompt-submit.js +1910 -152
package/scripts/intro.js
CHANGED
|
@@ -492,7 +492,7 @@ var require_ignore = __commonJS({
|
|
|
492
492
|
});
|
|
493
493
|
|
|
494
494
|
// src/intro.ts
|
|
495
|
-
import { readFileSync as
|
|
495
|
+
import { readFileSync as readFileSync8 } from "fs";
|
|
496
496
|
|
|
497
497
|
// ../../packages/schema/src/exception-scope.ts
|
|
498
498
|
var MINUTE_MS = 6e4;
|
|
@@ -15997,6 +15997,7 @@ var ExceptionConditions = external_exports.object({
|
|
|
15997
15997
|
sourceTool: external_exports.string().optional(),
|
|
15998
15998
|
provider: external_exports.string().optional()
|
|
15999
15999
|
}).strict();
|
|
16000
|
+
var ExceptionCapability = external_exports.enum(["suppress", "reveal_to_model"]);
|
|
16000
16001
|
var DetectionException = external_exports.object({
|
|
16001
16002
|
id: external_exports.guid(),
|
|
16002
16003
|
ruleId: external_exports.string(),
|
|
@@ -16013,6 +16014,7 @@ var DetectionException = external_exports.object({
|
|
|
16013
16014
|
keyVersion: external_exports.number().int().positive(),
|
|
16014
16015
|
// maskMatch() preview of the approved value — never the raw value.
|
|
16015
16016
|
maskedValue: external_exports.string(),
|
|
16017
|
+
capability: ExceptionCapability.default("suppress"),
|
|
16016
16018
|
scope: ExceptionScope,
|
|
16017
16019
|
expiresAt: external_exports.iso.datetime().nullable(),
|
|
16018
16020
|
maxUses: external_exports.number().int().positive().nullable(),
|
|
@@ -16036,6 +16038,7 @@ var ExceptionBundleEntry = DetectionException.pick({
|
|
|
16036
16038
|
ruleId: true,
|
|
16037
16039
|
valueFingerprint: true,
|
|
16038
16040
|
keyVersion: true,
|
|
16041
|
+
capability: true,
|
|
16039
16042
|
expiresAt: true,
|
|
16040
16043
|
maxUses: true,
|
|
16041
16044
|
useCount: true,
|
|
@@ -16796,8 +16799,116 @@ var PatchInstalledPackRequest = external_exports.object({
|
|
|
16796
16799
|
message: "At least one field must be provided"
|
|
16797
16800
|
}).meta({ id: "PatchInstalledPackRequest" });
|
|
16798
16801
|
|
|
16802
|
+
// ../../packages/schema/src/zod/vault.ts
|
|
16803
|
+
var CATEGORY_ALTERNATION = DetectionCategory.options.join("|");
|
|
16804
|
+
var POINTER_TOKEN_PATTERN = new RegExp(
|
|
16805
|
+
`\\[\\[aka:(?:${CATEGORY_ALTERNATION}):[A-Z2-7]{2,7}\\.[A-Z2-7]{26}\\.[A-Z2-7]{16}\\]\\]`
|
|
16806
|
+
);
|
|
16807
|
+
var POINTER_TOKEN_ANCHORED = new RegExp(`^${POINTER_TOKEN_PATTERN.source}$`);
|
|
16808
|
+
var PointerToken = external_exports.string().regex(POINTER_TOKEN_ANCHORED);
|
|
16809
|
+
var ParsedPointer = external_exports.object({
|
|
16810
|
+
category: DetectionCategory,
|
|
16811
|
+
keyVersion: external_exports.number().int().positive(),
|
|
16812
|
+
pointerId: external_exports.string(),
|
|
16813
|
+
tag: external_exports.string()
|
|
16814
|
+
});
|
|
16815
|
+
var VaultEntry = external_exports.object({
|
|
16816
|
+
pointerId: external_exports.string(),
|
|
16817
|
+
// The keyed HMAC of the raw value under `exception.key`, and the epoch it was
|
|
16818
|
+
// derived under. This is what a reveal-to-model grant matches on, and it rotates
|
|
16819
|
+
// independently of the vault encryption key below.
|
|
16820
|
+
valueFingerprint: external_exports.string().regex(/^[0-9a-f]{64}$/),
|
|
16821
|
+
fingerprintKeyVersion: external_exports.number().int().positive(),
|
|
16822
|
+
// The vault-key epoch this row's ciphertext was sealed under.
|
|
16823
|
+
keyVersion: external_exports.number().int().positive(),
|
|
16824
|
+
// Fixed at first mint and never updated: the same value detected later under a
|
|
16825
|
+
// different rule's category keeps the category it was minted with, so one
|
|
16826
|
+
// value always produces exactly one wire token.
|
|
16827
|
+
category: DetectionCategory,
|
|
16828
|
+
ruleId: external_exports.string(),
|
|
16829
|
+
// Partial-reveal preview for badges and listings. Never the raw value.
|
|
16830
|
+
maskedMatch: external_exports.string(),
|
|
16831
|
+
provider: external_exports.string().optional(),
|
|
16832
|
+
ciphertext: external_exports.string(),
|
|
16833
|
+
nonce: external_exports.string(),
|
|
16834
|
+
authTag: external_exports.string(),
|
|
16835
|
+
// How many times this value has been detected on this machine — the reuse
|
|
16836
|
+
// signal the vault dashboard reads. Distinct from VaultDeref.pointerCount.
|
|
16837
|
+
occurrenceCount: external_exports.number().int().nonnegative(),
|
|
16838
|
+
firstSeen: external_exports.string(),
|
|
16839
|
+
lastSeen: external_exports.string()
|
|
16840
|
+
});
|
|
16841
|
+
var PointerDescriptor = external_exports.object({
|
|
16842
|
+
category: DetectionCategory,
|
|
16843
|
+
provider: external_exports.string().optional(),
|
|
16844
|
+
maskedMatch: external_exports.string(),
|
|
16845
|
+
occurrences: external_exports.number().int().nonnegative(),
|
|
16846
|
+
firstSeen: external_exports.string(),
|
|
16847
|
+
lastSeen: external_exports.string()
|
|
16848
|
+
});
|
|
16849
|
+
var PointerIdentity = external_exports.object({
|
|
16850
|
+
ruleId: external_exports.string(),
|
|
16851
|
+
valueFingerprint: external_exports.string().regex(/^[0-9a-f]{64}$/),
|
|
16852
|
+
fingerprintKeyVersion: external_exports.number().int().positive()
|
|
16853
|
+
});
|
|
16854
|
+
var DetokenizeTarget = external_exports.enum(["human", "model"]);
|
|
16855
|
+
var VaultDerefReason = external_exports.enum([
|
|
16856
|
+
"display",
|
|
16857
|
+
"explicit-reveal",
|
|
16858
|
+
"view-render",
|
|
16859
|
+
"model-input",
|
|
16860
|
+
"remediation",
|
|
16861
|
+
"purge"
|
|
16862
|
+
]);
|
|
16863
|
+
var VaultDerefOutcome = external_exports.enum(["revealed", "refused", "unavailable"]);
|
|
16864
|
+
var VaultDeref = external_exports.object({
|
|
16865
|
+
id: external_exports.guid(),
|
|
16866
|
+
pointerId: external_exports.string(),
|
|
16867
|
+
at: external_exports.string(),
|
|
16868
|
+
target: DetokenizeTarget,
|
|
16869
|
+
reason: VaultDerefReason,
|
|
16870
|
+
outcome: VaultDerefOutcome,
|
|
16871
|
+
// Present only on a model-target crossing that a reveal grant authorized.
|
|
16872
|
+
grantId: external_exports.string().optional(),
|
|
16873
|
+
// How many pointers ONE batched render resolved. 1 for unbatched rows. Named
|
|
16874
|
+
// apart from VaultEntry.occurrenceCount, which counts detections of a value.
|
|
16875
|
+
pointerCount: external_exports.number().int().positive().default(1)
|
|
16876
|
+
});
|
|
16877
|
+
var VaultSightingKind = external_exports.enum([
|
|
16878
|
+
"prompt",
|
|
16879
|
+
"tool-input",
|
|
16880
|
+
"tool-output",
|
|
16881
|
+
"file",
|
|
16882
|
+
"transcript"
|
|
16883
|
+
]);
|
|
16884
|
+
var VaultSighting = external_exports.object({
|
|
16885
|
+
location: external_exports.string(),
|
|
16886
|
+
kind: VaultSightingKind,
|
|
16887
|
+
firstSeen: external_exports.string(),
|
|
16888
|
+
lastSeen: external_exports.string()
|
|
16889
|
+
});
|
|
16890
|
+
var VaultInventoryEntry = external_exports.object({
|
|
16891
|
+
pointerId: external_exports.string(),
|
|
16892
|
+
category: DetectionCategory,
|
|
16893
|
+
provider: external_exports.string().optional(),
|
|
16894
|
+
maskedMatch: external_exports.string(),
|
|
16895
|
+
occurrences: external_exports.number().int().nonnegative(),
|
|
16896
|
+
firstSeen: external_exports.string(),
|
|
16897
|
+
lastSeen: external_exports.string(),
|
|
16898
|
+
// The active reveal-to-model grant covering this value, when one exists —
|
|
16899
|
+
// the inventory badges it, the row links to revocation.
|
|
16900
|
+
revealGrantId: external_exports.string().nullable(),
|
|
16901
|
+
sightings: external_exports.array(VaultSighting)
|
|
16902
|
+
});
|
|
16903
|
+
var VaultKeyCustody = external_exports.string();
|
|
16904
|
+
var VaultInlineReveal = external_exports.enum(["masked", "full", "off"]);
|
|
16905
|
+
var VaultConsent = external_exports.object({
|
|
16906
|
+
acknowledgedAt: external_exports.iso.datetime(),
|
|
16907
|
+
version: external_exports.number().int().positive()
|
|
16908
|
+
});
|
|
16909
|
+
|
|
16799
16910
|
// ../../packages/schema/src/zod/local.ts
|
|
16800
|
-
var WORKSPACE_SETTINGS_SPEC_VERSION =
|
|
16911
|
+
var WORKSPACE_SETTINGS_SPEC_VERSION = 5;
|
|
16801
16912
|
var RunMode = external_exports.enum(["standalone"]);
|
|
16802
16913
|
var SimpleDetectionPolicy = external_exports.enum(["redact", "warn"]);
|
|
16803
16914
|
var HistoricalAccess = external_exports.enum(["full", "session-only"]);
|
|
@@ -16819,6 +16930,16 @@ var WorkspaceSettings = external_exports.object({
|
|
|
16819
16930
|
// In-place egress extraction on the scan paths; disable to stop all Data
|
|
16820
16931
|
// Shares writes.
|
|
16821
16932
|
dataSharesInPlace: external_exports.boolean().default(true),
|
|
16933
|
+
// Consent to keep a RECOVERABLE encrypted copy of detected values in the local
|
|
16934
|
+
// vault, instead of destroying them. Absent by default: this is a custody
|
|
16935
|
+
// change from one-way redaction, so it is never an assumed grant on upgrade.
|
|
16936
|
+
// Revoking stops future vaulting; it does not erase what is already stored —
|
|
16937
|
+
// purging the vault is the eraser.
|
|
16938
|
+
vaultConsent: VaultConsent.optional(),
|
|
16939
|
+
// Where the vault master key lives.
|
|
16940
|
+
vaultKeyCustody: VaultKeyCustody.default("file"),
|
|
16941
|
+
// How a pointer renders in assistant prose on screen (see VaultInlineReveal).
|
|
16942
|
+
vaultInlineReveal: VaultInlineReveal.default("masked"),
|
|
16822
16943
|
// Absent until /aka:setup completes; its presence is what "onboarded" means.
|
|
16823
16944
|
onboardedAt: external_exports.iso.datetime().optional(),
|
|
16824
16945
|
// Records that the user consented to sending findings to the model API for
|
|
@@ -17206,10 +17327,10 @@ var USE_SHELL = process.platform === "win32";
|
|
|
17206
17327
|
|
|
17207
17328
|
// ../../packages/plugin-sdk/src/config.ts
|
|
17208
17329
|
import { existsSync as existsSync4 } from "fs";
|
|
17209
|
-
import { join as
|
|
17330
|
+
import { join as join7 } from "path";
|
|
17210
17331
|
|
|
17211
17332
|
// ../../packages/persistence/src/database.ts
|
|
17212
|
-
import { randomUUID as
|
|
17333
|
+
import { randomUUID as randomUUID9 } from "crypto";
|
|
17213
17334
|
import { existsSync, renameSync as renameSync2, rmSync as rmSync2 } from "fs";
|
|
17214
17335
|
import { join, sep } from "path";
|
|
17215
17336
|
import { DatabaseSync } from "node:sqlite";
|
|
@@ -17227,6 +17348,12 @@ var LIVE_ACTIVITY_WINDOW_MS = 30 * 6e4;
|
|
|
17227
17348
|
import { randomUUID } from "crypto";
|
|
17228
17349
|
var BLOCKED_DETECTIONS_TTL_MS = 30 * 60 * 1e3;
|
|
17229
17350
|
var BLOCKED_DETECTIONS_RETENTION_MS = 24 * 60 * 60 * 1e3;
|
|
17351
|
+
var ACTIVE_PREDICATE = `revoked_at IS NULL
|
|
17352
|
+
AND (expires_at IS NULL OR expires_at > :now)
|
|
17353
|
+
AND (max_uses IS NULL OR use_count < max_uses)`;
|
|
17354
|
+
var ACTIVE_REVEAL_GRANT_PREDICATE = `capability = 'reveal_to_model'
|
|
17355
|
+
AND conditions IS NULL
|
|
17356
|
+
AND ${ACTIVE_PREDICATE}`;
|
|
17230
17357
|
|
|
17231
17358
|
// ../../packages/persistence/src/repositories/installed-packs.ts
|
|
17232
17359
|
import { createHash as createHash2, randomUUID as randomUUID2 } from "crypto";
|
|
@@ -17245,9 +17372,12 @@ import { randomUUID as randomUUID5 } from "crypto";
|
|
|
17245
17372
|
// ../../packages/persistence/src/repositories/resolutions.ts
|
|
17246
17373
|
import { randomUUID as randomUUID6 } from "crypto";
|
|
17247
17374
|
|
|
17248
|
-
// ../../packages/persistence/src/repositories/
|
|
17375
|
+
// ../../packages/persistence/src/repositories/secret-vault.ts
|
|
17249
17376
|
import { randomUUID as randomUUID7 } from "crypto";
|
|
17250
17377
|
|
|
17378
|
+
// ../../packages/persistence/src/repositories/shares.ts
|
|
17379
|
+
import { randomUUID as randomUUID8 } from "crypto";
|
|
17380
|
+
|
|
17251
17381
|
// ../../packages/persistence/src/finding-key.ts
|
|
17252
17382
|
import { createHash as createHash3 } from "crypto";
|
|
17253
17383
|
|
|
@@ -17267,10 +17397,36 @@ import { join as join3 } from "path";
|
|
|
17267
17397
|
import { readFileSync as readFileSync2 } from "fs";
|
|
17268
17398
|
import { join as join4 } from "path";
|
|
17269
17399
|
|
|
17270
|
-
// ../../packages/persistence/src/
|
|
17271
|
-
import {
|
|
17400
|
+
// ../../packages/persistence/src/vault/crypto.ts
|
|
17401
|
+
import {
|
|
17402
|
+
createCipheriv,
|
|
17403
|
+
createDecipheriv,
|
|
17404
|
+
createHmac as createHmac2,
|
|
17405
|
+
hkdfSync,
|
|
17406
|
+
timingSafeEqual
|
|
17407
|
+
} from "crypto";
|
|
17408
|
+
|
|
17409
|
+
// ../../packages/persistence/src/vault/key-provider.ts
|
|
17410
|
+
import { execFileSync as execFileSync2 } from "child_process";
|
|
17411
|
+
import { randomBytes as randomBytes2 } from "crypto";
|
|
17412
|
+
import {
|
|
17413
|
+
chmodSync as chmodSync2,
|
|
17414
|
+
mkdirSync as mkdirSync2,
|
|
17415
|
+
readFileSync as readFileSync3,
|
|
17416
|
+
renameSync as renameSync4,
|
|
17417
|
+
rmSync as rmSync3,
|
|
17418
|
+
statSync,
|
|
17419
|
+
writeFileSync as writeFileSync2
|
|
17420
|
+
} from "fs";
|
|
17272
17421
|
import { join as join5 } from "path";
|
|
17273
17422
|
|
|
17423
|
+
// ../../packages/persistence/src/vault/vault.ts
|
|
17424
|
+
import { randomBytes as randomBytes3, randomUUID as randomUUID10 } from "crypto";
|
|
17425
|
+
|
|
17426
|
+
// ../../packages/persistence/src/warn-era-cap.ts
|
|
17427
|
+
import { existsSync as existsSync3, writeFileSync as writeFileSync3 } from "fs";
|
|
17428
|
+
import { join as join6 } from "path";
|
|
17429
|
+
|
|
17274
17430
|
// ../../packages/plugin-sdk/src/provider-env.ts
|
|
17275
17431
|
var booleanish = external_exports.string().optional().transform((v) => {
|
|
17276
17432
|
if (v === void 0) return void 0;
|
|
@@ -17290,9 +17446,9 @@ var providerEnvShape = {
|
|
|
17290
17446
|
var ProviderEnvSchema = external_exports.object(providerEnvShape);
|
|
17291
17447
|
|
|
17292
17448
|
// ../../packages/plugin-sdk/src/config-inventory.ts
|
|
17293
|
-
import { readdirSync, readFileSync as
|
|
17449
|
+
import { readdirSync, readFileSync as readFileSync5, realpathSync, statSync as statSync3 } from "fs";
|
|
17294
17450
|
import { homedir as homedir2 } from "os";
|
|
17295
|
-
import { basename as basename2, join as
|
|
17451
|
+
import { basename as basename2, join as join9 } from "path";
|
|
17296
17452
|
|
|
17297
17453
|
// ../../packages/detections/src/egress/registry.ts
|
|
17298
17454
|
var EXTRACTOR_VERSION = "1";
|
|
@@ -18003,18 +18159,18 @@ var POLYNOMIAL_PROBES = ["abc-", "a.", "a ", "a=", "x", "0", "a@", "a/", "ab"].m
|
|
|
18003
18159
|
);
|
|
18004
18160
|
|
|
18005
18161
|
// ../../packages/plugin-sdk/src/repo.ts
|
|
18006
|
-
import { existsSync as existsSync5, readFileSync as
|
|
18007
|
-
import { basename, dirname, isAbsolute, join as
|
|
18162
|
+
import { existsSync as existsSync5, readFileSync as readFileSync4, statSync as statSync2 } from "fs";
|
|
18163
|
+
import { basename, dirname, isAbsolute, join as join8, sep as sep2 } from "path";
|
|
18008
18164
|
|
|
18009
18165
|
// ../../packages/plugin-sdk/src/events.ts
|
|
18010
|
-
import { createHash as createHash4, randomUUID as
|
|
18166
|
+
import { createHash as createHash4, randomUUID as randomUUID11 } from "crypto";
|
|
18011
18167
|
|
|
18012
18168
|
// ../../packages/plugin-sdk/src/inventory-resolver.ts
|
|
18013
18169
|
import { arch, hostname as hostname3, platform, release } from "os";
|
|
18014
18170
|
|
|
18015
18171
|
// ../../packages/plugin-sdk/src/nudge.ts
|
|
18016
|
-
import { mkdirSync as
|
|
18017
|
-
import { join as
|
|
18172
|
+
import { mkdirSync as mkdirSync3, readFileSync as readFileSync6, writeFileSync as writeFileSync4 } from "fs";
|
|
18173
|
+
import { join as join10 } from "path";
|
|
18018
18174
|
|
|
18019
18175
|
// ../../packages/plugin-sdk/src/paths.ts
|
|
18020
18176
|
import { readdirSync as readdirSync2, realpathSync as realpathSync2 } from "fs";
|
|
@@ -18022,18 +18178,18 @@ import { basename as basename3, dirname as dirname2, sep as sep3 } from "path";
|
|
|
18022
18178
|
|
|
18023
18179
|
// ../../packages/plugin-sdk/src/project-files.ts
|
|
18024
18180
|
var import_ignore = __toESM(require_ignore(), 1);
|
|
18025
|
-
import { existsSync as existsSync6, readdirSync as readdirSync3, readFileSync as
|
|
18026
|
-
import { basename as basename4, join as
|
|
18181
|
+
import { existsSync as existsSync6, readdirSync as readdirSync3, readFileSync as readFileSync7 } from "fs";
|
|
18182
|
+
import { basename as basename4, join as join11, relative, sep as sep4 } from "path";
|
|
18027
18183
|
|
|
18028
18184
|
// ../../packages/plugin-sdk/src/runtime.ts
|
|
18029
|
-
import { randomUUID as
|
|
18185
|
+
import { randomUUID as randomUUID12 } from "crypto";
|
|
18030
18186
|
|
|
18031
18187
|
// ../../packages/plugin-sdk/src/suppressions.ts
|
|
18032
18188
|
var THIRTY_DAYS_MS = 30 * 24 * 60 * 60 * 1e3;
|
|
18033
18189
|
|
|
18034
18190
|
// ../../packages/plugin-sdk/src/throttle.ts
|
|
18035
|
-
import { mkdirSync as
|
|
18036
|
-
import { join as
|
|
18191
|
+
import { mkdirSync as mkdirSync4, statSync as statSync4, writeFileSync as writeFileSync5 } from "fs";
|
|
18192
|
+
import { join as join12 } from "path";
|
|
18037
18193
|
|
|
18038
18194
|
// src/command-registry.ts
|
|
18039
18195
|
import { readdirSync as readdirSync4 } from "fs";
|
|
@@ -18137,7 +18293,7 @@ function buildIntroCard(manifest2, verified) {
|
|
|
18137
18293
|
var manifestPath = process.argv[2];
|
|
18138
18294
|
var manifest = {};
|
|
18139
18295
|
try {
|
|
18140
|
-
manifest = JSON.parse(
|
|
18296
|
+
manifest = JSON.parse(readFileSync8(manifestPath ?? "", "utf8"));
|
|
18141
18297
|
} catch {
|
|
18142
18298
|
}
|
|
18143
18299
|
process.stdout.write(show(fenced(buildIntroCard(manifest))));
|