@lannguyensi/harness 0.52.0 → 0.53.0

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.
Files changed (51) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/cli/doctor/bypass-without-auto-approve.d.ts +38 -0
  3. package/dist/cli/doctor/bypass-without-auto-approve.js +89 -0
  4. package/dist/cli/doctor/bypass-without-auto-approve.js.map +1 -0
  5. package/dist/cli/doctor/format.js +7 -0
  6. package/dist/cli/doctor/format.js.map +1 -1
  7. package/dist/cli/doctor/index.js +17 -0
  8. package/dist/cli/doctor/index.js.map +1 -1
  9. package/dist/cli/doctor/types.d.ts +11 -0
  10. package/dist/cli/doctor/types.js.map +1 -1
  11. package/dist/cli/doctor/ug-auto-approvals.js +18 -43
  12. package/dist/cli/doctor/ug-auto-approvals.js.map +1 -1
  13. package/dist/cli/gc/index.d.ts +13 -2
  14. package/dist/cli/gc/index.js +203 -1
  15. package/dist/cli/gc/index.js.map +1 -1
  16. package/dist/cli/index.js +44 -6
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/cli/init/composer.js +9 -0
  19. package/dist/cli/init/composer.js.map +1 -1
  20. package/dist/cli/init/profiles.d.ts +2 -2
  21. package/dist/cli/init/profiles.js +11 -0
  22. package/dist/cli/init/profiles.js.map +1 -1
  23. package/dist/cli/init/templates.d.ts +1 -1
  24. package/dist/cli/init/templates.js +11 -0
  25. package/dist/cli/init/templates.js.map +1 -1
  26. package/dist/cli/pack/hook-pre-tool-use.js +20 -21
  27. package/dist/cli/pack/hook-pre-tool-use.js.map +1 -1
  28. package/dist/cli/pack/index.d.ts +1 -0
  29. package/dist/cli/pack/index.js +1 -0
  30. package/dist/cli/pack/index.js.map +1 -1
  31. package/dist/cli/pack/upgrade.d.ts +32 -0
  32. package/dist/cli/pack/upgrade.js +273 -0
  33. package/dist/cli/pack/upgrade.js.map +1 -0
  34. package/dist/io/read-json-dir-entries.d.ts +36 -0
  35. package/dist/io/read-json-dir-entries.js +38 -0
  36. package/dist/io/read-json-dir-entries.js.map +1 -0
  37. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.d.ts +35 -0
  38. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.js +86 -0
  39. package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.js.map +1 -0
  40. package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.d.ts +14 -0
  41. package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.js +14 -0
  42. package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.js.map +1 -1
  43. package/dist/policy-packs/builtin/understanding-before-execution/index.d.ts +3 -1
  44. package/dist/policy-packs/builtin/understanding-before-execution/index.js +18 -1
  45. package/dist/policy-packs/builtin/understanding-before-execution/index.js.map +1 -1
  46. package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.d.ts +71 -0
  47. package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.js +169 -0
  48. package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.js.map +1 -0
  49. package/dist/runtime/git-context.js +7 -1
  50. package/dist/runtime/git-context.js.map +1 -1
  51. package/package.json +1 -1
@@ -40,6 +40,23 @@ export { APPROVAL_MARKER_DIRNAME, approvalMarkerPathFor, writeApprovalMarker, ch
40
40
  export { REPORTS_DIR_ENV, defaultReportsDir, reportsDirForManifest, listPersistedReports, TOLERANT_FALLBACK_MAX_AGE_MS, TOLERANT_FALLBACK_FUTURE_SKEW_MS, selectReportForSession, selectNewestStrictSessionReport, findLatestReportForSession, expirePersistedReport, checkPersistedReport, } from "./persisted-reports.js";
41
41
  export { parseApprovalLifecycle } from "./lifecycle.js";
42
42
  export { AUTO_APPROVED_BY_PREFIX, CLAUDE_CODE_HARNESS, autoApprovedByFor, parseAutoApprovedBy, autoApprovedLedgerTagFor, parseAutoApprove, permissionModeAllowed, harnessAllowed, AUTO_APPROVE_HARNESS_VALUES, DEFAULT_AUTO_APPROVE_HARNESSES, DEFAULT_REPORT_SCAN_MAX_WAIT_MS, REPORT_SCAN_MAX_WAIT_CEILING_MS, parseReportScanMaxWait, } from "./auto-approve.js";
43
+ // D-004 shipped default (task 8f637efd): the one `auto_approve` snippet
44
+ // `harness init`, `harness pack upgrade understanding-before-execution`
45
+ // and `harness doctor`'s missing-auto_approve finding all render from,
46
+ // see auto-approve-default.ts's module header for why.
47
+ //
48
+ // `AUTO_APPROVE_DEFAULT_WHEN`, `AUTO_APPROVE_DEFAULT_HARNESSES`, and
49
+ // `AUTO_APPROVE_COMMENT_LINES` are deliberately NOT re-exported here
50
+ // (review round 2 F7): every caller outside this module wants the
51
+ // already-assembled `defaultAutoApproveConfig()` / `renderAutoApproveSnippet()`,
52
+ // never the three raw pieces; grepped before dropping them (task
53
+ // 8f637efd, review round 2) and confirmed no consumer outside
54
+ // auto-approve-default.ts itself used the bare re-export.
55
+ export { defaultAutoApproveConfig, renderAutoApproveSnippet, } from "./auto-approve-default.js";
56
+ // Hook-side `permission_mode` observation feeding `harness doctor`'s
57
+ // missing-`auto_approve` finding (task 8f637efd), see
58
+ // permission-mode-observations.ts's module header.
59
+ export { PERMISSION_MODE_OBSERVATION_DIRNAME, listPermissionModeObservations, permissionModeObservationPathFor, recordPermissionModeObservation, sanitizeForDisplay, } from "./permission-mode-observations.js";
43
60
  export { APPROVAL_MARKER_TASK_PREFIX, taskApprovalMarkerPathFor, writeTaskApprovalMarker, checkActiveClaimApprovalMarker, checkOperatorApprovalMarkers, clearTaskApprovalMarker, } from "./task-markers.js";
44
61
  export { DEFAULT_BASH_TOOL_NAMES, toolNameMatchesAny, bashCommandMatchesAny, extractBashCommandFromToolInput, extractTaskIdFromToolInput, extractTasksTransitionStatusFromToolInput, matchPostToolUseBoundary, applyPostToolUseExpiry, describePostToolUseExpiry, } from "./post-tool-use-boundary.js";
45
62
  export { ACTIVE_CLAIM_FILENAME, activeClaimPathFor, writeActiveClaim, readActiveClaim, clearActiveClaim, } from "./active-claim.js";
@@ -50,5 +67,5 @@ export { ACTIVE_CLAIM_FILENAME, activeClaimPathFor, writeActiveClaim, readActive
50
67
  // delegation-markers.ts for why). Exported through the shim because the
51
68
  // slice's later consumers (the `harness delegate` verb and the child's
52
69
  // PreToolUse hook) import every sibling gate symbol through it.
53
- export { DELEGATION_MARKER_DIRNAME, delegationMarkerIdFor, delegationMarkerPathFor, hashDelegationCwd, buildDelegationApprovedBy, parseDelegationApprovedBy, writeDelegationMarker, verifyDelegation, } from "./delegation-markers.js";
70
+ export { DELEGATION_MARKER_DIRNAME, ADOPTION_LEDGER_DIRNAME, delegationMarkerIdFor, delegationMarkerPathFor, hashDelegationCwd, buildDelegationApprovedBy, parseDelegationApprovedBy, writeDelegationMarker, verifyDelegation, } from "./delegation-markers.js";
54
71
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/policy-packs/builtin/understanding-before-execution/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,EAAE;AACF,mEAAmE;AACnE,sEAAsE;AACtE,EAAE;AACF,yEAAyE;AACzE,wEAAwE;AACxE,uEAAuE;AACvE,oEAAoE;AACpE,qEAAqE;AACrE,yEAAyE;AACzE,uEAAuE;AACvE,oEAAoE;AACpE,qEAAqE;AACrE,sEAAsE;AACtE,uEAAuE;AACvE,sEAAsE;AACtE,oEAAoE;AACpE,yEAAyE;AACzE,gEAAgE;AAChE,0EAA0E;AAC1E,yEAAyE;AACzE,uEAAuE;AACvE,yEAAyE;AACzE,uEAAuE;AACvE,sEAAsE;AACtE,kEAAkE;AAClE,wEAAwE;AACxE,yDAAyD;AACzD,qEAAqE;AACrE,sEAAsE;AACtE,uEAAuE;AACvE,EAAE;AACF,uEAAuE;AACvE,sEAAsE;AACtE,oEAAoE;AACpE,sEAAsE;AActE,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EAErB,mBAAmB,EAGnB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAEL,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,4BAA4B,EAC5B,gCAAgC,EAGhC,sBAAsB,EACtB,+BAA+B,EAC/B,0BAA0B,EAE1B,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAA0B,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEhF,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EAEjB,mBAAmB,EACnB,wBAAwB,EAExB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,2BAA2B,EAC3B,8BAA8B,EAC9B,+BAA+B,EAC/B,+BAA+B,EAC/B,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,uBAAuB,EACvB,8BAA8B,EAE9B,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,+BAA+B,EAC/B,0BAA0B,EAC1B,yCAAyC,EAEzC,wBAAwB,EAExB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAE3B,wEAAwE;AACxE,oEAAoE;AACpE,sEAAsE;AACtE,6DAA6D;AAC7D,wEAAwE;AACxE,uEAAuE;AACvE,gEAAgE;AAChE,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,uBAAuB,EACvB,iBAAiB,EAEjB,yBAAyB,EAGzB,yBAAyB,EAGzB,qBAAqB,EAIrB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/policy-packs/builtin/understanding-before-execution/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ export declare const PERMISSION_MODE_OBSERVATION_DIRNAME = ".permission-mode-observations";
2
+ export interface PermissionModeObservation {
3
+ sessionId: string;
4
+ permissionMode: string;
5
+ observedAt: string;
6
+ }
7
+ /**
8
+ * `sessionId` is validated with the SAME `rejectMalformedSessionId` used
9
+ * for the approval marker path (`markers.ts`'s `approvalMarkerPathFor`):
10
+ * a value carrying `/`, `\`, `..`, or that is empty/blank throws rather
11
+ * than being joined into the path (review round 3, F1: the earlier
12
+ * version of this function trusted the caller's own empty-string check
13
+ * and joined `sessionId` verbatim, letting a crafted `session_id` on the
14
+ * hook's stdin write outside `<generatedDir>/.permission-mode-observations/`).
15
+ */
16
+ export declare function permissionModeObservationPathFor(generatedDir: string, sessionId: string): string;
17
+ /**
18
+ * Best-effort write/update of the per-session observation.
19
+ *
20
+ * `permissionMode` must be a non-empty string; any other shape (absent,
21
+ * non-string, empty) is a silent no-op: there is nothing to observe.
22
+ * `sessionId` is NOT trusted as pre-validated (review round 3, F1): the
23
+ * caller (`hook-pre-tool-use.ts`) only rejects an EMPTY session id
24
+ * before this is reached, and `session_id` on the hook's stdin payload
25
+ * is otherwise attacker-controllable input to a CLI invocation, not a
26
+ * value this function may assume is already path-safe. A malformed id
27
+ * (path separators, `..`, blank) makes `permissionModeObservationPathFor`
28
+ * throw; that throw is treated exactly like any other write failure
29
+ * below: one `stderr` warning, never escalated into a block, never
30
+ * thrown out of this function.
31
+ */
32
+ export declare function recordPermissionModeObservation(generatedDir: string, sessionId: string, permissionMode: unknown, stderr: {
33
+ write(s: string): unknown;
34
+ }, now?: () => Date): void;
35
+ export interface PermissionModeObservationsResult {
36
+ /** Whether `<generatedDir>/.permission-mode-observations/` exists at all. */
37
+ dirPresent: boolean;
38
+ /** Newest `windowSize` readable observations, newest `observedAt` first. */
39
+ entries: PermissionModeObservation[];
40
+ /** Files present but unparseable / missing a required field. */
41
+ unreadableCount: number;
42
+ }
43
+ /**
44
+ * Strip C0/DEL control characters (including ESC, which could otherwise
45
+ * smuggle an ANSI escape sequence into a terminal) and cap the length,
46
+ * mirroring `persisted-reports.ts`'s `sanitizeDetailValue` for the same
47
+ * reason: `bypass-without-auto-approve.ts` embeds an observation's
48
+ * `sessionId` directly into a doctor finding's `message`, the surface an
49
+ * operator reads (review round 3, F1). This is independent of
50
+ * `permissionModeObservationPathFor`'s write-time
51
+ * `rejectMalformedSessionId` guard: that guard rejects path-traversal
52
+ * shapes, not control characters, and a directory entry's on-disk
53
+ * filename (or the `sessionId` field inside it) is never itself
54
+ * constrained to be display-safe: POSIX filenames may contain any byte
55
+ * but `/` and NUL, and the JSON body's `sessionId` field is a plain
56
+ * string with no such constraint either.
57
+ */
58
+ export declare function sanitizeForDisplay(value: string): string;
59
+ /**
60
+ * Read-side: the newest `windowSize` per-session observations, newest
61
+ * first by `observedAt`. Mirrors `ug-auto-approvals.ts`'s own
62
+ * read-and-window convention (missing dir / empty dir / all-unreadable
63
+ * all resolve to an empty-ish result, never throw: this is a doctor
64
+ * read, not a gate decision). Every returned `sessionId` has already
65
+ * been through {@link sanitizeForDisplay}, so every consumer (today,
66
+ * `bypass-without-auto-approve.ts`'s finding `message`) gets a
67
+ * doctor-output-safe value without having to sanitize it itself.
68
+ */
69
+ export declare function listPermissionModeObservations(generatedDir: string, opts: {
70
+ windowSize: number;
71
+ }): PermissionModeObservationsResult;
@@ -0,0 +1,169 @@
1
+ // Hook-side observation of PreToolUse `permission_mode` (task 8f637efd,
2
+ // docs/decisions/2026-08-27-ug-auto-mode-approval.md's "Amendment:
3
+ // install default"). One small per-session record under
4
+ // `<generatedDir>/.permission-mode-observations/<sessionId>`.
5
+ //
6
+ // WHY A NEW ARTEFACT, NOT THE LEDGER OR THE PERSISTED REPORT. `harness
7
+ // doctor`'s missing-`auto_approve` finding needs to know whether a
8
+ // session actually ran under `bypassPermissions`, and the evidence-ledger
9
+ // trust boundary this pack already enforces for approval
10
+ // (docs/okf/evidence-ledger-trust-boundary.md) applies here too: a fact
11
+ // the AGENT can write (a ledger row, a report field) proves nothing about
12
+ // what the harness process observed. `permission_mode` on the PreToolUse
13
+ // payload is a T1 signal (composed by Claude Code itself, not by the
14
+ // model: same trust class the auto-approval path already relies on,
15
+ // see the ADR's "Signal sources per harness" table), so the write side
16
+ // here is the SAME hook, at the SAME point in its decision order, using
17
+ // the SAME field. The record carries no payload content beyond the
18
+ // mode itself: (sessionId, permissionMode, observedAt), nothing else.
19
+ //
20
+ // WHERE IT IS WRITTEN. `hook-pre-tool-use.ts` calls
21
+ // `recordPermissionModeObservation` once per PreToolUse invocation that
22
+ // reaches the same point `attemptAutoApproval` already runs at
23
+ // (auto-approve-path.ts's module header explains why that point matters:
24
+ // every call that reaches it has already been declined by the signed
25
+ // marker check, the read-only Bash exemption, the recovery-commit
26
+ // exemption, and the escape `ask`: so it is exactly the call that would
27
+ // otherwise need approval). A session whose first tool call already
28
+ // matches a still-valid marker never reaches this point and is therefore
29
+ // never observed for that session; this is an accepted coverage gap
30
+ // (documented at the call site), not a silent failure: the finding this
31
+ // feeds targets the ADR's Mac-mini incident shape (a marker EXPIRED or
32
+ // never existed, the call fell through to the block/auto-approve
33
+ // attempt, and `permission_mode` WAS on the payload at that instant),
34
+ // not perfect per-session coverage.
35
+ //
36
+ // FAIL-OPEN ON WRITE ERRORS. A failed write is one stderr warning line,
37
+ // never escalated into a block: this is telemetry for `harness doctor`,
38
+ // never a gate input, and the write happens on the same fail-open
39
+ // posture every other best-effort write in this pack already uses
40
+ // (`writePendingApproval`, the marker writers).
41
+ //
42
+ // UNSIGNED: ADVISORY ONLY, NOT PROOF (review round 3, F2). Unlike the
43
+ // approval marker (`markers.ts`), this record is NOT HMAC-signed. It is
44
+ // written by the hook PROCESS from whatever `session_id`/`permission_mode`
45
+ // appear on the invocation's PreToolUse payload; that only proves the
46
+ // hook was invoked with that payload, not that any particular session
47
+ // actually ran under that mode: an already-approved session (or anything
48
+ // else able to invoke `harness pack hook pre-tool-use` with crafted
49
+ // stdin) can write, or forge, an observation. That is why
50
+ // `checkBypassWithoutAutoApprove` (bypass-without-auto-approve.ts) is
51
+ // wired as an advisory `harness doctor` finding ONLY: it can never gate a
52
+ // tool call or mint an approval, and the operator who reads the finding
53
+ // is the one who decides what to do about it. A possible future
54
+ // hardening, not done here, is signing the observation the same way
55
+ // approval markers are signed.
56
+ import * as path from "node:path";
57
+ import { atomicWriteFile } from "../../../io/atomic-write.js";
58
+ import { readJsonDirEntriesRejectingSymlinks } from "../../../io/read-json-dir-entries.js";
59
+ import { rejectMalformedSessionId } from "../../../runtime/reject-malformed-session-id.js";
60
+ export const PERMISSION_MODE_OBSERVATION_DIRNAME = ".permission-mode-observations";
61
+ /**
62
+ * `sessionId` is validated with the SAME `rejectMalformedSessionId` used
63
+ * for the approval marker path (`markers.ts`'s `approvalMarkerPathFor`):
64
+ * a value carrying `/`, `\`, `..`, or that is empty/blank throws rather
65
+ * than being joined into the path (review round 3, F1: the earlier
66
+ * version of this function trusted the caller's own empty-string check
67
+ * and joined `sessionId` verbatim, letting a crafted `session_id` on the
68
+ * hook's stdin write outside `<generatedDir>/.permission-mode-observations/`).
69
+ */
70
+ export function permissionModeObservationPathFor(generatedDir, sessionId) {
71
+ rejectMalformedSessionId(sessionId);
72
+ return path.join(generatedDir, PERMISSION_MODE_OBSERVATION_DIRNAME, sessionId);
73
+ }
74
+ /**
75
+ * Best-effort write/update of the per-session observation.
76
+ *
77
+ * `permissionMode` must be a non-empty string; any other shape (absent,
78
+ * non-string, empty) is a silent no-op: there is nothing to observe.
79
+ * `sessionId` is NOT trusted as pre-validated (review round 3, F1): the
80
+ * caller (`hook-pre-tool-use.ts`) only rejects an EMPTY session id
81
+ * before this is reached, and `session_id` on the hook's stdin payload
82
+ * is otherwise attacker-controllable input to a CLI invocation, not a
83
+ * value this function may assume is already path-safe. A malformed id
84
+ * (path separators, `..`, blank) makes `permissionModeObservationPathFor`
85
+ * throw; that throw is treated exactly like any other write failure
86
+ * below: one `stderr` warning, never escalated into a block, never
87
+ * thrown out of this function.
88
+ */
89
+ export function recordPermissionModeObservation(generatedDir, sessionId, permissionMode, stderr, now = () => new Date()) {
90
+ if (typeof permissionMode !== "string" || permissionMode.length === 0)
91
+ return;
92
+ if (sessionId.length === 0)
93
+ return;
94
+ const record = {
95
+ sessionId,
96
+ permissionMode,
97
+ observedAt: now().toISOString(),
98
+ };
99
+ try {
100
+ atomicWriteFile(permissionModeObservationPathFor(generatedDir, sessionId), `${JSON.stringify(record)}\n`);
101
+ }
102
+ catch (err) {
103
+ stderr.write(`harness pack hook: failed to write permission-mode observation for session ${sanitizeForDisplay(sessionId)} (${err.message}), continuing.\n`);
104
+ }
105
+ }
106
+ function isValidObservation(value) {
107
+ if (value === null || typeof value !== "object" || Array.isArray(value))
108
+ return false;
109
+ const obj = value;
110
+ return (typeof obj["sessionId"] === "string" &&
111
+ typeof obj["permissionMode"] === "string" &&
112
+ typeof obj["observedAt"] === "string" &&
113
+ !Number.isNaN(Date.parse(obj["observedAt"])));
114
+ }
115
+ /** Cap applied to a sanitized `sessionId` before it reaches doctor output. */
116
+ const DISPLAY_VALUE_MAX_LENGTH = 200;
117
+ /**
118
+ * Strip C0/DEL control characters (including ESC, which could otherwise
119
+ * smuggle an ANSI escape sequence into a terminal) and cap the length,
120
+ * mirroring `persisted-reports.ts`'s `sanitizeDetailValue` for the same
121
+ * reason: `bypass-without-auto-approve.ts` embeds an observation's
122
+ * `sessionId` directly into a doctor finding's `message`, the surface an
123
+ * operator reads (review round 3, F1). This is independent of
124
+ * `permissionModeObservationPathFor`'s write-time
125
+ * `rejectMalformedSessionId` guard: that guard rejects path-traversal
126
+ * shapes, not control characters, and a directory entry's on-disk
127
+ * filename (or the `sessionId` field inside it) is never itself
128
+ * constrained to be display-safe: POSIX filenames may contain any byte
129
+ * but `/` and NUL, and the JSON body's `sessionId` field is a plain
130
+ * string with no such constraint either.
131
+ */
132
+ export function sanitizeForDisplay(value) {
133
+ const flattened = value.replace(/[\x00-\x1f\x7f]/g, " ");
134
+ return flattened.length > DISPLAY_VALUE_MAX_LENGTH
135
+ ? `${flattened.slice(0, DISPLAY_VALUE_MAX_LENGTH)}...`
136
+ : flattened;
137
+ }
138
+ /**
139
+ * Read-side: the newest `windowSize` per-session observations, newest
140
+ * first by `observedAt`. Mirrors `ug-auto-approvals.ts`'s own
141
+ * read-and-window convention (missing dir / empty dir / all-unreadable
142
+ * all resolve to an empty-ish result, never throw: this is a doctor
143
+ * read, not a gate decision). Every returned `sessionId` has already
144
+ * been through {@link sanitizeForDisplay}, so every consumer (today,
145
+ * `bypass-without-auto-approve.ts`'s finding `message`) gets a
146
+ * doctor-output-safe value without having to sanitize it itself.
147
+ */
148
+ export function listPermissionModeObservations(generatedDir, opts) {
149
+ const dir = path.join(generatedDir, PERMISSION_MODE_OBSERVATION_DIRNAME);
150
+ const { dirPresent, entries: readable, unreadableCount } = readJsonDirEntriesRejectingSymlinks(dir, {
151
+ parse: (raw) => isValidObservation(raw)
152
+ ? {
153
+ ...raw,
154
+ sessionId: sanitizeForDisplay(raw.sessionId),
155
+ // `observedAt` only has to satisfy Date.parse, which accepts
156
+ // parenthesised trailing text, so it is display-sanitised too
157
+ // (review round 3: a crafted timestamp reached doctor output raw).
158
+ observedAt: sanitizeForDisplay(raw.observedAt),
159
+ }
160
+ : null,
161
+ });
162
+ readable.sort((a, b) => Date.parse(b.observedAt) - Date.parse(a.observedAt));
163
+ return {
164
+ dirPresent,
165
+ entries: readable.slice(0, opts.windowSize),
166
+ unreadableCount,
167
+ };
168
+ }
169
+ //# sourceMappingURL=permission-mode-observations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission-mode-observations.js","sourceRoot":"","sources":["../../../../src/policy-packs/builtin/understanding-before-execution/permission-mode-observations.ts"],"names":[],"mappings":"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"}
@@ -138,7 +138,13 @@ export function resolveGitContext(cwd) {
138
138
  const match = HEAD_REF_RE.exec(head);
139
139
  if (match) {
140
140
  branch = match[1].trim();
141
- sha = resolveBranchSha(entry.gitDir, branch);
141
+ // `refs/heads/<branch>` and `packed-refs` are not duplicated in
142
+ // a linked worktree's private gitdir; they live in the shared
143
+ // common dir (see `resolveCommonDir`'s doc comment). Routing
144
+ // through it here is a no-op for the main checkout (no
145
+ // `commondir` file, `resolveCommonDir` returns `gitDir`
146
+ // unchanged).
147
+ sha = resolveBranchSha(resolveCommonDir(entry.gitDir), branch);
142
148
  }
143
149
  else if (SHA_RE.test(head)) {
144
150
  // Detached HEAD: the file contains the raw sha directly.
@@ -1 +1 @@
1
- {"version":3,"file":"git-context.js","sourceRoot":"","sources":["../../src/runtime/git-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-context.js","sourceRoot":"","sources":["../../src/runtime/git-context.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lannguyensi/harness",
3
- "version": "0.52.0",
3
+ "version": "0.53.0",
4
4
  "description": "Declarative control plane for agent harnesses — one YAML for grounding, tools, memory, and hooks.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/LanNguyenSi/harness",