instar 1.3.209 → 1.3.211

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.
@@ -57,11 +57,19 @@ import json
57
57
  with open('.claude/settings.json') as f:
58
58
  s = json.load(f)
59
59
  hooks = s.setdefault('hooks', {}).setdefault('Stop', [])
60
- if not any('autonomous-stop-hook' in str(h) for h in hooks):
61
- hooks.append({'matcher': '', 'hooks': [{'type': 'command', 'command': 'bash .instar/hooks/instar/autonomous-stop-hook.sh', 'timeout': 10000}]})
60
+ # The stop hook ships ONLY in the skill dir — register THAT path. (A legacy bug
61
+ # registered '.instar/hooks/instar/autonomous-stop-hook.sh', where the file is
62
+ # never deployed, so the hook silently failed every Stop and the loop never
63
+ # re-engaged.) Self-heal: drop any prior autonomous-stop-hook entry (incl. the
64
+ # legacy wrong path), then add exactly one correct-path entry.
65
+ correct = 'bash \${CLAUDE_PROJECT_DIR}/.claude/skills/autonomous/hooks/autonomous-stop-hook.sh'
66
+ before = json.dumps(hooks)
67
+ hooks[:] = [e for e in hooks if not any('autonomous-stop-hook' in str(h.get('command','')) for h in e.get('hooks', []))]
68
+ hooks.append({'matcher': '', 'hooks': [{'type': 'command', 'command': correct, 'timeout': 10000}]})
69
+ if json.dumps(hooks) != before:
62
70
  with open('.claude/settings.json', 'w') as f:
63
71
  json.dump(s, f, indent=2)
64
- print('Stop hook registered')
72
+ print('Stop hook registered (correct skill path)')
65
73
  "
66
74
  ```
67
75
 
@@ -39,6 +39,14 @@ export interface FeatureMetricsRecorder {
39
39
  latencyMs?: number;
40
40
  waited?: boolean;
41
41
  waitMs?: number;
42
+ /**
43
+ * Per-call token usage (Iris-audit item 1). Surfaced by the underlying
44
+ * provider via IntelligenceOptions.onUsage and forwarded here so
45
+ * /metrics/features reports real cost instead of always-0. The ledger
46
+ * stores null when omitted (e.g. the circuit was open and no call ran).
47
+ */
48
+ tokensIn?: number;
49
+ tokensOut?: number;
42
50
  }): void;
43
51
  }
44
52
  export declare function setFeatureMetricsRecorder(recorder: FeatureMetricsRecorder | null): void;
@@ -1 +1 @@
1
- {"version":3,"file":"CircuitBreakingIntelligenceProvider.d.ts","sourceRoot":"","sources":["../../src/core/CircuitBreakingIntelligenceProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EACL,iBAAiB,EAKlB,MAAM,wBAAwB,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,KAAK,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;QACvB,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;QACpC,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,IAAI,CAAC;CACV;AAOD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,GAAG,IAAI,CAEvF;AACD,wBAAgB,yBAAyB,IAAI,sBAAsB,GAAG,IAAI,CAEzE;AAED,qBAAa,mCAAoC,YAAW,oBAAoB;IAE5E,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,KAAK,EAAE,oBAAoB,EAC3B,OAAO,GAAE,iBAA0C;IAGtE;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAgBd,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;CA8C/E;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,GAChD,oBAAoB,GAAG,IAAI,CAI7B"}
1
+ {"version":3,"file":"CircuitBreakingIntelligenceProvider.d.ts","sourceRoot":"","sources":["../../src/core/CircuitBreakingIntelligenceProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EACL,iBAAiB,EAKlB,MAAM,wBAAwB,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,KAAK,EAAE;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC;QACvB,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;QACpC,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB;;;;;WAKG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;CACV;AAOD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,GAAG,IAAI,CAEvF;AACD,wBAAgB,yBAAyB,IAAI,sBAAsB,GAAG,IAAI,CAEzE;AAED,qBAAa,mCAAoC,YAAW,oBAAoB;IAE5E,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,KAAK,EAAE,oBAAoB,EAC3B,OAAO,GAAE,iBAA0C;IAGtE;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAsBd,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;CA6D/E;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,GAChD,oBAAoB,GAAG,IAAI,CAI7B"}
@@ -49,12 +49,16 @@ export class CircuitBreakingIntelligenceProvider {
49
49
  * outcome here is funnel-level: 'noop' = the call completed (the fired-vs-noop
50
50
  * VERDICT is the caller's interpretation → Phase 2); 'error' = it failed.
51
51
  */
52
- recordMetric(feature, outcome, latencyMs, waited, waitMs) {
52
+ recordMetric(feature, outcome, latencyMs, waited, waitMs, tokensIn, tokensOut) {
53
53
  const rec = _featureMetricsRecorder;
54
54
  if (!rec)
55
55
  return;
56
56
  try {
57
- rec.record({ feature, kind: 'llm', outcome, latencyMs, waited, waitMs: waited ? waitMs : undefined });
57
+ rec.record({
58
+ feature, kind: 'llm', outcome, latencyMs,
59
+ waited, waitMs: waited ? waitMs : undefined,
60
+ tokensIn, tokensOut,
61
+ });
58
62
  }
59
63
  catch {
60
64
  /* never break the LLM path on a metrics write */
@@ -83,9 +87,21 @@ export class CircuitBreakingIntelligenceProvider {
83
87
  }
84
88
  }
85
89
  try {
86
- const result = await this.inner.evaluate(prompt, options);
90
+ // Capture token usage the underlying provider surfaces, composing with
91
+ // any caller-supplied onUsage so we don't clobber it. This is the only
92
+ // path token cost reaches the metrics ledger (Iris-audit item 1).
93
+ let usage;
94
+ const callerOnUsage = options?.onUsage;
95
+ const innerOptions = {
96
+ ...(options ?? {}),
97
+ onUsage: (u) => {
98
+ usage = u;
99
+ callerOnUsage?.(u);
100
+ },
101
+ };
102
+ const result = await this.inner.evaluate(prompt, innerOptions);
87
103
  this.breaker.onResolved();
88
- this.recordMetric(feature, 'noop', Date.now() - startedAt, waited, options?.rateLimitWaitMs);
104
+ this.recordMetric(feature, 'noop', Date.now() - startedAt, waited, options?.rateLimitWaitMs, usage?.inputTokens, usage?.outputTokens);
89
105
  return result;
90
106
  }
91
107
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"CircuitBreakingIntelligenceProvider.js","sourceRoot":"","sources":["../../src/core/CircuitBreakingIntelligenceProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CircuitBreakingIntelligenceProvider.js","sourceRoot":"","sources":["../../src/core/CircuitBreakingIntelligenceProvider.ts"],"names":[],"mappings":"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"}
@@ -14,4 +14,23 @@ export declare class ClaudeCliIntelligenceProvider implements IntelligenceProvid
14
14
  constructor(claudePath: string);
15
15
  evaluate(prompt: string, options?: IntelligenceOptions): Promise<string>;
16
16
  }
17
+ /**
18
+ * Parse `claude -p --output-format json` stdout into the response text, and
19
+ * surface token usage via onUsage. The CLI emits a single JSON object shaped
20
+ * `{ result: string, usage: { input_tokens, cache_creation_input_tokens,
21
+ * cache_read_input_tokens, output_tokens, ... }, ... }`.
22
+ *
23
+ * Defensive by design — usage observability must never break the LLM path:
24
+ * - If stdout isn't valid JSON, or has no string `result`, fall back to the
25
+ * raw trimmed stdout (degraded, but non-crashing — same shape as the old
26
+ * text path would have produced).
27
+ * - tokensIn sums the input components actually processed (fresh + cache
28
+ * creation + cache read), since each is a real cost; tokensOut is
29
+ * output_tokens. Missing fields count as 0. onUsage fires only when at least
30
+ * one token count is present, and never throws into the caller.
31
+ */
32
+ export declare function parseJsonResult(stdout: string, onUsage?: (usage: {
33
+ inputTokens: number;
34
+ outputTokens: number;
35
+ }) => void): string;
17
36
  //# sourceMappingURL=ClaudeCliIntelligenceProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeCliIntelligenceProvider.d.ts","sourceRoot":"","sources":["../../src/core/ClaudeCliIntelligenceProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAO5E,qBAAa,6BAA8B,YAAW,oBAAoB;IACxE,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAYxB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;CA+C/E"}
1
+ {"version":3,"file":"ClaudeCliIntelligenceProvider.d.ts","sourceRoot":"","sources":["../../src/core/ClaudeCliIntelligenceProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAO5E,qBAAa,6BAA8B,YAAW,oBAAoB;IACxE,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAYxB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;CAqD/E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,GACvE,MAAM,CA6BR"}
@@ -33,7 +33,12 @@ export class ClaudeCliIntelligenceProvider {
33
33
  '-p', prompt,
34
34
  '--model', model,
35
35
  '--max-turns', '1',
36
- '--output-format', 'text',
36
+ // JSON (not text) so the response carries a `usage` block. We extract the
37
+ // answer from `.result` and surface token counts via options.onUsage —
38
+ // the only way per-feature token cost reaches /metrics/features (the tap
39
+ // had no usage to record under text output, so it always logged 0).
40
+ // Iris-audit item 1, spec iris-audit-session-observability.md.
41
+ '--output-format', 'json',
37
42
  // Exclude project/local CLAUDE.md to prevent identity context
38
43
  // from contaminating classification and evaluation prompts.
39
44
  '--setting-sources', 'user',
@@ -58,15 +63,62 @@ export class ClaudeCliIntelligenceProvider {
58
63
  // Timeout or other error — reject so caller can fall back. Include a
59
64
  // generous stderr slice so the circuit breaker's rate-limit
60
65
  // classifier (isRateLimitError) can see usage/limit language that
61
- // often appears past the first 200 chars.
66
+ // often appears past the first 200 chars. (Rate-limit detection reads
67
+ // stderr, so the stdout text→json switch does not affect it.)
62
68
  reject(new Error(`Claude CLI error: ${error.message}${stderr ? ` — ${stderr.slice(0, 600)}` : ''}`));
63
69
  return;
64
70
  }
65
- resolve(stdout.trim());
71
+ resolve(parseJsonResult(stdout, options?.onUsage));
66
72
  });
67
73
  // Write prompt via stdin for very long prompts (belt and suspenders)
68
74
  child.stdin?.end();
69
75
  });
70
76
  }
71
77
  }
78
+ /**
79
+ * Parse `claude -p --output-format json` stdout into the response text, and
80
+ * surface token usage via onUsage. The CLI emits a single JSON object shaped
81
+ * `{ result: string, usage: { input_tokens, cache_creation_input_tokens,
82
+ * cache_read_input_tokens, output_tokens, ... }, ... }`.
83
+ *
84
+ * Defensive by design — usage observability must never break the LLM path:
85
+ * - If stdout isn't valid JSON, or has no string `result`, fall back to the
86
+ * raw trimmed stdout (degraded, but non-crashing — same shape as the old
87
+ * text path would have produced).
88
+ * - tokensIn sums the input components actually processed (fresh + cache
89
+ * creation + cache read), since each is a real cost; tokensOut is
90
+ * output_tokens. Missing fields count as 0. onUsage fires only when at least
91
+ * one token count is present, and never throws into the caller.
92
+ */
93
+ export function parseJsonResult(stdout, onUsage) {
94
+ const trimmed = stdout.trim();
95
+ let parsed;
96
+ try {
97
+ parsed = JSON.parse(trimmed);
98
+ }
99
+ catch {
100
+ // Not JSON (truncated / unexpected) — return raw text, no usage.
101
+ return trimmed;
102
+ }
103
+ const obj = (parsed && typeof parsed === 'object') ? parsed : null;
104
+ if (onUsage && obj && obj.usage && typeof obj.usage === 'object') {
105
+ try {
106
+ const u = obj.usage;
107
+ const num = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : 0);
108
+ const inputTokens = num(u.input_tokens) + num(u.cache_creation_input_tokens) + num(u.cache_read_input_tokens);
109
+ const outputTokens = num(u.output_tokens);
110
+ if (inputTokens > 0 || outputTokens > 0) {
111
+ onUsage({ inputTokens, outputTokens });
112
+ }
113
+ }
114
+ catch {
115
+ /* usage extraction must never break the result path */
116
+ }
117
+ }
118
+ if (obj && typeof obj.result === 'string') {
119
+ return obj.result.trim();
120
+ }
121
+ // Valid JSON but no string result — best effort, return raw.
122
+ return trimmed;
123
+ }
72
124
  //# sourceMappingURL=ClaudeCliIntelligenceProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeCliIntelligenceProvider.js","sourceRoot":"","sources":["../../src/core/ClaudeCliIntelligenceProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,MAAM,aAAa,GAAG,MAAM,CAAC;AAC7B,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,MAAM,OAAO,6BAA6B;IAChC,UAAU,CAAS;IAE3B,YAAY,UAAkB;QAC5B,wEAAwE;QACxE,mEAAmE;QACnE,oEAAoE;QACpE,qEAAqE;QACrE,mEAAmE;QACnE,wEAAwE;QACxE,yDAAyD;QACzD,mBAAmB,CAAC,+BAA+B,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,OAA6B;QAC1D,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,IAAI,aAAa,CAAC,CAAC;QAE9D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG;gBACX,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,KAAK;gBAChB,aAAa,EAAE,GAAG;gBAClB,iBAAiB,EAAE,MAAM;gBACzB,8DAA8D;gBAC9D,4DAA4D;gBAC5D,mBAAmB,EAAE,MAAM;aAC5B,CAAC;YAEF,uEAAuE;YACvE,4EAA4E;YAC5E,0EAA0E;YAC1E,yEAAyE;YACzE,MAAM,QAAQ,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YACpC,OAAO,QAAQ,CAAC,UAAU,CAAC;YAC3B,OAAO,QAAQ,CAAC,iBAAiB,CAAC;YAElC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE;gBAC5C,2EAA2E;gBAC3E,2EAA2E;gBAC3E,qEAAqE;gBACrE,8DAA8D;gBAC9D,OAAO,EAAE,OAAO,EAAE,SAAS,IAAI,kBAAkB;gBACjD,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE,MAAM;gBAC9B,GAAG,EAAE,QAAQ;aACd,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBAC3B,IAAI,KAAK,EAAE,CAAC;oBACV,qEAAqE;oBACrE,4DAA4D;oBAC5D,kEAAkE;oBAClE,0CAA0C;oBAC1C,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBACrG,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACzB,CAAC,CAAC,CAAC;YAEH,qEAAqE;YACrE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"ClaudeCliIntelligenceProvider.js","sourceRoot":"","sources":["../../src/core/ClaudeCliIntelligenceProvider.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PostUpdateMigrator.d.ts","sourceRoot":"","sources":["../../src/core/PostUpdateMigrator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAsCH,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AAIjC,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAiB;IAC/B;;;;;;OAMG;IACH,OAAO,CAAC,UAAU,CAAiC;gBAEvC,MAAM,EAAE,cAAc;IAIlC;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,oBAAoB;IA0B5B;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAItC;;;;;;OAMG;IACG,eAAe,CACnB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,qBAAqB,CAAC;IAIjC,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,kBAAkB;IAO1B;;;;OAIG;IACH,OAAO,CAAC,YAAY;IASpB;;;OAGG;IACH,OAAO,IAAI,eAAe;IA+C1B;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,0BAA0B;IAmFlC,OAAO,CAAC,0BAA0B;IAmDlC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kCAAkC;IAwH1C;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,kCAAkC;IA8C1C,OAAO,CAAC,uBAAuB;IAwE/B,OAAO,CAAC,4CAA4C;IA+CpD;;;;;;;OAOG;IACH,OAAO,CAAC,iCAAiC;IA0BzC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,oCAAoC;IAmB5C,OAAO,CAAC,yBAAyB;IA6FjC;;;;;;;;;;OAUG;IACG,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC;YA4BhC,uBAAuB;IAkGrC,OAAO,CAAC,0BAA0B;IAkGlC,OAAO,CAAC,0BAA0B;IAkElC,OAAO,CAAC,oBAAoB;IA4G5B,OAAO,CAAC,8BAA8B;IA2EtC;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,0BAA0B;IA8BlC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,4BAA4B;IAwBpC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,sBAAsB;IAwB9B;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,mCAAmC;IAwD3C;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;IA2B1B;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,OAAO,CAAC,yBAAyB;IA4HjC;6EACyE;IACzE,OAAO,CAAC,wBAAwB;IAShC;sDACkD;IAClD,OAAO,CAAC,wBAAwB;IAQhC;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAkPpB;;;;;;;;OAQG;IACH,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IA6CvE;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAkEzB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAkChC;;;;;;;;;OASG;IACH,OAAO,CAAC,wBAAwB;IAoEhC;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAiE5B;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B;IA8BnC;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAiHhC;;;;;;OAMG;IACH,OAAO,CAAC,8BAA8B;IAwDtC,OAAO,CAAC,0BAA0B;IA8DlC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAgyCvB;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,OAAO,CAAC,kCAAkC;IAoG1C;;;OAGG;IACH,OAAO,CAAC,cAAc;IA6JtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,OAAO,CAAC,yCAAyC;IAyDjD;;;OAGG;IACH,OAAO,CAAC,eAAe;IA0SvB;;;OAGG;IACH,OAAO,CAAC,aAAa;IAqFrB;;;OAGG;IACH;;;OAGG;IACH;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,wBAAwB;IAmEhC;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,6BAA6B;IAwDrC;;;;;;;;;OASG;IACH,OAAO,CAAC,yBAAyB;IAsDjC,OAAO,CAAC,wBAAwB;IAqChC,OAAO,CAAC,gBAAgB;IAiBxB;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,OAAO,CAAC,qBAAqB;IAkE7B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,0BAA0B;IAgDlC;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAkC5B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kBAAkB;IA2C1B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA+BzB,OAAO,CAAC,oBAAoB;IAgC5B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAyBrB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqC9B;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,eAAe,GAAG,wBAAwB,GAAG,qBAAqB,GAAG,yBAAyB,GAAG,mBAAmB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,wBAAwB,GAAG,8BAA8B,GAAG,2BAA2B,GAAG,4BAA4B,GAAG,iBAAiB,GAAG,0BAA0B,GAAG,wBAAwB,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,0BAA0B,GAAG,uBAAuB,GAAG,iBAAiB,GAAG,MAAM;IAwBnf,oFAAoF;IACpF,iCAAiC,IAAI,MAAM;IAI3C,6EAA6E;IAC7E,yBAAyB,IAAI,MAAM;IAInC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,2BAA2B;IAmFnC,OAAO,CAAC,mBAAmB;IAob3B,OAAO,CAAC,wBAAwB;IAqIhC,OAAO,CAAC,2BAA2B;IAoEnC,OAAO,CAAC,yBAAyB;IA8IjC,OAAO,CAAC,2BAA2B;IA0JnC,OAAO,CAAC,qBAAqB;IA4P7B,OAAO,CAAC,uBAAuB;IAqJ/B,OAAO,CAAC,oBAAoB;IAgG5B,OAAO,CAAC,qBAAqB;IA8H7B,OAAO,CAAC,2BAA2B;IAoHnC,OAAO,CAAC,iCAAiC;IA6DzC,OAAO,CAAC,4BAA4B;IA0MpC;;;;;;;;;;OAUG;IACH;;;;;;;;;;;OAWG;IAEH,gBAAuB,iCAAiC,EAAE,WAAW,CAAC,MAAM,CAAC,CA4B1E;IAEH;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,8BAA8B;IAiHtC,OAAO,CAAC,uBAAuB;IAwC/B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,sBAAsB;IAwC9B,OAAO,CAAC,iBAAiB;IAwBzB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,8BAA8B;IA6HtC,OAAO,CAAC,+BAA+B;IAuKvC,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,qBAAqB;IAqO7B,OAAO,CAAC,qBAAqB;IAwI7B,OAAO,CAAC,qBAAqB;IAyN7B,OAAO,CAAC,6BAA6B;IAkLrC,OAAO,CAAC,0BAA0B;IAgClC,OAAO,CAAC,gBAAgB;IAmJxB,OAAO,CAAC,6BAA6B;CAoCtC"}
1
+ {"version":3,"file":"PostUpdateMigrator.d.ts","sourceRoot":"","sources":["../../src/core/PostUpdateMigrator.ts"],"names":[],"mappings":"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"}
@@ -1475,6 +1475,16 @@ export class PostUpdateMigrator {
1475
1475
  // (which carry `native-goal/set` but not `IS_CODEX_AGENT`); customized scripts (no stock
1476
1476
  // `autonomous-state.local.md` fingerprint) are still left untouched.
1477
1477
  upgrade('.claude/skills/autonomous/scripts/setup-autonomous.sh', 'IS_CODEX_AGENT', 'autonomous-state.local.md', 'skills/autonomous/scripts/setup-autonomous.sh (codex native /goal auto-wire)');
1478
+ // SKILL.md Step 2a registration-path fix: the prior bundled SKILL.md registered the
1479
+ // stop hook at `.instar/hooks/instar/autonomous-stop-hook.sh` (a path where the hook is
1480
+ // never deployed → silent Stop-hook failure → the autonomous loop never re-engaged and
1481
+ // the session went idle). The fixed SKILL.md registers the deployed skill path and
1482
+ // self-heals any stale entry. Marker `Stop hook registered (correct skill path)` is
1483
+ // present ONLY in the fixed version (the old printed plain `Stop hook registered`), so
1484
+ // bumping to it re-deploys the corrected prompt to existing agents; customized SKILL.md
1485
+ // files (missing the stock `ALL_TASKS_COMPLETE` fingerprint) are left untouched. Pairs
1486
+ // with the settings.json wrong-path repair in ensureAutonomousStopHook().
1487
+ upgrade('.claude/skills/autonomous/SKILL.md', 'Stop hook registered (correct skill path)', 'ALL_TASKS_COMPLETE', 'skills/autonomous/SKILL.md (autonomous stop-hook registration path fix — loop re-engages)');
1478
1488
  }
1479
1489
  /**
1480
1490
  * Deploy any missing built-in skills (e.g., guardian job skills added after initial setup).
@@ -2341,6 +2351,26 @@ export class PostUpdateMigrator {
2341
2351
  hooks.Stop = [];
2342
2352
  }
2343
2353
  const stopEntries = hooks.Stop;
2354
+ // Repair the legacy wrong-path registration. A prior autonomous SKILL.md Step 2a
2355
+ // registered the stop hook at `.instar/hooks/instar/autonomous-stop-hook.sh` — a
2356
+ // path where the hook is NEVER deployed (it ships only in the skill dir). That
2357
+ // dead reference fails silently on every Stop, so the autonomous loop never
2358
+ // re-injects and the session goes idle (the "I stopped self-driving" bug). The
2359
+ // `hasAutonomousHook` check below treats any autonomous-stop-hook entry as
2360
+ // "present", so without this repair a wrong-path entry blocks the correct
2361
+ // registration forever. Rewrite any such command to the deployed skill path.
2362
+ const correctStopHookCmd = 'bash ${CLAUDE_PROJECT_DIR}/.claude/skills/autonomous/hooks/autonomous-stop-hook.sh';
2363
+ for (const e of stopEntries) {
2364
+ for (const h of e.hooks ?? []) {
2365
+ if (h.command?.includes('autonomous-stop-hook') &&
2366
+ h.command.includes('.instar/hooks/instar/autonomous-stop-hook') &&
2367
+ h.command !== correctStopHookCmd) {
2368
+ h.command = correctStopHookCmd;
2369
+ result.upgraded.push('.claude/settings.json: repaired autonomous stop-hook path (.instar/hooks/instar → skill dir; loop never re-engaged)');
2370
+ patched = true;
2371
+ }
2372
+ }
2373
+ }
2344
2374
  const hasAutonomousHook = stopEntries.some(e => e.hooks?.some(h => h.command?.includes('autonomous-stop-hook')));
2345
2375
  if (!hasAutonomousHook) {
2346
2376
  // Keep stop-gate-router first when present so shadow telemetry sees every