instar 0.28.52 → 0.28.53

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 (84) hide show
  1. package/dist/cli.js +40 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/gate.d.ts +33 -0
  4. package/dist/commands/gate.d.ts.map +1 -0
  5. package/dist/commands/gate.js +171 -0
  6. package/dist/commands/gate.js.map +1 -0
  7. package/dist/commands/init.d.ts.map +1 -1
  8. package/dist/commands/init.js +29 -2
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/core/MessageSentinel.d.ts +40 -0
  11. package/dist/core/MessageSentinel.d.ts.map +1 -1
  12. package/dist/core/MessageSentinel.js +80 -0
  13. package/dist/core/MessageSentinel.js.map +1 -1
  14. package/dist/core/PostUpdateMigrator.d.ts +7 -0
  15. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  16. package/dist/core/PostUpdateMigrator.js +114 -0
  17. package/dist/core/PostUpdateMigrator.js.map +1 -1
  18. package/dist/core/SessionManager.d.ts +29 -0
  19. package/dist/core/SessionManager.d.ts.map +1 -1
  20. package/dist/core/SessionManager.js +104 -1
  21. package/dist/core/SessionManager.js.map +1 -1
  22. package/dist/core/StopGateDb.d.ts +97 -0
  23. package/dist/core/StopGateDb.d.ts.map +1 -0
  24. package/dist/core/StopGateDb.js +282 -0
  25. package/dist/core/StopGateDb.js.map +1 -0
  26. package/dist/core/UnjustifiedStopGate.d.ts +145 -0
  27. package/dist/core/UnjustifiedStopGate.d.ts.map +1 -0
  28. package/dist/core/UnjustifiedStopGate.js +325 -0
  29. package/dist/core/UnjustifiedStopGate.js.map +1 -0
  30. package/dist/core/WorktreeKeyVault.d.ts +50 -0
  31. package/dist/core/WorktreeKeyVault.d.ts.map +1 -0
  32. package/dist/core/WorktreeKeyVault.js +242 -0
  33. package/dist/core/WorktreeKeyVault.js.map +1 -0
  34. package/dist/core/WorktreeManager.d.ts +250 -0
  35. package/dist/core/WorktreeManager.d.ts.map +1 -0
  36. package/dist/core/WorktreeManager.js +833 -0
  37. package/dist/core/WorktreeManager.js.map +1 -0
  38. package/dist/monitoring/DegradationReporter.d.ts +15 -0
  39. package/dist/monitoring/DegradationReporter.d.ts.map +1 -1
  40. package/dist/monitoring/DegradationReporter.js +27 -0
  41. package/dist/monitoring/DegradationReporter.js.map +1 -1
  42. package/dist/monitoring/WorktreeReaper.d.ts +52 -0
  43. package/dist/monitoring/WorktreeReaper.d.ts.map +1 -0
  44. package/dist/monitoring/WorktreeReaper.js +199 -0
  45. package/dist/monitoring/WorktreeReaper.js.map +1 -0
  46. package/dist/scaffold/templates.d.ts.map +1 -1
  47. package/dist/scaffold/templates.js +8 -0
  48. package/dist/scaffold/templates.js.map +1 -1
  49. package/dist/server/AgentServer.d.ts +18 -0
  50. package/dist/server/AgentServer.d.ts.map +1 -1
  51. package/dist/server/AgentServer.js +24 -0
  52. package/dist/server/AgentServer.js.map +1 -1
  53. package/dist/server/middleware.d.ts.map +1 -1
  54. package/dist/server/middleware.js +20 -3
  55. package/dist/server/middleware.js.map +1 -1
  56. package/dist/server/routes.d.ts +10 -0
  57. package/dist/server/routes.d.ts.map +1 -1
  58. package/dist/server/routes.js +432 -0
  59. package/dist/server/routes.js.map +1 -1
  60. package/dist/server/stopGate.d.ts +77 -0
  61. package/dist/server/stopGate.d.ts.map +1 -0
  62. package/dist/server/stopGate.js +161 -0
  63. package/dist/server/stopGate.js.map +1 -0
  64. package/dist/server/worktreeRoutes.d.ts +48 -0
  65. package/dist/server/worktreeRoutes.d.ts.map +1 -0
  66. package/dist/server/worktreeRoutes.js +247 -0
  67. package/dist/server/worktreeRoutes.js.map +1 -0
  68. package/package.json +1 -1
  69. package/scripts/destructive-command-shim.js +218 -0
  70. package/scripts/gh-ruleset-install.mjs +143 -0
  71. package/scripts/migrate-incident-2026-04-17.mjs +138 -0
  72. package/scripts/worktree-commit-msg-hook.js +168 -0
  73. package/scripts/worktree-precommit-gate.js +144 -0
  74. package/src/data/builtin-manifest.json +93 -93
  75. package/upgrades/0.28.53.md +70 -0
  76. package/upgrades/side-effects/context-death-pr0a-server-infra.md +131 -0
  77. package/upgrades/side-effects/context-death-pr0b-sentinel-intent.md +130 -0
  78. package/upgrades/side-effects/context-death-pr0c-guardian-pulse-degradation-consumer.md +118 -0
  79. package/upgrades/side-effects/context-death-pr0d-e2e-compaction-harness.md +113 -0
  80. package/upgrades/side-effects/context-death-pr1-identity-text.md +110 -0
  81. package/upgrades/side-effects/context-death-pr2-e2e-compaction-recovery-test.md +82 -0
  82. package/upgrades/side-effects/context-death-pr3-gate-authority.md +193 -0
  83. package/upgrades/side-effects/context-death-pr4-gate-cli.md +91 -0
  84. package/upgrades/side-effects/parallel-dev-isolation.md +129 -0
@@ -0,0 +1,77 @@
1
+ /**
2
+ * stopGate.ts — UnjustifiedStopGate server infrastructure (PR0a).
3
+ *
4
+ * Provides the read-side API surface that the future stop-hook router
5
+ * consumes (PR3). State is in-memory for PR0a; PR3 migrates to SQLite.
6
+ *
7
+ * Spec: docs/specs/context-death-pitfall-prevention.md
8
+ *
9
+ * PR0a deliverables:
10
+ * - Hot-path batched state assembly: {mode, killSwitch, autonomousActive,
11
+ * compactionInFlight, sessionStartTs}
12
+ * - Kill-switch local fast-path (set/clear/get)
13
+ * - Compaction probe (P0.6): /tmp/claude-session-<id>/compacting OR
14
+ * compaction-recovery.sh mtime within 60s
15
+ * - Version contract constants for /health
16
+ *
17
+ * Threat model: drift-correction, NOT security boundary. See spec §
18
+ * "Threat model".
19
+ */
20
+ export declare const GATE_ROUTE_VERSION = 1;
21
+ export declare const GATE_ROUTE_MINIMUM_VERSION = 1;
22
+ export type GateMode = 'off' | 'shadow' | 'enforce';
23
+ export declare function getMode(): GateMode;
24
+ export declare function setMode(mode: GateMode): void;
25
+ export declare function getKillSwitch(): boolean;
26
+ /**
27
+ * Set kill-switch state in-memory. Returns the prior value so the caller
28
+ * can detect no-op flips for telemetry.
29
+ *
30
+ * PR0a does NOT propagate to the machine registry — that fanout lands in
31
+ * PR4 alongside the CLI. The server can be killed via the local fast-path
32
+ * endpoint immediately; remote machines catch up later.
33
+ */
34
+ export declare function setKillSwitch(value: boolean): boolean;
35
+ /**
36
+ * Record the SessionStart timestamp for a session id. Idempotent:
37
+ * subsequent calls for the same id are no-ops (first SessionStart wins —
38
+ * we track the original session boundary, not later resumes).
39
+ *
40
+ * Called by the /hooks/events handler when a SessionStart event arrives.
41
+ */
42
+ export declare function recordSessionStart(sessionId: string, timestampMs: number): void;
43
+ export declare function getSessionStartTs(sessionId: string): number | null;
44
+ /**
45
+ * Test-only reset. Production code must not call this.
46
+ */
47
+ export declare function _resetForTests(): void;
48
+ export interface CompactionProbeOptions {
49
+ /** Session id used to look up the per-session marker file. */
50
+ sessionId?: string;
51
+ /** Path to compaction-recovery.sh (for mtime heuristic). Defaults to
52
+ * the agent-local hook path. Tests inject a tmp path. */
53
+ recoveryScriptPath?: string;
54
+ /** Override "now" for tests. */
55
+ now?: number;
56
+ }
57
+ export declare function compactionInFlight(opts?: CompactionProbeOptions): boolean;
58
+ export interface HotPathState {
59
+ mode: GateMode;
60
+ killSwitch: boolean;
61
+ autonomousActive: boolean;
62
+ compactionInFlight: boolean;
63
+ sessionStartTs: number | null;
64
+ routeVersion: number;
65
+ }
66
+ export interface HotPathInputs {
67
+ sessionId?: string;
68
+ /** Whether the current agent is in autonomous mode. PR0a reads it from
69
+ * the autonomous-state.local.md file convention; PR3 may use a
70
+ * finer-grained source. Pass an explicit boolean to override (tests). */
71
+ autonomousActiveOverride?: boolean;
72
+ autonomousStateFile?: string;
73
+ recoveryScriptPath?: string;
74
+ now?: number;
75
+ }
76
+ export declare function getHotPathState(opts?: HotPathInputs): HotPathState;
77
+ //# sourceMappingURL=stopGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stopGate.d.ts","sourceRoot":"","sources":["../../src/server/stopGate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAeH,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAS5C,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AAiBpD,wBAAgB,OAAO,IAAI,QAAQ,CAElC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAE5C;AAED,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAIrD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAI/E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGlE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAIrC;AAgBD,MAAM,WAAW,sBAAsB;IACrC,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;8DAC0D;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,sBAA2B,GAAG,OAAO,CA0B7E;AASD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;8EAE0E;IAC1E,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAoBD,wBAAgB,eAAe,CAAC,IAAI,GAAE,aAAkB,GAAG,YAAY,CAatE"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * stopGate.ts — UnjustifiedStopGate server infrastructure (PR0a).
3
+ *
4
+ * Provides the read-side API surface that the future stop-hook router
5
+ * consumes (PR3). State is in-memory for PR0a; PR3 migrates to SQLite.
6
+ *
7
+ * Spec: docs/specs/context-death-pitfall-prevention.md
8
+ *
9
+ * PR0a deliverables:
10
+ * - Hot-path batched state assembly: {mode, killSwitch, autonomousActive,
11
+ * compactionInFlight, sessionStartTs}
12
+ * - Kill-switch local fast-path (set/clear/get)
13
+ * - Compaction probe (P0.6): /tmp/claude-session-<id>/compacting OR
14
+ * compaction-recovery.sh mtime within 60s
15
+ * - Version contract constants for /health
16
+ *
17
+ * Threat model: drift-correction, NOT security boundary. See spec §
18
+ * "Threat model".
19
+ */
20
+ import fs from 'node:fs';
21
+ import path from 'node:path';
22
+ // ── Version contract (P0.7) ─────────────────────────────────────────────
23
+ //
24
+ // `GATE_ROUTE_VERSION` is the protocol version this server speaks on
25
+ // the /internal/stop-gate/* routes. Hook-lib reads it from /health and
26
+ // emits a one-time DegradationReport if its required minimum is greater
27
+ // than what the server exposes.
28
+ //
29
+ // `GATE_ROUTE_MINIMUM_VERSION` is the lowest hook-lib version this
30
+ // server will accept without degraded-mode warnings. Bump in lockstep
31
+ // with breaking changes to the hot-path schema.
32
+ export const GATE_ROUTE_VERSION = 1;
33
+ export const GATE_ROUTE_MINIMUM_VERSION = 1;
34
+ const state = {
35
+ mode: 'off',
36
+ killSwitch: false,
37
+ sessionStartTs: new Map(),
38
+ };
39
+ export function getMode() {
40
+ return state.mode;
41
+ }
42
+ export function setMode(mode) {
43
+ state.mode = mode;
44
+ }
45
+ export function getKillSwitch() {
46
+ return state.killSwitch;
47
+ }
48
+ /**
49
+ * Set kill-switch state in-memory. Returns the prior value so the caller
50
+ * can detect no-op flips for telemetry.
51
+ *
52
+ * PR0a does NOT propagate to the machine registry — that fanout lands in
53
+ * PR4 alongside the CLI. The server can be killed via the local fast-path
54
+ * endpoint immediately; remote machines catch up later.
55
+ */
56
+ export function setKillSwitch(value) {
57
+ const prior = state.killSwitch;
58
+ state.killSwitch = value;
59
+ return prior;
60
+ }
61
+ /**
62
+ * Record the SessionStart timestamp for a session id. Idempotent:
63
+ * subsequent calls for the same id are no-ops (first SessionStart wins —
64
+ * we track the original session boundary, not later resumes).
65
+ *
66
+ * Called by the /hooks/events handler when a SessionStart event arrives.
67
+ */
68
+ export function recordSessionStart(sessionId, timestampMs) {
69
+ if (!sessionId)
70
+ return;
71
+ if (state.sessionStartTs.has(sessionId))
72
+ return;
73
+ state.sessionStartTs.set(sessionId, timestampMs);
74
+ }
75
+ export function getSessionStartTs(sessionId) {
76
+ if (!sessionId)
77
+ return null;
78
+ return state.sessionStartTs.get(sessionId) ?? null;
79
+ }
80
+ /**
81
+ * Test-only reset. Production code must not call this.
82
+ */
83
+ export function _resetForTests() {
84
+ state.mode = 'off';
85
+ state.killSwitch = false;
86
+ state.sessionStartTs.clear();
87
+ }
88
+ // ── Compaction probe (P0.6) ─────────────────────────────────────────────
89
+ //
90
+ // Best-effort signal that compaction is currently in flight. Two sources:
91
+ //
92
+ // 1. If Claude Code exposes `/tmp/claude-session-<id>/compacting`, the
93
+ // file's existence is authoritative.
94
+ // 2. Heuristic fallback: `compaction-recovery.sh` mtime within last 60s.
95
+ // Beyond 60s the signal is stale and ignored.
96
+ //
97
+ // Returning false on any error (fail-open) — drift-correction model, the
98
+ // gate's hot-path treats compactionInFlight as a routing hint, not a
99
+ // safety-critical assertion.
100
+ const COMPACTION_HEURISTIC_WINDOW_MS = 60_000;
101
+ export function compactionInFlight(opts = {}) {
102
+ const now = opts.now ?? Date.now();
103
+ // Source 1: authoritative marker file (if present).
104
+ if (opts.sessionId) {
105
+ const marker = `/tmp/claude-session-${opts.sessionId}/compacting`;
106
+ try {
107
+ if (fs.existsSync(marker))
108
+ return true;
109
+ }
110
+ catch {
111
+ // fail-open
112
+ }
113
+ }
114
+ // Source 2: recovery script mtime heuristic.
115
+ const recoveryPath = opts.recoveryScriptPath
116
+ ?? path.resolve(process.cwd(), '.instar/hooks/instar/compaction-recovery.sh');
117
+ try {
118
+ const st = fs.statSync(recoveryPath);
119
+ const ageMs = now - st.mtimeMs;
120
+ if (ageMs >= 0 && ageMs <= COMPACTION_HEURISTIC_WINDOW_MS)
121
+ return true;
122
+ }
123
+ catch {
124
+ // fail-open: missing recovery script is reported separately by
125
+ // health probes, not by this gate.
126
+ }
127
+ return false;
128
+ }
129
+ /**
130
+ * Heuristic for autonomousActive: existence of `.claude/autonomous-state
131
+ * .local.md` is the existing convention agents use to signal autonomous
132
+ * intent. Tests may override.
133
+ */
134
+ function readAutonomousActive(opts) {
135
+ if (typeof opts.autonomousActiveOverride === 'boolean') {
136
+ return opts.autonomousActiveOverride;
137
+ }
138
+ const file = opts.autonomousStateFile
139
+ ?? path.resolve(process.cwd(), '.claude/autonomous-state.local.md');
140
+ try {
141
+ return fs.existsSync(file);
142
+ }
143
+ catch {
144
+ return false;
145
+ }
146
+ }
147
+ export function getHotPathState(opts = {}) {
148
+ return {
149
+ mode: state.mode,
150
+ killSwitch: state.killSwitch,
151
+ autonomousActive: readAutonomousActive(opts),
152
+ compactionInFlight: compactionInFlight({
153
+ sessionId: opts.sessionId,
154
+ recoveryScriptPath: opts.recoveryScriptPath,
155
+ now: opts.now,
156
+ }),
157
+ sessionStartTs: opts.sessionId ? getSessionStartTs(opts.sessionId) : null,
158
+ routeVersion: GATE_ROUTE_VERSION,
159
+ };
160
+ }
161
+ //# sourceMappingURL=stopGate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stopGate.js","sourceRoot":"","sources":["../../src/server/stopGate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Worktree HTTP routes.
3
+ *
4
+ * Standard auth (bearer token) endpoints:
5
+ * POST /worktrees/resolve — atomic create+bind+lock; spawned by SessionManager
6
+ * POST /worktrees/release — release lock (sessionId+fencingToken)
7
+ * POST /worktrees/heartbeat — server-stamped heartbeat
8
+ * POST /worktrees/force-take — forcible takeover (audit-logged)
9
+ * GET /worktrees — list bindings
10
+ * GET /worktrees/reconcile — state reconciliation matrix snapshot
11
+ *
12
+ * POST /commits/preflight — pre-commit hook checks cwd vs binding, lock owner, foreign-WIP
13
+ * POST /commits/sign-trailer — commit-msg hook gets the 9 trailer lines (server signs)
14
+ *
15
+ * OIDC-only endpoint (mounted before auth middleware):
16
+ * POST /gh-check/verify-nonce — called by GitHub Actions runner; OIDC-authenticated;
17
+ * rate-limited; oracle-protected (uniform error response).
18
+ */
19
+ import { Router } from 'express';
20
+ import type { WorktreeManager } from '../core/WorktreeManager.js';
21
+ export declare function createWorktreeRoutes(deps: {
22
+ worktreeManager: WorktreeManager;
23
+ projectDir: string;
24
+ }): Router;
25
+ export interface OidcVerifyOptions {
26
+ /**
27
+ * Allowed (owner, repo) tuples. e.g. {owner: 'instar', repo: 'instar'}.
28
+ * Empty list means all callers rejected.
29
+ */
30
+ enrolledRepos: Array<{
31
+ owner: string;
32
+ repo: string;
33
+ }>;
34
+ /**
35
+ * Verify a GitHub OIDC token and return claims, or throw.
36
+ * Injected so we can unit-test without real OIDC traffic.
37
+ */
38
+ verifyOidcToken: (token: string) => Promise<{
39
+ repository: string;
40
+ workflow_ref: string;
41
+ ref: string;
42
+ }>;
43
+ }
44
+ export declare function createOidcWorktreeRoutes(deps: {
45
+ worktreeManager: WorktreeManager;
46
+ oidc: OidcVerifyOptions;
47
+ }): Router;
48
+ //# sourceMappingURL=worktreeRoutes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktreeRoutes.d.ts","sourceRoot":"","sources":["../../src/server/worktreeRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAKjC,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,4BAA4B,CAAC;AA4EhF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAoHT;AAID,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,aAAa,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD;;;OAGG;IACH,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxG;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,eAAe,EAAE,eAAe,CAAC;IACjC,IAAI,EAAE,iBAAiB,CAAC;CACzB,GAAG,MAAM,CA4CT"}
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Worktree HTTP routes.
3
+ *
4
+ * Standard auth (bearer token) endpoints:
5
+ * POST /worktrees/resolve — atomic create+bind+lock; spawned by SessionManager
6
+ * POST /worktrees/release — release lock (sessionId+fencingToken)
7
+ * POST /worktrees/heartbeat — server-stamped heartbeat
8
+ * POST /worktrees/force-take — forcible takeover (audit-logged)
9
+ * GET /worktrees — list bindings
10
+ * GET /worktrees/reconcile — state reconciliation matrix snapshot
11
+ *
12
+ * POST /commits/preflight — pre-commit hook checks cwd vs binding, lock owner, foreign-WIP
13
+ * POST /commits/sign-trailer — commit-msg hook gets the 9 trailer lines (server signs)
14
+ *
15
+ * OIDC-only endpoint (mounted before auth middleware):
16
+ * POST /gh-check/verify-nonce — called by GitHub Actions runner; OIDC-authenticated;
17
+ * rate-limited; oracle-protected (uniform error response).
18
+ */
19
+ import { Router } from 'express';
20
+ import path from 'node:path';
21
+ import fs from 'node:fs';
22
+ import { z } from 'zod';
23
+ // ── Validation schemas ───────────────────────────────────────────────
24
+ const ModeSchema = z.enum(['dev', 'read-only', 'doc-fix', 'platform']);
25
+ const TopicIdSchema = z.union([z.number().int().positive(), z.literal('platform')]);
26
+ const ResolveBody = z.object({
27
+ topicId: TopicIdSchema,
28
+ mode: ModeSchema,
29
+ sessionId: z.string().min(1).max(128),
30
+ pid: z.number().int().positive(),
31
+ processStartTime: z.number().int().nonnegative().optional(),
32
+ slug: z.string().max(80).optional(),
33
+ });
34
+ const ReleaseBody = z.object({
35
+ sessionId: z.string().min(1).max(128),
36
+ fencingToken: z.string().min(1).max(256),
37
+ });
38
+ const HeartbeatBody = ReleaseBody;
39
+ const ForceTakeBody = z.object({
40
+ topicId: TopicIdSchema,
41
+ mode: ModeSchema,
42
+ bySessionId: z.string().min(1).max(128),
43
+ pid: z.number().int().positive(),
44
+ processStartTime: z.number().int().nonnegative().optional(),
45
+ reason: z.string().max(500).optional(),
46
+ });
47
+ const PreflightBody = z.object({
48
+ cwd: z.string().min(1).max(4096),
49
+ fencingToken: z.string().min(1).max(256),
50
+ stagedFiles: z.array(z.string().max(4096)).max(10_000).optional(),
51
+ });
52
+ const SignTrailerBody = z.object({
53
+ sessionId: z.string().min(1).max(128),
54
+ fencingToken: z.string().min(1).max(256),
55
+ treeHash: z.string().regex(/^[0-9a-f]{40,64}$/),
56
+ parents: z.array(z.string().regex(/^[0-9a-f]{40,64}$|^0{40}$/)).max(8),
57
+ });
58
+ const VerifyNonceBody = z.object({
59
+ commitSha: z.string().regex(/^[0-9a-f]{40,64}$/),
60
+ nonce: z.string().min(1).max(256),
61
+ binding: z.object({
62
+ topicId: TopicIdSchema,
63
+ sessionId: z.string().min(1).max(128),
64
+ }),
65
+ treeHash: z.string().regex(/^[0-9a-f]{40,64}$/),
66
+ parents: z.array(z.string().regex(/^[0-9a-f]{40,64}$|^0{40}$/)).max(8),
67
+ });
68
+ function makeRateLimiter(maxPerMinute) {
69
+ const buckets = new Map();
70
+ return function check(key) {
71
+ const now = Date.now();
72
+ let e = buckets.get(key);
73
+ if (!e || e.resetAt < now) {
74
+ e = { count: 0, resetAt: now + 60_000 };
75
+ buckets.set(key, e);
76
+ }
77
+ e.count++;
78
+ return e.count <= maxPerMinute;
79
+ };
80
+ }
81
+ // ── Auth-required route factory ──────────────────────────────────────
82
+ export function createWorktreeRoutes(deps) {
83
+ const router = Router();
84
+ const { worktreeManager: wm } = deps;
85
+ router.post('/worktrees/resolve', async (req, res) => {
86
+ const parsed = ResolveBody.safeParse(req.body);
87
+ if (!parsed.success)
88
+ return res.status(400).json({ error: 'invalid request', issues: parsed.error.issues });
89
+ try {
90
+ const result = await wm.resolve({
91
+ topicId: parsed.data.topicId,
92
+ mode: parsed.data.mode,
93
+ sessionId: parsed.data.sessionId,
94
+ pid: parsed.data.pid,
95
+ processStartTime: parsed.data.processStartTime ?? Math.floor(Date.now() / 1000),
96
+ slug: parsed.data.slug,
97
+ });
98
+ return res.json(result);
99
+ }
100
+ catch (err) {
101
+ if (err.code === 'LOCK_HELD') {
102
+ return res.status(409).json({ error: 'LockHeld', holder: err.holder });
103
+ }
104
+ return res.status(500).json({ error: err.message ?? 'unknown' });
105
+ }
106
+ });
107
+ router.post('/worktrees/release', (req, res) => {
108
+ const parsed = ReleaseBody.safeParse(req.body);
109
+ if (!parsed.success)
110
+ return res.status(400).json({ error: 'invalid request' });
111
+ const result = wm.release(parsed.data);
112
+ return res.json(result);
113
+ });
114
+ router.post('/worktrees/heartbeat', (req, res) => {
115
+ const parsed = HeartbeatBody.safeParse(req.body);
116
+ if (!parsed.success)
117
+ return res.status(400).json({ error: 'invalid request' });
118
+ const result = wm.heartbeat(parsed.data);
119
+ return res.json(result);
120
+ });
121
+ router.post('/worktrees/force-take', async (req, res) => {
122
+ const parsed = ForceTakeBody.safeParse(req.body);
123
+ if (!parsed.success)
124
+ return res.status(400).json({ error: 'invalid request' });
125
+ try {
126
+ const result = await wm.forceTake({
127
+ topicId: parsed.data.topicId,
128
+ mode: parsed.data.mode,
129
+ bySessionId: parsed.data.bySessionId,
130
+ pid: parsed.data.pid,
131
+ processStartTime: parsed.data.processStartTime ?? Math.floor(Date.now() / 1000),
132
+ });
133
+ return res.json(result);
134
+ }
135
+ catch (err) {
136
+ return res.status(500).json({ error: err.message ?? 'unknown' });
137
+ }
138
+ });
139
+ router.get('/worktrees', (_req, res) => {
140
+ res.json({ bindings: wm.listBindings() });
141
+ });
142
+ router.get('/worktrees/reconcile', (_req, res) => {
143
+ try {
144
+ const rows = wm.reconcile();
145
+ res.json({ rows });
146
+ }
147
+ catch (err) {
148
+ res.status(500).json({ error: err.message });
149
+ }
150
+ });
151
+ // ── Pre-commit gate ──────────────────────────────────────────────
152
+ router.post('/commits/preflight', (req, res) => {
153
+ const parsed = PreflightBody.safeParse(req.body);
154
+ if (!parsed.success)
155
+ return res.status(400).json({ error: 'invalid request' });
156
+ // Find binding whose worktreePath is a prefix of cwd
157
+ const bindings = wm.listBindings();
158
+ const cwdReal = (() => {
159
+ try {
160
+ return fs.realpathSync(parsed.data.cwd);
161
+ }
162
+ catch {
163
+ return parsed.data.cwd;
164
+ }
165
+ })();
166
+ const binding = bindings.find(b => {
167
+ try {
168
+ const bReal = fs.realpathSync(b.worktreePath);
169
+ return cwdReal === bReal || cwdReal.startsWith(bReal + path.sep);
170
+ }
171
+ catch {
172
+ return false;
173
+ }
174
+ });
175
+ if (!binding) {
176
+ return res.json({ ok: false, code: 'cwd-not-in-binding', message: 'commit cwd is not a registered worktree' });
177
+ }
178
+ const lock = wm.getLock(binding.worktreePath);
179
+ if (!lock) {
180
+ return res.json({ ok: false, code: 'no-lock', message: 'no active lock on this worktree' });
181
+ }
182
+ if (lock.fencingToken !== parsed.data.fencingToken) {
183
+ return res.json({ ok: false, code: 'fencing-token-mismatch', message: 'session fencing token superseded' });
184
+ }
185
+ if (binding.mode === 'read-only') {
186
+ return res.json({ ok: false, code: 'read-only', message: 'read-only worktree; commits blocked' });
187
+ }
188
+ return res.json({ ok: true, binding });
189
+ });
190
+ // ── commit-msg trailer issuance ──────────────────────────────────
191
+ router.post('/commits/sign-trailer', (req, res) => {
192
+ const parsed = SignTrailerBody.safeParse(req.body);
193
+ if (!parsed.success)
194
+ return res.status(400).json({ error: 'invalid request' });
195
+ try {
196
+ const result = wm.signTrailer(parsed.data);
197
+ return res.json(result);
198
+ }
199
+ catch (err) {
200
+ return res.status(403).json({ error: err.message });
201
+ }
202
+ });
203
+ return router;
204
+ }
205
+ export function createOidcWorktreeRoutes(deps) {
206
+ const router = Router();
207
+ const { worktreeManager: wm, oidc } = deps;
208
+ const rateCheck = makeRateLimiter(60);
209
+ router.post('/gh-check/verify-nonce', async (req, res) => {
210
+ // Uniform response shape for oracle protection
211
+ const denyUniform = (status = 200) => res.status(status).json({ verifier_says_no: true });
212
+ const auth = req.header('authorization') ?? '';
213
+ const m = auth.match(/^Bearer (.+)$/);
214
+ if (!m)
215
+ return denyUniform(401);
216
+ const token = m[1];
217
+ let claims;
218
+ try {
219
+ claims = await oidc.verifyOidcToken(token);
220
+ }
221
+ catch {
222
+ return denyUniform(401);
223
+ }
224
+ const [owner, repo] = (claims.repository ?? '').split('/');
225
+ if (!owner || !repo)
226
+ return denyUniform(401);
227
+ const allowed = oidc.enrolledRepos.some(r => r.owner === owner && r.repo === repo);
228
+ if (!allowed)
229
+ return denyUniform(403);
230
+ if (!rateCheck(claims.repository)) {
231
+ return res.status(429).json({ verifier_says_no: true, retry_after_seconds: 60 });
232
+ }
233
+ const parsed = VerifyNonceBody.safeParse(req.body);
234
+ if (!parsed.success)
235
+ return denyUniform();
236
+ // Idempotent nonce check
237
+ const status = wm.checkNonceUnique({ nonce: parsed.data.nonce, commitSha: parsed.data.commitSha });
238
+ if (status === 'seen-for-different-commit')
239
+ return denyUniform();
240
+ if (status === 'unseen') {
241
+ wm.recordCommitForNonce({ nonce: parsed.data.nonce, commitSha: parsed.data.commitSha });
242
+ }
243
+ return res.json({ verifier_says_yes: true });
244
+ });
245
+ return router;
246
+ }
247
+ //# sourceMappingURL=worktreeRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktreeRoutes.js","sourceRoot":"","sources":["../../src/server/worktreeRoutes.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "instar",
3
- "version": "0.28.52",
3
+ "version": "0.28.53",
4
4
  "description": "Persistent autonomy infrastructure for AI agents",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",