@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.
@@ -20703,13 +20703,11 @@ var FindingGroup = external_exports.object({
20703
20703
  latestDetectedAt: external_exports.iso.datetime(),
20704
20704
  instances: external_exports.array(FindingInstance),
20705
20705
  // Derived from instances' statuses with open-dominates precedence (see
20706
- // buildFindingGroups). Undefined only when no instance carries a status.
20706
+ // foldGroupStatus). Undefined only when no instance carries a status.
20707
20707
  status: FindingStatus.optional(),
20708
- // The distinct people across the WHOLE group, not just the `instances`
20709
- // preview — from the store's whole-group aggregate when it supplies one,
20710
- // else folded from the rows (see buildFindingGroups). Undefined when no
20711
- // instance carries a user, or when the store supplied whole-group folds
20712
- // without one.
20708
+ // The distinct people across the WHOLE group, not just the instances
20709
+ // carried here. Undefined when no instance carries a user, or when the
20710
+ // store supplied whole-group folds without one.
20713
20711
  users: external_exports.array(FindingUser).optional()
20714
20712
  }).meta({ id: "FindingGroup" });
20715
20713
  var FindingStats = external_exports.object({
@@ -20738,20 +20736,30 @@ var FindingFacets = external_exports.object({
20738
20736
  // counted under no value.
20739
20737
  status: external_exports.array(FindingFacetItem),
20740
20738
  // Host tool (attributes.tool_name). Present only on the instance-level
20741
- // reads, which can filter by it; the grouped read omits the dimension
20739
+ // reads, which can filter by it; the type-level read omits the dimension
20742
20740
  // because a group spans tools.
20743
20741
  tool: external_exports.array(FindingFacetItem).optional()
20744
20742
  }).meta({ id: "FindingFacets" });
20745
- var ListGroupedFindingsQuery = external_exports.object({
20743
+ var FindingTypeSummary = FindingGroup.omit({ instances: true, match: true }).meta({
20744
+ id: "FindingTypeSummary"
20745
+ });
20746
+ var MAX_FINDING_TYPES_LIMIT = 100;
20747
+ var ListFindingTypesQuery = external_exports.object({
20746
20748
  // NOTE: severity filters by Severity (critical/high/medium/low), not by
20747
- // FindingAction.
20749
+ // FindingAction. It narrows TYPES: a type's severity is the one its newest
20750
+ // firing version carries, and this list pages types.
20751
+ //
20752
+ // That is NOT a claim the findings of a type share it. A rule can hold several
20753
+ // definition versions at different severities, so a type kept by this filter
20754
+ // can hold findings that individually do not match — see totals.findings on
20755
+ // ListFindingTypesResponse, which counts them all.
20748
20756
  severity: external_exports.array(Severity).optional(),
20749
20757
  subtype: external_exports.array(external_exports.string()).optional(),
20750
20758
  provider: external_exports.array(FindingProvider).optional(),
20751
20759
  action: external_exports.array(FindingAction).optional(),
20752
- // Matches a group's DERIVED status (see FindingGroup.status), not its
20753
- // individual instances' — so a filtered group's Status column always reads
20754
- // one of the requested values.
20760
+ // Matches a type's DERIVED status (see FindingGroup.status), not its
20761
+ // individual findings' — so a filtered row's status always reads one of the
20762
+ // requested values.
20755
20763
  status: external_exports.array(FindingStatus).optional(),
20756
20764
  q: external_exports.string().optional(),
20757
20765
  // Scope to findings whose event carries this session id (the Activity page's
@@ -20761,23 +20769,37 @@ var ListGroupedFindingsQuery = external_exports.object({
20761
20769
  // from a time-scoped page (Activity's range) can carry that scope. Absent
20762
20770
  // means all time — this list has no default window.
20763
20771
  from: external_exports.iso.datetime().optional(),
20764
- // A group or instance id that must appear in the page even when the cursor
20765
- // has already advanced past its sort position. This is what keeps the
20766
- // Findings page's one-shot ?finding= deep link resolving once the list
20767
- // paginates: the target group is appended out of sort order rather than
20768
- // scanning forward for it. Never affects totals, facets or the cursor.
20772
+ // A RULE id that must appear in the page even when the cursor has already
20773
+ // advanced past its sort position. This is what keeps the selected type
20774
+ // visible in the list once it paginates: the target is appended out of sort
20775
+ // order rather than scanned forward for. Never affects totals, facets or the
20776
+ // cursor. Unlike the grouped read this replaces, it names a rule only — an
20777
+ // instance id is resolved by `findingInstance`, which is a primary-key seek
20778
+ // and so is not bounded by what any page happens to hold.
20769
20779
  includeId: external_exports.string().optional(),
20770
- groupBy: external_exports.literal("type").optional(),
20771
- limit: external_exports.coerce.number().int().min(1).max(100).optional(),
20780
+ limit: external_exports.coerce.number().int().min(1).max(MAX_FINDING_TYPES_LIMIT).optional(),
20772
20781
  cursor: external_exports.string().optional()
20773
20782
  });
20774
- var ListGroupedFindingsResponse = external_exports.object({
20783
+ var ListFindingTypesResponse = external_exports.object({
20775
20784
  totals: external_exports.object({
20785
+ // Findings belonging to the matching TYPES — not findings that each match
20786
+ // the filters. The filters here select types, so a type that survives
20787
+ // contributes its whole instanceCount.
20788
+ //
20789
+ // `status` is the one exception, narrowed per finding via
20790
+ // countInstancesByStatus. `severity`, `provider` and `action` are not, so
20791
+ // this can exceed what the instance read reports for the same filters: a
20792
+ // rule whose severity moved between versions is kept on its newest and
20793
+ // still counts its older findings. Narrowing the other three needs
20794
+ // per-dimension counts the aggregate does not carry today.
20776
20795
  findings: external_exports.number().int().nonnegative(),
20777
- groups: external_exports.number().int().nonnegative()
20796
+ // Counts TYPES, which is the unit this read pages. The instance read's
20797
+ // own totals count findings; the two deliberately answer different
20798
+ // questions and are never summed.
20799
+ types: external_exports.number().int().nonnegative()
20778
20800
  }),
20779
20801
  facets: FindingFacets,
20780
- items: external_exports.array(FindingGroup),
20802
+ items: external_exports.array(FindingTypeSummary),
20781
20803
  nextCursor: external_exports.string().nullable(),
20782
20804
  // Present only on session-scoped queries (`sessionId` set): per ruleId, how
20783
20805
  // many times that rule fired in the session's persisted transcript. Findings
@@ -20785,7 +20807,7 @@ var ListGroupedFindingsResponse = external_exports.object({
20785
20807
  // every firing, so the two numbers legitimately differ — this map lets a
20786
20808
  // session-scoped view show both.
20787
20809
  sessionFirings: external_exports.record(external_exports.string(), external_exports.number().int().nonnegative()).optional()
20788
- }).meta({ id: "ListGroupedFindingsResponse" });
20810
+ }).meta({ id: "ListFindingTypesResponse" });
20789
20811
  var ApplyFindingActionRequest = external_exports.object({
20790
20812
  // 'quarantined' is system-assigned (see FindingAction) — clients may not set
20791
20813
  // it, so it is excluded from the request contract. The mapping helper
@@ -20814,12 +20836,13 @@ var FindingInstanceDetail = FindingInstance.extend({
20814
20836
  var MAX_FLAT_FINDINGS_LIMIT = 200;
20815
20837
  var ListFindingInstancesQuery = external_exports.object({
20816
20838
  severity: external_exports.array(Severity).optional(),
20817
- // Rule ids, the same vocabulary the grouped list's `subtype` carries.
20839
+ // Rule ids, the same vocabulary the types list's `subtype` carries. Pinning
20840
+ // ONE of them is how the master/detail view scopes its right-hand panel.
20818
20841
  subtype: external_exports.array(external_exports.string()).optional(),
20819
20842
  provider: external_exports.array(FindingProvider).optional(),
20820
20843
  action: external_exports.array(FindingAction).optional(),
20821
20844
  // Matches each instance's OWN derived status (deriveFindingStatus), unlike
20822
- // the grouped query's group-level fold.
20845
+ // the types query's type-level fold.
20823
20846
  status: external_exports.array(FindingStatus).optional(),
20824
20847
  // Exact host-tool names (attributes.tool_name, e.g. 'Bash'). A real filter,
20825
20848
  // where the free-text `q` can only match the rendered "via Bash" label.
@@ -20836,37 +20859,46 @@ var ListFindingInstancesQuery = external_exports.object({
20836
20859
  });
20837
20860
  var ListFindingInstancesResponse = external_exports.object({
20838
20861
  // Instances matching the filters across the whole scope, not just this
20839
- // page — cursor-independent, like the grouped list's totals.
20862
+ // page — cursor-independent, like the types list's totals.
20840
20863
  totals: external_exports.object({ findings: external_exports.number().int().nonnegative() }),
20841
- // Counts in INSTANCES here, where the grouped response counts groups. Each
20864
+ // Counts in INSTANCES here, where the types response counts types. Each
20842
20865
  // dimension still excludes its own filter.
20843
20866
  facets: FindingFacets,
20844
20867
  items: external_exports.array(FindingInstanceDetail),
20845
20868
  nextCursor: external_exports.string().nullable()
20846
20869
  }).meta({ id: "ListFindingInstancesResponse" });
20847
- var FindingLocationFile = external_exports.object({
20848
- // Empty when the instances carried no file path (a prompt or a tool call
20849
- // with no file attribution).
20850
- file: external_exports.string(),
20851
- instanceCount: external_exports.number().int().nonnegative(),
20852
- maxSeverity: Severity,
20853
- latestDetectedAt: external_exports.iso.datetime(),
20854
- // Folded from the instances' derived statuses with the same
20855
- // open-dominates precedence a group uses.
20856
- status: FindingStatus.optional(),
20857
- // Distinct rules seen at this location, capped — the row shows them as
20858
- // chips, and the count is what conveys scale.
20859
- ruleIds: external_exports.array(external_exports.string())
20860
- }).meta({ id: "FindingLocationFile" });
20861
- var FindingLocationRepo = external_exports.object({
20870
+ var FindingLocationSummary = external_exports.object({
20871
+ // Opaque, stable, minted from the pair by encodeLocationId. It exists
20872
+ // because a location's identity is two values and a URL param carries one:
20873
+ // `?loc=` names a location the way `?rule=` names a type. Only ever compared
20874
+ // for EQUALITY — the page's selection check, this read's `includeId`, the
20875
+ // client's page dedupe — never decoded, and never a sort key.
20876
+ id: external_exports.string(),
20862
20877
  /** Empty when the instances carried no repo attribute. */
20863
20878
  repo: external_exports.string(),
20879
+ // Empty when the instances carried no file path (a prompt, or a tool call
20880
+ // with no file attribution). Both halves empty is a real location — usually
20881
+ // the largest one in a store — and is selectable like any other.
20882
+ file: external_exports.string(),
20864
20883
  instanceCount: external_exports.number().int().nonnegative(),
20884
+ // The WORST severity present, not the first row's. It is this list's primary
20885
+ // sort key, so it is also what explains why a row is where it is, and it is
20886
+ // how a reader decides what to open without opening everything.
20865
20887
  maxSeverity: Severity,
20866
20888
  latestDetectedAt: external_exports.iso.datetime(),
20889
+ // Folded from the instances' derived statuses with the same open-dominates
20890
+ // precedence a group uses, so it answers "is anything left to do here" and
20891
+ // not much more: a location holding 1 open among 40 resolved reads like one
20892
+ // holding 40 open. That loss is accepted — the panel beside this list
20893
+ // carries each finding's own status, and instanceCount sits next to the
20894
+ // badge.
20867
20895
  status: FindingStatus.optional(),
20868
- files: external_exports.array(FindingLocationFile)
20869
- }).meta({ id: "FindingLocationRepo" });
20896
+ // Every distinct rule seen at this location, UNCAPPED — so the length is a
20897
+ // tally rather than a sample and a row can say how many there are. Bounded
20898
+ // by the ruleset, not by the store. The view bounds what it DISPLAYS.
20899
+ ruleIds: external_exports.array(external_exports.string())
20900
+ }).meta({ id: "FindingLocationSummary" });
20901
+ var MAX_FINDING_LOCATIONS_LIMIT = 100;
20870
20902
  var ListFindingLocationsQuery = external_exports.object({
20871
20903
  severity: external_exports.array(Severity).optional(),
20872
20904
  subtype: external_exports.array(external_exports.string()).optional(),
@@ -20879,18 +20911,42 @@ var ListFindingLocationsQuery = external_exports.object({
20879
20911
  q: external_exports.string().optional(),
20880
20912
  sessionId: external_exports.string().optional(),
20881
20913
  from: external_exports.iso.datetime().optional(),
20882
- limit: external_exports.coerce.number().int().min(1).max(500).optional()
20914
+ // A LOCATION id (see FindingLocationSummary.id) that must appear in the page
20915
+ // even when the cursor has already advanced past its sort position — the
20916
+ // counterpart of ListFindingTypesQuery.includeId, and needed far more often
20917
+ // here. Selecting a row pushes the URL, which re-renders the server and resets
20918
+ // the client's page cache to page 0; with distinct (repo, file) pairs running
20919
+ // into the thousands, a selection sitting off page 0 is the ordinary case
20920
+ // rather than a deep-link corner. Never affects totals, facets or the cursor.
20921
+ includeId: external_exports.string().optional(),
20922
+ limit: external_exports.coerce.number().int().min(1).max(MAX_FINDING_LOCATIONS_LIMIT).optional(),
20923
+ cursor: external_exports.string().optional()
20883
20924
  });
20884
20925
  var ListFindingLocationsResponse = external_exports.object({
20885
20926
  totals: external_exports.object({
20927
+ // Findings matching the filters across the whole scope. Unlike the types
20928
+ // read's same-named field this needs no caveat: the filters here narrow
20929
+ // per finding, so this is the sum of every row's instanceCount.
20886
20930
  findings: external_exports.number().int().nonnegative(),
20887
- repos: external_exports.number().int().nonnegative(),
20888
- files: external_exports.number().int().nonnegative()
20931
+ // Counts LOCATIONS, the unit this read pages — the number the paginator
20932
+ // states. The facets beside it count FINDINGS (see below); a surface
20933
+ // showing both says which is which.
20934
+ locations: external_exports.number().int().nonnegative()
20889
20935
  }),
20890
- /** Sorted by max severity, then most recent. */
20891
- items: external_exports.array(FindingLocationRepo),
20892
- /** Whether `limit` truncated the repo list. */
20893
- hasMore: external_exports.boolean()
20936
+ // Counts in FINDINGS, where the types response counts types, each dimension
20937
+ // still excluding its own filter. Deliberately not locations: counting those
20938
+ // needs a set of location keys per dimension per value — memory tracking the
20939
+ // store times the vocabulary, in a read whose scan promises flat memory —
20940
+ // and the cheap per-location version is not an approximation but WRONG. A
20941
+ // location holding {claudecode, block} and {codex, warn} would survive
20942
+ // provider=claudecode AND action=warn, under which no single finding
20943
+ // matches, so the facet would contradict the instanceCount this whole view
20944
+ // rests on. Findings also keep the toolbar in the same unit as the page
20945
+ // tally and the panel it sits above.
20946
+ facets: FindingFacets,
20947
+ /** Sorted by max severity, then most recent, then (repo, file). */
20948
+ items: external_exports.array(FindingLocationSummary),
20949
+ nextCursor: external_exports.string().nullable()
20894
20950
  }).meta({ id: "ListFindingLocationsResponse" });
20895
20951
 
20896
20952
  // ../../packages/schema/src/zod/meta.ts
@@ -22055,6 +22111,14 @@ var ControlPlaneErrorBody = external_exports.object({
22055
22111
  message: external_exports.string().optional()
22056
22112
  }).optional()
22057
22113
  });
22114
+ var RemoteFailureKind = external_exports.enum([
22115
+ "unauthorized",
22116
+ "forbidden",
22117
+ "route-absent",
22118
+ "invalid-request",
22119
+ "rejected",
22120
+ "unreachable"
22121
+ ]);
22058
22122
  var AttachDeviceRequest = external_exports.object({
22059
22123
  // This machine's own continuity id, so re-attaching ROTATES the credential
22060
22124
  // on one machine record instead of producing a second one. Client-minted
@@ -23065,11 +23129,11 @@ var WorkspaceSettings = external_exports.object({
23065
23129
  // covers the current payload and must be re-granted.
23066
23130
  modelJudgeConsent: ModelJudgeConsent.optional(),
23067
23131
  // Records that the user consented to the DEFERRED send — the outbox — along
23068
- // with the payload shape and the endpoint they agreed to. Since payload v2
23069
- // that covers both the pre-attach backlog and undelivered captures (which
23070
- // carry prompt/reply text in `content`); the key name predates the widening.
23071
- // Absent until granted, and a grant for a different endpoint or an older
23072
- // payload no longer counts.
23132
+ // with the payload shape and the endpoint they agreed to. Since payload v3
23133
+ // that covers the pre-attach backlog AND undelivered captures alike, and both
23134
+ // carry prompt/reply/tool-output text in `content`; the key name predates
23135
+ // both widenings. Absent until granted, and a grant for a different endpoint
23136
+ // or an older payload no longer counts.
23073
23137
  historySyncConsent: HistorySyncConsent.optional()
23074
23138
  });
23075
23139
 
@@ -23085,6 +23149,9 @@ var ManagedSettingKey = external_exports.enum([
23085
23149
  "dataSharesInPlace",
23086
23150
  "redactFallback"
23087
23151
  ]).meta({ id: "ManagedSettingKey" });
23152
+ function isManagedSettingKey(value) {
23153
+ return ManagedSettingKey.safeParse(value).success;
23154
+ }
23088
23155
  var ManagedSettingsValues = external_exports.object({
23089
23156
  runMode: external_exports.enum(["standalone", "attached"]).optional(),
23090
23157
  controlPlane: external_exports.object({
@@ -23109,7 +23176,27 @@ var ManagedSettings = external_exports.object({
23109
23176
  // Which of those the user may not change. A key here with no matching value
23110
23177
  // freezes whatever the user last chose; a value with no lock is a DEFAULT
23111
23178
  // the user may still override. The two are separable on purpose.
23112
- lockedFields: external_exports.array(ManagedSettingKey).default([])
23179
+ //
23180
+ // Parsed as NAMES rather than as the enum, and split below: a name this
23181
+ // build does not know is dropped from the locked set and reported, never a
23182
+ // reason to refuse the file. The same shape reaches an older build whenever
23183
+ // an administrator locks a key a newer build added, and refusing it there
23184
+ // ran that build entirely unmanaged — every pin and lock gone — on exactly
23185
+ // the fleets most likely to carry a version skew. A name outside the enum
23186
+ // is still never HONOURED: the lockable set stays explicit above.
23187
+ lockedFields: external_exports.array(external_exports.string()).default([])
23188
+ }).transform(({ lockedFields, ...rest }) => {
23189
+ const known = [];
23190
+ const unknown2 = [];
23191
+ for (const name of lockedFields) {
23192
+ if (isManagedSettingKey(name)) known.push(name);
23193
+ else unknown2.push(name);
23194
+ }
23195
+ return {
23196
+ ...rest,
23197
+ lockedFields: known,
23198
+ ...unknown2.length > 0 ? { unknownLockedFields: unknown2 } : {}
23199
+ };
23113
23200
  }).meta({ id: "ManagedSettings" });
23114
23201
 
23115
23202
  // ../../packages/schema/src/zod/project-files.ts
@@ -23227,7 +23314,11 @@ var FindingsTimeseriesPoint = external_exports.object({
23227
23314
  timestamp: external_exports.iso.date(),
23228
23315
  critical: external_exports.number().int().nonnegative(),
23229
23316
  high: external_exports.number().int().nonnegative(),
23230
- medium: external_exports.number().int().nonnegative()
23317
+ medium: external_exports.number().int().nonnegative(),
23318
+ // Optional and additive, so a producer written against the earlier
23319
+ // three-series contract keeps validating. A consumer plotting it resolves the
23320
+ // absent case itself — the chart point requires a number.
23321
+ low: external_exports.number().int().nonnegative().optional()
23231
23322
  }).meta({ id: "FindingsTimeseriesPoint" });
23232
23323
  var FindingsTimeseriesResponse = external_exports.object({
23233
23324
  range: TimeRange,
@@ -23253,6 +23344,10 @@ var ResolvedFeedItem = external_exports.object({
23253
23344
  findingKey: external_exports.string(),
23254
23345
  ruleId: external_exports.string(),
23255
23346
  severity: Severity,
23347
+ // Repository slug, and the file path RELATIVE to it. The pair is what
23348
+ // identifies the file: a bare path matches the same name in every repo.
23349
+ // Optional and additive; empty when the event carried no repo.
23350
+ repo: external_exports.string().optional(),
23256
23351
  path: external_exports.string(),
23257
23352
  // ISO-8601 datetime (matches FindingInstance.detectedAt / the rest of the
23258
23353
  // findings domain). The reader `.toISOString()`s the DB epoch-ms values.