@akasecurity/ai-tc-claude-code 0.9.10 → 0.9.11

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.
@@ -492,8 +492,8 @@ var require_ignore = __commonJS({
492
492
  });
493
493
 
494
494
  // ../../packages/plugin-sdk/src/config.ts
495
- import { existsSync as existsSync7 } from "fs";
496
- import { join as join13 } from "path";
495
+ import { existsSync as existsSync8 } from "fs";
496
+ import { join as join14 } from "path";
497
497
 
498
498
  // ../../packages/persistence/src/attached-derived.ts
499
499
  import { rmSync } from "fs";
@@ -20385,13 +20385,11 @@ var FindingGroup = external_exports.object({
20385
20385
  latestDetectedAt: external_exports.iso.datetime(),
20386
20386
  instances: external_exports.array(FindingInstance),
20387
20387
  // Derived from instances' statuses with open-dominates precedence (see
20388
- // buildFindingGroups). Undefined only when no instance carries a status.
20388
+ // foldGroupStatus). Undefined only when no instance carries a status.
20389
20389
  status: FindingStatus.optional(),
20390
- // The distinct people across the WHOLE group, not just the `instances`
20391
- // preview — from the store's whole-group aggregate when it supplies one,
20392
- // else folded from the rows (see buildFindingGroups). Undefined when no
20393
- // instance carries a user, or when the store supplied whole-group folds
20394
- // without one.
20390
+ // The distinct people across the WHOLE group, not just the instances
20391
+ // carried here. Undefined when no instance carries a user, or when the
20392
+ // store supplied whole-group folds without one.
20395
20393
  users: external_exports.array(FindingUser).optional()
20396
20394
  }).meta({ id: "FindingGroup" });
20397
20395
  var FindingStats = external_exports.object({
@@ -20420,20 +20418,30 @@ var FindingFacets = external_exports.object({
20420
20418
  // counted under no value.
20421
20419
  status: external_exports.array(FindingFacetItem),
20422
20420
  // Host tool (attributes.tool_name). Present only on the instance-level
20423
- // reads, which can filter by it; the grouped read omits the dimension
20421
+ // reads, which can filter by it; the type-level read omits the dimension
20424
20422
  // because a group spans tools.
20425
20423
  tool: external_exports.array(FindingFacetItem).optional()
20426
20424
  }).meta({ id: "FindingFacets" });
20427
- var ListGroupedFindingsQuery = external_exports.object({
20425
+ var FindingTypeSummary = FindingGroup.omit({ instances: true, match: true }).meta({
20426
+ id: "FindingTypeSummary"
20427
+ });
20428
+ var MAX_FINDING_TYPES_LIMIT = 100;
20429
+ var ListFindingTypesQuery = external_exports.object({
20428
20430
  // NOTE: severity filters by Severity (critical/high/medium/low), not by
20429
- // FindingAction.
20431
+ // FindingAction. It narrows TYPES: a type's severity is the one its newest
20432
+ // firing version carries, and this list pages types.
20433
+ //
20434
+ // That is NOT a claim the findings of a type share it. A rule can hold several
20435
+ // definition versions at different severities, so a type kept by this filter
20436
+ // can hold findings that individually do not match — see totals.findings on
20437
+ // ListFindingTypesResponse, which counts them all.
20430
20438
  severity: external_exports.array(Severity).optional(),
20431
20439
  subtype: external_exports.array(external_exports.string()).optional(),
20432
20440
  provider: external_exports.array(FindingProvider).optional(),
20433
20441
  action: external_exports.array(FindingAction).optional(),
20434
- // Matches a group's DERIVED status (see FindingGroup.status), not its
20435
- // individual instances' — so a filtered group's Status column always reads
20436
- // one of the requested values.
20442
+ // Matches a type's DERIVED status (see FindingGroup.status), not its
20443
+ // individual findings' — so a filtered row's status always reads one of the
20444
+ // requested values.
20437
20445
  status: external_exports.array(FindingStatus).optional(),
20438
20446
  q: external_exports.string().optional(),
20439
20447
  // Scope to findings whose event carries this session id (the Activity page's
@@ -20443,23 +20451,37 @@ var ListGroupedFindingsQuery = external_exports.object({
20443
20451
  // from a time-scoped page (Activity's range) can carry that scope. Absent
20444
20452
  // means all time — this list has no default window.
20445
20453
  from: external_exports.iso.datetime().optional(),
20446
- // A group or instance id that must appear in the page even when the cursor
20447
- // has already advanced past its sort position. This is what keeps the
20448
- // Findings page's one-shot ?finding= deep link resolving once the list
20449
- // paginates: the target group is appended out of sort order rather than
20450
- // scanning forward for it. Never affects totals, facets or the cursor.
20454
+ // A RULE id that must appear in the page even when the cursor has already
20455
+ // advanced past its sort position. This is what keeps the selected type
20456
+ // visible in the list once it paginates: the target is appended out of sort
20457
+ // order rather than scanned forward for. Never affects totals, facets or the
20458
+ // cursor. Unlike the grouped read this replaces, it names a rule only — an
20459
+ // instance id is resolved by `findingInstance`, which is a primary-key seek
20460
+ // and so is not bounded by what any page happens to hold.
20451
20461
  includeId: external_exports.string().optional(),
20452
- groupBy: external_exports.literal("type").optional(),
20453
- limit: external_exports.coerce.number().int().min(1).max(100).optional(),
20462
+ limit: external_exports.coerce.number().int().min(1).max(MAX_FINDING_TYPES_LIMIT).optional(),
20454
20463
  cursor: external_exports.string().optional()
20455
20464
  });
20456
- var ListGroupedFindingsResponse = external_exports.object({
20465
+ var ListFindingTypesResponse = external_exports.object({
20457
20466
  totals: external_exports.object({
20467
+ // Findings belonging to the matching TYPES — not findings that each match
20468
+ // the filters. The filters here select types, so a type that survives
20469
+ // contributes its whole instanceCount.
20470
+ //
20471
+ // `status` is the one exception, narrowed per finding via
20472
+ // countInstancesByStatus. `severity`, `provider` and `action` are not, so
20473
+ // this can exceed what the instance read reports for the same filters: a
20474
+ // rule whose severity moved between versions is kept on its newest and
20475
+ // still counts its older findings. Narrowing the other three needs
20476
+ // per-dimension counts the aggregate does not carry today.
20458
20477
  findings: external_exports.number().int().nonnegative(),
20459
- groups: external_exports.number().int().nonnegative()
20478
+ // Counts TYPES, which is the unit this read pages. The instance read's
20479
+ // own totals count findings; the two deliberately answer different
20480
+ // questions and are never summed.
20481
+ types: external_exports.number().int().nonnegative()
20460
20482
  }),
20461
20483
  facets: FindingFacets,
20462
- items: external_exports.array(FindingGroup),
20484
+ items: external_exports.array(FindingTypeSummary),
20463
20485
  nextCursor: external_exports.string().nullable(),
20464
20486
  // Present only on session-scoped queries (`sessionId` set): per ruleId, how
20465
20487
  // many times that rule fired in the session's persisted transcript. Findings
@@ -20467,7 +20489,7 @@ var ListGroupedFindingsResponse = external_exports.object({
20467
20489
  // every firing, so the two numbers legitimately differ — this map lets a
20468
20490
  // session-scoped view show both.
20469
20491
  sessionFirings: external_exports.record(external_exports.string(), external_exports.number().int().nonnegative()).optional()
20470
- }).meta({ id: "ListGroupedFindingsResponse" });
20492
+ }).meta({ id: "ListFindingTypesResponse" });
20471
20493
  var ApplyFindingActionRequest = external_exports.object({
20472
20494
  // 'quarantined' is system-assigned (see FindingAction) — clients may not set
20473
20495
  // it, so it is excluded from the request contract. The mapping helper
@@ -20496,12 +20518,13 @@ var FindingInstanceDetail = FindingInstance.extend({
20496
20518
  var MAX_FLAT_FINDINGS_LIMIT = 200;
20497
20519
  var ListFindingInstancesQuery = external_exports.object({
20498
20520
  severity: external_exports.array(Severity).optional(),
20499
- // Rule ids, the same vocabulary the grouped list's `subtype` carries.
20521
+ // Rule ids, the same vocabulary the types list's `subtype` carries. Pinning
20522
+ // ONE of them is how the master/detail view scopes its right-hand panel.
20500
20523
  subtype: external_exports.array(external_exports.string()).optional(),
20501
20524
  provider: external_exports.array(FindingProvider).optional(),
20502
20525
  action: external_exports.array(FindingAction).optional(),
20503
20526
  // Matches each instance's OWN derived status (deriveFindingStatus), unlike
20504
- // the grouped query's group-level fold.
20527
+ // the types query's type-level fold.
20505
20528
  status: external_exports.array(FindingStatus).optional(),
20506
20529
  // Exact host-tool names (attributes.tool_name, e.g. 'Bash'). A real filter,
20507
20530
  // where the free-text `q` can only match the rendered "via Bash" label.
@@ -20518,37 +20541,46 @@ var ListFindingInstancesQuery = external_exports.object({
20518
20541
  });
20519
20542
  var ListFindingInstancesResponse = external_exports.object({
20520
20543
  // Instances matching the filters across the whole scope, not just this
20521
- // page — cursor-independent, like the grouped list's totals.
20544
+ // page — cursor-independent, like the types list's totals.
20522
20545
  totals: external_exports.object({ findings: external_exports.number().int().nonnegative() }),
20523
- // Counts in INSTANCES here, where the grouped response counts groups. Each
20546
+ // Counts in INSTANCES here, where the types response counts types. Each
20524
20547
  // dimension still excludes its own filter.
20525
20548
  facets: FindingFacets,
20526
20549
  items: external_exports.array(FindingInstanceDetail),
20527
20550
  nextCursor: external_exports.string().nullable()
20528
20551
  }).meta({ id: "ListFindingInstancesResponse" });
20529
- var FindingLocationFile = external_exports.object({
20530
- // Empty when the instances carried no file path (a prompt or a tool call
20531
- // with no file attribution).
20532
- file: external_exports.string(),
20533
- instanceCount: external_exports.number().int().nonnegative(),
20534
- maxSeverity: Severity,
20535
- latestDetectedAt: external_exports.iso.datetime(),
20536
- // Folded from the instances' derived statuses with the same
20537
- // open-dominates precedence a group uses.
20538
- status: FindingStatus.optional(),
20539
- // Distinct rules seen at this location, capped — the row shows them as
20540
- // chips, and the count is what conveys scale.
20541
- ruleIds: external_exports.array(external_exports.string())
20542
- }).meta({ id: "FindingLocationFile" });
20543
- var FindingLocationRepo = external_exports.object({
20552
+ var FindingLocationSummary = external_exports.object({
20553
+ // Opaque, stable, minted from the pair by encodeLocationId. It exists
20554
+ // because a location's identity is two values and a URL param carries one:
20555
+ // `?loc=` names a location the way `?rule=` names a type. Only ever compared
20556
+ // for EQUALITY — the page's selection check, this read's `includeId`, the
20557
+ // client's page dedupe — never decoded, and never a sort key.
20558
+ id: external_exports.string(),
20544
20559
  /** Empty when the instances carried no repo attribute. */
20545
20560
  repo: external_exports.string(),
20561
+ // Empty when the instances carried no file path (a prompt, or a tool call
20562
+ // with no file attribution). Both halves empty is a real location — usually
20563
+ // the largest one in a store — and is selectable like any other.
20564
+ file: external_exports.string(),
20546
20565
  instanceCount: external_exports.number().int().nonnegative(),
20566
+ // The WORST severity present, not the first row's. It is this list's primary
20567
+ // sort key, so it is also what explains why a row is where it is, and it is
20568
+ // how a reader decides what to open without opening everything.
20547
20569
  maxSeverity: Severity,
20548
20570
  latestDetectedAt: external_exports.iso.datetime(),
20571
+ // Folded from the instances' derived statuses with the same open-dominates
20572
+ // precedence a group uses, so it answers "is anything left to do here" and
20573
+ // not much more: a location holding 1 open among 40 resolved reads like one
20574
+ // holding 40 open. That loss is accepted — the panel beside this list
20575
+ // carries each finding's own status, and instanceCount sits next to the
20576
+ // badge.
20549
20577
  status: FindingStatus.optional(),
20550
- files: external_exports.array(FindingLocationFile)
20551
- }).meta({ id: "FindingLocationRepo" });
20578
+ // Every distinct rule seen at this location, UNCAPPED — so the length is a
20579
+ // tally rather than a sample and a row can say how many there are. Bounded
20580
+ // by the ruleset, not by the store. The view bounds what it DISPLAYS.
20581
+ ruleIds: external_exports.array(external_exports.string())
20582
+ }).meta({ id: "FindingLocationSummary" });
20583
+ var MAX_FINDING_LOCATIONS_LIMIT = 100;
20552
20584
  var ListFindingLocationsQuery = external_exports.object({
20553
20585
  severity: external_exports.array(Severity).optional(),
20554
20586
  subtype: external_exports.array(external_exports.string()).optional(),
@@ -20561,18 +20593,42 @@ var ListFindingLocationsQuery = external_exports.object({
20561
20593
  q: external_exports.string().optional(),
20562
20594
  sessionId: external_exports.string().optional(),
20563
20595
  from: external_exports.iso.datetime().optional(),
20564
- limit: external_exports.coerce.number().int().min(1).max(500).optional()
20596
+ // A LOCATION id (see FindingLocationSummary.id) that must appear in the page
20597
+ // even when the cursor has already advanced past its sort position — the
20598
+ // counterpart of ListFindingTypesQuery.includeId, and needed far more often
20599
+ // here. Selecting a row pushes the URL, which re-renders the server and resets
20600
+ // the client's page cache to page 0; with distinct (repo, file) pairs running
20601
+ // into the thousands, a selection sitting off page 0 is the ordinary case
20602
+ // rather than a deep-link corner. Never affects totals, facets or the cursor.
20603
+ includeId: external_exports.string().optional(),
20604
+ limit: external_exports.coerce.number().int().min(1).max(MAX_FINDING_LOCATIONS_LIMIT).optional(),
20605
+ cursor: external_exports.string().optional()
20565
20606
  });
20566
20607
  var ListFindingLocationsResponse = external_exports.object({
20567
20608
  totals: external_exports.object({
20609
+ // Findings matching the filters across the whole scope. Unlike the types
20610
+ // read's same-named field this needs no caveat: the filters here narrow
20611
+ // per finding, so this is the sum of every row's instanceCount.
20568
20612
  findings: external_exports.number().int().nonnegative(),
20569
- repos: external_exports.number().int().nonnegative(),
20570
- files: external_exports.number().int().nonnegative()
20613
+ // Counts LOCATIONS, the unit this read pages — the number the paginator
20614
+ // states. The facets beside it count FINDINGS (see below); a surface
20615
+ // showing both says which is which.
20616
+ locations: external_exports.number().int().nonnegative()
20571
20617
  }),
20572
- /** Sorted by max severity, then most recent. */
20573
- items: external_exports.array(FindingLocationRepo),
20574
- /** Whether `limit` truncated the repo list. */
20575
- hasMore: external_exports.boolean()
20618
+ // Counts in FINDINGS, where the types response counts types, each dimension
20619
+ // still excluding its own filter. Deliberately not locations: counting those
20620
+ // needs a set of location keys per dimension per value — memory tracking the
20621
+ // store times the vocabulary, in a read whose scan promises flat memory —
20622
+ // and the cheap per-location version is not an approximation but WRONG. A
20623
+ // location holding {claudecode, block} and {codex, warn} would survive
20624
+ // provider=claudecode AND action=warn, under which no single finding
20625
+ // matches, so the facet would contradict the instanceCount this whole view
20626
+ // rests on. Findings also keep the toolbar in the same unit as the page
20627
+ // tally and the panel it sits above.
20628
+ facets: FindingFacets,
20629
+ /** Sorted by max severity, then most recent, then (repo, file). */
20630
+ items: external_exports.array(FindingLocationSummary),
20631
+ nextCursor: external_exports.string().nullable()
20576
20632
  }).meta({ id: "ListFindingLocationsResponse" });
20577
20633
 
20578
20634
  // ../../packages/schema/src/zod/meta.ts
@@ -21737,6 +21793,14 @@ var ControlPlaneErrorBody = external_exports.object({
21737
21793
  message: external_exports.string().optional()
21738
21794
  }).optional()
21739
21795
  });
21796
+ var RemoteFailureKind = external_exports.enum([
21797
+ "unauthorized",
21798
+ "forbidden",
21799
+ "route-absent",
21800
+ "invalid-request",
21801
+ "rejected",
21802
+ "unreachable"
21803
+ ]);
21740
21804
  var AttachDeviceRequest = external_exports.object({
21741
21805
  // This machine's own continuity id, so re-attaching ROTATES the credential
21742
21806
  // on one machine record instead of producing a second one. Client-minted
@@ -22749,11 +22813,11 @@ var WorkspaceSettings = external_exports.object({
22749
22813
  // covers the current payload and must be re-granted.
22750
22814
  modelJudgeConsent: ModelJudgeConsent.optional(),
22751
22815
  // Records that the user consented to the DEFERRED send — the outbox — along
22752
- // with the payload shape and the endpoint they agreed to. Since payload v2
22753
- // that covers both the pre-attach backlog and undelivered captures (which
22754
- // carry prompt/reply text in `content`); the key name predates the widening.
22755
- // Absent until granted, and a grant for a different endpoint or an older
22756
- // payload no longer counts.
22816
+ // with the payload shape and the endpoint they agreed to. Since payload v3
22817
+ // that covers the pre-attach backlog AND undelivered captures alike, and both
22818
+ // carry prompt/reply/tool-output text in `content`; the key name predates
22819
+ // both widenings. Absent until granted, and a grant for a different endpoint
22820
+ // or an older payload no longer counts.
22757
22821
  historySyncConsent: HistorySyncConsent.optional()
22758
22822
  });
22759
22823
  function defaultWorkspaceSettings() {
@@ -22773,6 +22837,9 @@ var ManagedSettingKey = external_exports.enum([
22773
22837
  "dataSharesInPlace",
22774
22838
  "redactFallback"
22775
22839
  ]).meta({ id: "ManagedSettingKey" });
22840
+ function isManagedSettingKey(value) {
22841
+ return ManagedSettingKey.safeParse(value).success;
22842
+ }
22776
22843
  var ManagedSettingsValues = external_exports.object({
22777
22844
  runMode: external_exports.enum(["standalone", "attached"]).optional(),
22778
22845
  controlPlane: external_exports.object({
@@ -22797,7 +22864,27 @@ var ManagedSettings = external_exports.object({
22797
22864
  // Which of those the user may not change. A key here with no matching value
22798
22865
  // freezes whatever the user last chose; a value with no lock is a DEFAULT
22799
22866
  // the user may still override. The two are separable on purpose.
22800
- lockedFields: external_exports.array(ManagedSettingKey).default([])
22867
+ //
22868
+ // Parsed as NAMES rather than as the enum, and split below: a name this
22869
+ // build does not know is dropped from the locked set and reported, never a
22870
+ // reason to refuse the file. The same shape reaches an older build whenever
22871
+ // an administrator locks a key a newer build added, and refusing it there
22872
+ // ran that build entirely unmanaged — every pin and lock gone — on exactly
22873
+ // the fleets most likely to carry a version skew. A name outside the enum
22874
+ // is still never HONOURED: the lockable set stays explicit above.
22875
+ lockedFields: external_exports.array(external_exports.string()).default([])
22876
+ }).transform(({ lockedFields, ...rest }) => {
22877
+ const known = [];
22878
+ const unknown2 = [];
22879
+ for (const name of lockedFields) {
22880
+ if (isManagedSettingKey(name)) known.push(name);
22881
+ else unknown2.push(name);
22882
+ }
22883
+ return {
22884
+ ...rest,
22885
+ lockedFields: known,
22886
+ ...unknown2.length > 0 ? { unknownLockedFields: unknown2 } : {}
22887
+ };
22801
22888
  }).meta({ id: "ManagedSettings" });
22802
22889
 
22803
22890
  // ../../packages/schema/src/zod/project-files.ts
@@ -22915,7 +23002,11 @@ var FindingsTimeseriesPoint = external_exports.object({
22915
23002
  timestamp: external_exports.iso.date(),
22916
23003
  critical: external_exports.number().int().nonnegative(),
22917
23004
  high: external_exports.number().int().nonnegative(),
22918
- medium: external_exports.number().int().nonnegative()
23005
+ medium: external_exports.number().int().nonnegative(),
23006
+ // Optional and additive, so a producer written against the earlier
23007
+ // three-series contract keeps validating. A consumer plotting it resolves the
23008
+ // absent case itself — the chart point requires a number.
23009
+ low: external_exports.number().int().nonnegative().optional()
22919
23010
  }).meta({ id: "FindingsTimeseriesPoint" });
22920
23011
  var FindingsTimeseriesResponse = external_exports.object({
22921
23012
  range: TimeRange,
@@ -22941,6 +23032,10 @@ var ResolvedFeedItem = external_exports.object({
22941
23032
  findingKey: external_exports.string(),
22942
23033
  ruleId: external_exports.string(),
22943
23034
  severity: Severity,
23035
+ // Repository slug, and the file path RELATIVE to it. The pair is what
23036
+ // identifies the file: a bare path matches the same name in every repo.
23037
+ // Optional and additive; empty when the event carried no repo.
23038
+ repo: external_exports.string().optional(),
22944
23039
  path: external_exports.string(),
22945
23040
  // ISO-8601 datetime (matches FindingInstance.detectedAt / the rest of the
22946
23041
  // findings domain). The reader `.toISOString()`s the DB epoch-ms values.
@@ -23269,6 +23364,32 @@ var ACTIVE_REVEAL_GRANT_PREDICATE = `capability = 'reveal_to_model'
23269
23364
  AND conditions IS NULL
23270
23365
  AND ${ACTIVE_PREDICATE}`;
23271
23366
 
23367
+ // ../../packages/persistence/src/repositories/resolution-sql.ts
23368
+ function latestResolutionColumnSql(column, findingsAlias) {
23369
+ return `(
23370
+ SELECT fr.${column} FROM finding_resolution fr
23371
+ WHERE fr.finding_key = ${findingsAlias}.finding_key
23372
+ ORDER BY fr.created_at DESC, fr.rowid DESC
23373
+ LIMIT 1
23374
+ )`;
23375
+ }
23376
+ function latestResolutionStatusSql(findingsAlias) {
23377
+ return latestResolutionColumnSql("status", findingsAlias);
23378
+ }
23379
+
23380
+ // ../../packages/persistence/src/repositories/findings.ts
23381
+ var FINDING_ROW_COLUMNS_SQL = `f.id AS id, d.rule_id AS rule_id, d.category AS category,
23382
+ d.severity AS severity, f.masked_match AS masked_match,
23383
+ f.action_taken AS action_taken, f.confidence AS confidence,
23384
+ e.started_at AS occurred_at,
23385
+ e.source_tool AS source_tool,
23386
+ e.repo AS repo,
23387
+ e.file_path AS file,
23388
+ e.tool_name AS tool_name,
23389
+ f.audit_event_id AS event_id, e.root_session_id AS session_id,
23390
+ e.event_type AS kind, f.finding_key AS finding_key,
23391
+ ${latestResolutionStatusSql("f")} AS latest_status`;
23392
+
23272
23393
  // ../../packages/persistence/src/repositories/history-sync.ts
23273
23394
  var STRUCTURAL_EVENT_TYPES = ["session", "llm_call", "tool_call"];
23274
23395
  var TYPE_LIST = STRUCTURAL_EVENT_TYPES.map((t) => `'${t}'`).join(", ");
@@ -23354,7 +23475,8 @@ function managedSettingsPaths(platform2 = process.platform) {
23354
23475
  }
23355
23476
  return [posix.join("/etc", "aka", MANAGED_SETTINGS_FILENAME)];
23356
23477
  }
23357
- function readManagedSettings(paths = managedSettingsPaths()) {
23478
+ var testOnlyManagedPaths = null;
23479
+ function readManagedSettings(paths = testOnlyManagedPaths ?? managedSettingsPaths()) {
23358
23480
  for (const path of paths) {
23359
23481
  let text;
23360
23482
  try {
@@ -23477,23 +23599,30 @@ import { randomUUID as randomUUID10 } from "crypto";
23477
23599
  // ../../packages/persistence/src/database.ts
23478
23600
  var CAPTURE_GRAIN = new Set(EventKind.options);
23479
23601
 
23480
- // ../../packages/persistence/src/finding-key.ts
23602
+ // ../../packages/persistence/src/egress-wire.ts
23481
23603
  import { createHash as createHash3 } from "crypto";
23482
23604
 
23605
+ // ../../packages/persistence/src/finding-key.ts
23606
+ import { createHash as createHash4 } from "crypto";
23607
+
23483
23608
  // ../../packages/persistence/src/fingerprint.ts
23484
23609
  import { createHmac, randomBytes } from "crypto";
23485
23610
  import { existsSync as existsSync3, readFileSync as readFileSync6 } from "fs";
23486
23611
  import { join as join8 } from "path";
23487
23612
  import { DatabaseSync as DatabaseSync2 } from "node:sqlite";
23488
23613
 
23489
- // ../../packages/persistence/src/history-preview.ts
23614
+ // ../../packages/persistence/src/history-backfill.ts
23490
23615
  import { existsSync as existsSync4 } from "fs";
23491
23616
  import { join as join9 } from "path";
23617
+
23618
+ // ../../packages/persistence/src/history-preview.ts
23619
+ import { existsSync as existsSync5 } from "fs";
23620
+ import { join as join10 } from "path";
23492
23621
  import { DatabaseSync as DatabaseSync3 } from "node:sqlite";
23493
23622
 
23494
23623
  // ../../packages/persistence/src/store-symlinks.ts
23495
- import { existsSync as existsSync5, lstatSync as lstatSync3, readlinkSync, realpathSync, statSync as statSync4 } from "fs";
23496
- import { dirname as dirname3, join as join10, resolve } from "path";
23624
+ import { existsSync as existsSync6, lstatSync as lstatSync3, readlinkSync, realpathSync, statSync as statSync4 } from "fs";
23625
+ import { dirname as dirname3, join as join11, resolve } from "path";
23497
23626
  var STORE_DB = "the store database (including the prompt corpus)";
23498
23627
  var STORE_SETTINGS = "your settings file";
23499
23628
  function storeContents(home) {
@@ -23502,7 +23631,7 @@ function storeContents(home) {
23502
23631
  [settingsDir(home), STORE_SETTINGS],
23503
23632
  [dataDir(home), STORE_DB],
23504
23633
  [keysDir(home), "the vault key"],
23505
- [join10(settingsDir(home), "settings.json"), STORE_SETTINGS],
23634
+ [join11(settingsDir(home), "settings.json"), STORE_SETTINGS],
23506
23635
  [dbPath(home), STORE_DB]
23507
23636
  ]);
23508
23637
  }
@@ -23517,7 +23646,7 @@ function symlinkedStorePaths(home, platform2 = process.platform) {
23517
23646
  holds,
23518
23647
  // existsSync follows the link, so a target that is gone reads as
23519
23648
  // absent here while lstat above still sees the link itself.
23520
- missing: !existsSync5(path),
23649
+ missing: !existsSync6(path),
23521
23650
  mode: targetMode(path, platform2)
23522
23651
  }
23523
23652
  ];
@@ -23555,14 +23684,14 @@ import {
23555
23684
  import { execFileSync } from "child_process";
23556
23685
  import { randomBytes as randomBytes2 } from "crypto";
23557
23686
  import { chmodSync as chmodSync3, readFileSync as readFileSync7, renameSync as renameSync4, rmSync as rmSync6, statSync as statSync5, writeFileSync as writeFileSync3 } from "fs";
23558
- import { join as join11 } from "path";
23687
+ import { join as join12 } from "path";
23559
23688
 
23560
23689
  // ../../packages/persistence/src/vault/vault.ts
23561
23690
  import { randomBytes as randomBytes3, randomUUID as randomUUID12 } from "crypto";
23562
23691
 
23563
23692
  // ../../packages/persistence/src/warn-era-cap.ts
23564
- import { existsSync as existsSync6, writeFileSync as writeFileSync4 } from "fs";
23565
- import { join as join12 } from "path";
23693
+ import { existsSync as existsSync7, writeFileSync as writeFileSync4 } from "fs";
23694
+ import { join as join13 } from "path";
23566
23695
 
23567
23696
  // ../../packages/plugin-sdk/src/provider-env.ts
23568
23697
  var DEFAULT_ANTHROPIC_HOST = "api.anthropic.com";
@@ -23616,8 +23745,8 @@ function resolveProvider() {
23616
23745
  function loadConfig(base = defaultDataDir(), resolveProviderFn = resolveProvider) {
23617
23746
  try {
23618
23747
  ensureLayoutDirSync(base);
23619
- const settingsFile = join13(settingsDir(base), "settings.json");
23620
- if (existsSync7(settingsFile)) tightenFile(settingsFile);
23748
+ const settingsFile = join14(settingsDir(base), "settings.json");
23749
+ if (existsSync8(settingsFile)) tightenFile(settingsFile);
23621
23750
  } catch {
23622
23751
  }
23623
23752
  migrateLegacyLayout(base);
@@ -23642,7 +23771,7 @@ function resolveProviderSafe(resolveProviderFn) {
23642
23771
  // ../../packages/plugin-sdk/src/config-inventory.ts
23643
23772
  import { readdirSync as readdirSync2, readFileSync as readFileSync9, realpathSync as realpathSync2, statSync as statSync7 } from "fs";
23644
23773
  import { homedir as homedir2 } from "os";
23645
- import { basename as basename3, join as join15 } from "path";
23774
+ import { basename as basename3, join as join16 } from "path";
23646
23775
 
23647
23776
  // ../../packages/detections/src/egress/registry.ts
23648
23777
  var EXTRACTOR_VERSION = "1";
@@ -24400,24 +24529,20 @@ var CPU_CORROBORATION_SHARE = 0.2;
24400
24529
  var CORROBORATION_FLOOR_MS = BUDGET_MS * CPU_CORROBORATION_SHARE;
24401
24530
 
24402
24531
  // ../../packages/plugin-sdk/src/repo.ts
24403
- import { existsSync as existsSync8, readFileSync as readFileSync8, statSync as statSync6 } from "fs";
24404
- import { basename as basename2, dirname as dirname4, isAbsolute, join as join14, sep as sep2 } from "path";
24532
+ import { existsSync as existsSync9, readFileSync as readFileSync8, statSync as statSync6 } from "fs";
24533
+ import { basename as basename2, dirname as dirname4, isAbsolute, join as join15, sep as sep2 } from "path";
24405
24534
 
24406
24535
  // ../../packages/plugin-sdk/src/events.ts
24407
- import { createHash as createHash4, randomUUID as randomUUID13 } from "crypto";
24536
+ import { createHash as createHash5, randomUUID as randomUUID13 } from "crypto";
24408
24537
 
24409
24538
  // ../../packages/plugin-sdk/src/isolated-scan.ts
24410
- import { existsSync as existsSync9 } from "fs";
24539
+ import { existsSync as existsSync10 } from "fs";
24411
24540
  import { fileURLToPath } from "url";
24412
24541
  import { Worker } from "worker_threads";
24413
24542
 
24414
- // ../../packages/plugin-sdk/src/ignore-layers.ts
24415
- var import_ignore = __toESM(require_ignore(), 1);
24416
- import { readFileSync as readFileSync10 } from "fs";
24417
- import { join as join16 } from "path";
24418
-
24419
- // ../../packages/plugin-sdk/src/inventory-resolver.ts
24420
- import { arch, hostname as hostname4, platform, release } from "os";
24543
+ // ../../packages/plugin-sdk/src/host-floor.ts
24544
+ import { readFileSync as readFileSync11 } from "fs";
24545
+ import { join as join18 } from "path";
24421
24546
 
24422
24547
  // ../../packages/plugin-sdk/src/model-governance.ts
24423
24548
  import {
@@ -24425,7 +24550,7 @@ import {
24425
24550
  fstatSync,
24426
24551
  mkdirSync as mkdirSync2,
24427
24552
  openSync as openSync2,
24428
- readFileSync as readFileSync11,
24553
+ readFileSync as readFileSync10,
24429
24554
  readSync,
24430
24555
  writeFileSync as writeFileSync5
24431
24556
  } from "fs";
@@ -24445,17 +24570,43 @@ function recordSessionModel(dataDir2, sessionId, model) {
24445
24570
  }
24446
24571
  var TAIL_BYTES = 256 * 1024;
24447
24572
 
24573
+ // ../../packages/plugin-sdk/src/host-floor.ts
24574
+ var HOST_FEATURE = {
24575
+ ModelSwitch: "model-switch",
24576
+ VaultPointerDisplay: "vault-pointer-display"
24577
+ };
24578
+ var HOST_FLOORS = {
24579
+ [HOST_FEATURE.ModelSwitch]: {
24580
+ label: "model-switch protection",
24581
+ hookEvents: ["PreModelSwitch", "PostModelSwitch"],
24582
+ since: "2.1.251"
24583
+ },
24584
+ [HOST_FEATURE.VaultPointerDisplay]: {
24585
+ label: "vault pointer display",
24586
+ hookEvents: ["MessageDisplay"],
24587
+ since: "2.1.152"
24588
+ }
24589
+ };
24590
+
24591
+ // ../../packages/plugin-sdk/src/ignore-layers.ts
24592
+ var import_ignore = __toESM(require_ignore(), 1);
24593
+ import { readFileSync as readFileSync12 } from "fs";
24594
+ import { join as join19 } from "path";
24595
+
24596
+ // ../../packages/plugin-sdk/src/inventory-resolver.ts
24597
+ import { arch, hostname as hostname4, platform, release } from "os";
24598
+
24448
24599
  // ../../packages/plugin-sdk/src/nudge.ts
24449
- import { mkdirSync as mkdirSync3, readFileSync as readFileSync12, writeFileSync as writeFileSync6 } from "fs";
24450
- import { join as join18 } from "path";
24600
+ import { mkdirSync as mkdirSync3, readFileSync as readFileSync13, writeFileSync as writeFileSync6 } from "fs";
24601
+ import { join as join20 } from "path";
24451
24602
 
24452
24603
  // ../../packages/plugin-sdk/src/paths.ts
24453
24604
  import { readdirSync as readdirSync3, realpathSync as realpathSync3 } from "fs";
24454
24605
  import { basename as basename4, dirname as dirname5, sep as sep3 } from "path";
24455
24606
 
24456
24607
  // ../../packages/plugin-sdk/src/project-files.ts
24457
- import { existsSync as existsSync10, readdirSync as readdirSync4 } from "fs";
24458
- import { basename as basename5, join as join19 } from "path";
24608
+ import { existsSync as existsSync11, readdirSync as readdirSync4 } from "fs";
24609
+ import { basename as basename5, join as join21 } from "path";
24459
24610
 
24460
24611
  // ../../packages/plugin-sdk/src/provider-env-antigravity.ts
24461
24612
  var optionalBaseUrl2 = external_exports.preprocess((v) => {
@@ -24491,16 +24642,16 @@ var THIRTY_DAYS_MS = 30 * 24 * 60 * 60 * 1e3;
24491
24642
 
24492
24643
  // ../../packages/plugin-sdk/src/throttle.ts
24493
24644
  import { mkdirSync as mkdirSync4, statSync as statSync8, writeFileSync as writeFileSync7 } from "fs";
24494
- import { join as join20 } from "path";
24645
+ import { join as join22 } from "path";
24495
24646
 
24496
24647
  // src/hooks/model-switch-run.ts
24497
24648
  import { randomUUID as randomUUID16 } from "crypto";
24498
24649
 
24499
24650
  // src/hooks/model-guard.ts
24500
24651
  import { randomUUID as randomUUID15 } from "crypto";
24501
- import { readFileSync as readFileSync13, statSync as statSync9 } from "fs";
24652
+ import { readFileSync as readFileSync14, statSync as statSync9 } from "fs";
24502
24653
  import { homedir as homedir3 } from "os";
24503
- import { dirname as dirname6, join as join21 } from "path";
24654
+ import { dirname as dirname6, join as join23 } from "path";
24504
24655
 
24505
24656
  // src/hooks/model-switch-run.ts
24506
24657
  function runPostModelSwitch(sessionId, toModel, deps) {
@@ -24545,11 +24696,8 @@ function getString(record2, key) {
24545
24696
  }
24546
24697
 
24547
24698
  // src/hooks/store-health.ts
24548
- import { mkdirSync as mkdirSync5, readFileSync as readFileSync19, writeFileSync as writeFileSync8 } from "fs";
24549
- import { dirname as dirname7, join as join28 } from "path";
24550
-
24551
- // ../../packages/plugin-runtime/src/attached/egress-wire.ts
24552
- import { createHash as createHash5 } from "crypto";
24699
+ import { mkdirSync as mkdirSync5, readFileSync as readFileSync20, writeFileSync as writeFileSync8 } from "fs";
24700
+ import { dirname as dirname7, join as join30 } from "path";
24553
24701
 
24554
24702
  // ../../packages/remote/src/http.ts
24555
24703
  import { request as httpRequest } from "http";
@@ -24560,18 +24708,18 @@ var MAX_RESPONSE_BYTES = 8 * 1024 * 1024;
24560
24708
  var SLASH = "/".charCodeAt(0);
24561
24709
 
24562
24710
  // ../../packages/plugin-runtime/src/attached/forward-drops.ts
24563
- import { readFileSync as readFileSync14 } from "fs";
24564
- import { join as join22 } from "path";
24711
+ import { readFileSync as readFileSync15 } from "fs";
24712
+ import { join as join24 } from "path";
24565
24713
 
24566
24714
  // ../../packages/plugin-runtime/src/attached/forward-policy.ts
24567
24715
  import { randomUUID as randomUUID17 } from "crypto";
24568
- import { readFileSync as readFileSync15 } from "fs";
24716
+ import { readFileSync as readFileSync16 } from "fs";
24569
24717
  import { readFile, rename, writeFile } from "fs/promises";
24570
- import { join as join23 } from "path";
24718
+ import { join as join25 } from "path";
24571
24719
 
24572
24720
  // ../../packages/plugin-runtime/src/attached/history-state.ts
24573
- import { readFileSync as readFileSync16 } from "fs";
24574
- import { join as join24 } from "path";
24721
+ import { readFileSync as readFileSync17 } from "fs";
24722
+ import { join as join26 } from "path";
24575
24723
 
24576
24724
  // ../../packages/plugin-runtime/src/attached/history-sync.ts
24577
24725
  import { createHash as createHash6 } from "crypto";
@@ -24588,12 +24736,12 @@ import { fileURLToPath as fileURLToPath2 } from "url";
24588
24736
  var HISTORY_SYNC_THROTTLE_MS = 5 * 60 * 1e3;
24589
24737
 
24590
24738
  // ../../packages/plugin-runtime/src/attached/plugin-block.ts
24591
- import { readFileSync as readFileSync17 } from "fs";
24739
+ import { readFileSync as readFileSync18 } from "fs";
24592
24740
 
24593
24741
  // ../../packages/plugin-runtime/src/attached/policy-store.ts
24594
24742
  import { randomUUID as randomUUID18 } from "crypto";
24595
24743
  import { readFile as readFile2, rm, writeFile as writeFile2 } from "fs/promises";
24596
- import { join as join25 } from "path";
24744
+ import { join as join27 } from "path";
24597
24745
 
24598
24746
  // ../../packages/plugin-runtime/src/attached/atomic-publish.ts
24599
24747
  import { rename as rename2 } from "fs/promises";
@@ -24608,11 +24756,11 @@ import { DatabaseSync as DatabaseSync4 } from "node:sqlite";
24608
24756
  // ../../packages/plugin-runtime/src/attached/posture-store.ts
24609
24757
  import { randomUUID as randomUUID19 } from "crypto";
24610
24758
  import { readFile as readFile3, rm as rm2, writeFile as writeFile3 } from "fs/promises";
24611
- import { join as join26 } from "path";
24759
+ import { join as join28 } from "path";
24612
24760
 
24613
24761
  // ../../packages/plugin-runtime/src/attached/sync-state.ts
24614
- import { readFileSync as readFileSync18 } from "fs";
24615
- import { join as join27 } from "path";
24762
+ import { readFileSync as readFileSync19 } from "fs";
24763
+ import { join as join29 } from "path";
24616
24764
 
24617
24765
  // ../../packages/plugin-runtime/src/attached/status.ts
24618
24766
  var REFUSAL_LINES = {
@@ -24651,7 +24799,7 @@ function markerDirs(dataDir2) {
24651
24799
  function alreadyClaimed(dirs, marker, sessionId) {
24652
24800
  return dirs.some((dir) => {
24653
24801
  try {
24654
- return readFileSync19(join28(dir, marker), "utf8") === sessionId;
24802
+ return readFileSync20(join30(dir, marker), "utf8") === sessionId;
24655
24803
  } catch {
24656
24804
  return false;
24657
24805
  }
@@ -24661,7 +24809,7 @@ function recordClaim(dirs, marker, sessionId) {
24661
24809
  for (const dir of dirs) {
24662
24810
  try {
24663
24811
  mkdirSync5(dir, { recursive: true, mode: DATA_DIR_MODE });
24664
- writeFileSync8(join28(dir, marker), sessionId, { mode: DATA_FILE_MODE });
24812
+ writeFileSync8(join30(dir, marker), sessionId, { mode: DATA_FILE_MODE });
24665
24813
  return;
24666
24814
  } catch {
24667
24815
  }