@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.
- package/CHANGELOG.md +43 -0
- package/dist/cli/doctor/bypass-without-auto-approve.d.ts +38 -0
- package/dist/cli/doctor/bypass-without-auto-approve.js +89 -0
- package/dist/cli/doctor/bypass-without-auto-approve.js.map +1 -0
- package/dist/cli/doctor/format.js +7 -0
- package/dist/cli/doctor/format.js.map +1 -1
- package/dist/cli/doctor/index.js +17 -0
- package/dist/cli/doctor/index.js.map +1 -1
- package/dist/cli/doctor/types.d.ts +11 -0
- package/dist/cli/doctor/types.js.map +1 -1
- package/dist/cli/doctor/ug-auto-approvals.js +18 -43
- package/dist/cli/doctor/ug-auto-approvals.js.map +1 -1
- package/dist/cli/gc/index.d.ts +13 -2
- package/dist/cli/gc/index.js +203 -1
- package/dist/cli/gc/index.js.map +1 -1
- package/dist/cli/index.js +44 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/composer.js +9 -0
- package/dist/cli/init/composer.js.map +1 -1
- package/dist/cli/init/profiles.d.ts +2 -2
- package/dist/cli/init/profiles.js +11 -0
- package/dist/cli/init/profiles.js.map +1 -1
- package/dist/cli/init/templates.d.ts +1 -1
- package/dist/cli/init/templates.js +11 -0
- package/dist/cli/init/templates.js.map +1 -1
- package/dist/cli/pack/hook-pre-tool-use.js +20 -21
- package/dist/cli/pack/hook-pre-tool-use.js.map +1 -1
- package/dist/cli/pack/index.d.ts +1 -0
- package/dist/cli/pack/index.js +1 -0
- package/dist/cli/pack/index.js.map +1 -1
- package/dist/cli/pack/upgrade.d.ts +32 -0
- package/dist/cli/pack/upgrade.js +273 -0
- package/dist/cli/pack/upgrade.js.map +1 -0
- package/dist/io/read-json-dir-entries.d.ts +36 -0
- package/dist/io/read-json-dir-entries.js +38 -0
- package/dist/io/read-json-dir-entries.js.map +1 -0
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.d.ts +35 -0
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.js +86 -0
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.js.map +1 -0
- package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.d.ts +14 -0
- package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.js +14 -0
- package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.js.map +1 -1
- package/dist/policy-packs/builtin/understanding-before-execution/index.d.ts +3 -1
- package/dist/policy-packs/builtin/understanding-before-execution/index.js +18 -1
- package/dist/policy-packs/builtin/understanding-before-execution/index.js.map +1 -1
- package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.d.ts +71 -0
- package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.js +169 -0
- package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.js.map +1 -0
- package/dist/runtime/git-context.js +7 -1
- package/dist/runtime/git-context.js.map +1 -1
- 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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"}
|
package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.d.ts
ADDED
|
@@ -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;
|
package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.js
ADDED
|
@@ -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
|
package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.js.map
ADDED
|
@@ -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
|
-
|
|
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.
|
|
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",
|