pi-daddy 0.41.1 → 0.43.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 (133) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/contracts/ledger-record/v1/fixtures/capability-decision.json +3 -1
  3. package/contracts/ledger-record/v1/fixtures/child-lifecycle.json +25 -0
  4. package/contracts/ledger-record/v1/fixtures/episode-cost-gate.json +14 -0
  5. package/contracts/ledger-record/v1/fixtures/episode-outcome.json +12 -0
  6. package/contracts/ledger-record/v1/fixtures/ledger-record.jsonl +6 -3
  7. package/contracts/ledger-record/v1/fixtures/session-config.json +14 -0
  8. package/contracts/ledger-record/v1/governance-event.schema.json +356 -0
  9. package/dist/advisors/advisor.d.ts +24 -1
  10. package/dist/advisors/advisor.d.ts.map +1 -1
  11. package/dist/advisors/advisor.js +19 -1
  12. package/dist/advisors/advisor.js.map +1 -1
  13. package/dist/advisors/decider.d.ts +11 -0
  14. package/dist/advisors/decider.d.ts.map +1 -1
  15. package/dist/advisors/decider.js.map +1 -1
  16. package/dist/advisors/jev.d.ts.map +1 -1
  17. package/dist/advisors/jev.js +32 -1
  18. package/dist/advisors/jev.js.map +1 -1
  19. package/dist/cli.d.ts +7 -1
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +87 -1
  22. package/dist/cli.js.map +1 -1
  23. package/dist/executors/activity-session.d.ts +13 -0
  24. package/dist/executors/activity-session.d.ts.map +1 -1
  25. package/dist/executors/activity-session.js +44 -2
  26. package/dist/executors/activity-session.js.map +1 -1
  27. package/dist/governance/episode-cost-gate.d.ts +31 -0
  28. package/dist/governance/episode-cost-gate.d.ts.map +1 -0
  29. package/dist/governance/episode-cost-gate.js +112 -0
  30. package/dist/governance/episode-cost-gate.js.map +1 -0
  31. package/dist/governance/ledger-events.d.ts +108 -1
  32. package/dist/governance/ledger-events.d.ts.map +1 -1
  33. package/dist/governance/ledger-events.js +64 -0
  34. package/dist/governance/ledger-events.js.map +1 -1
  35. package/dist/governance/ledger-v3-validation.d.ts.map +1 -1
  36. package/dist/governance/ledger-v3-validation.js +124 -0
  37. package/dist/governance/ledger-v3-validation.js.map +1 -1
  38. package/dist/governance/ledger.d.ts +8 -2
  39. package/dist/governance/ledger.d.ts.map +1 -1
  40. package/dist/governance/ledger.js +18 -2
  41. package/dist/governance/ledger.js.map +1 -1
  42. package/dist/kernel/definitions.d.ts +5 -0
  43. package/dist/kernel/definitions.d.ts.map +1 -1
  44. package/dist/kernel/definitions.js +30 -1
  45. package/dist/kernel/definitions.js.map +1 -1
  46. package/dist/kernel/delegate-types.d.ts +4 -0
  47. package/dist/kernel/delegate-types.d.ts.map +1 -1
  48. package/dist/kernel/delegate-types.js.map +1 -1
  49. package/dist/kernel/delegate.d.ts.map +1 -1
  50. package/dist/kernel/delegate.js +20 -5
  51. package/dist/kernel/delegate.js.map +1 -1
  52. package/dist/kernel/env-names.d.ts +5 -0
  53. package/dist/kernel/env-names.d.ts.map +1 -1
  54. package/dist/kernel/env-names.js +9 -0
  55. package/dist/kernel/env-names.js.map +1 -1
  56. package/dist/kernel/grant-env.d.ts +2 -0
  57. package/dist/kernel/grant-env.d.ts.map +1 -1
  58. package/dist/kernel/grant-env.js +1 -0
  59. package/dist/kernel/grant-env.js.map +1 -1
  60. package/dist/kernel/propagation.d.ts +2 -2
  61. package/dist/kernel/propagation.d.ts.map +1 -1
  62. package/dist/kernel/propagation.js +7 -2
  63. package/dist/kernel/propagation.js.map +1 -1
  64. package/dist/products/dashboard-cli.d.ts +4 -0
  65. package/dist/products/dashboard-cli.d.ts.map +1 -1
  66. package/dist/products/dashboard-cli.js +32 -4
  67. package/dist/products/dashboard-cli.js.map +1 -1
  68. package/dist/products/dashboard-handshake.d.ts +8 -0
  69. package/dist/products/dashboard-handshake.d.ts.map +1 -1
  70. package/dist/products/dashboard-handshake.js +3 -0
  71. package/dist/products/dashboard-handshake.js.map +1 -1
  72. package/dist/products/dashboard-herdr.d.ts +4 -0
  73. package/dist/products/dashboard-herdr.d.ts.map +1 -1
  74. package/dist/products/dashboard-herdr.js +10 -2
  75. package/dist/products/dashboard-herdr.js.map +1 -1
  76. package/dist/products/dashboard-projection.d.ts.map +1 -1
  77. package/dist/products/dashboard-projection.js +13 -6
  78. package/dist/products/dashboard-projection.js.map +1 -1
  79. package/dist/products/dashboard-render.d.ts +10 -0
  80. package/dist/products/dashboard-render.d.ts.map +1 -1
  81. package/dist/products/dashboard-render.js +9 -0
  82. package/dist/products/dashboard-render.js.map +1 -1
  83. package/dist/products/dashboard-session-client.d.ts +17 -0
  84. package/dist/products/dashboard-session-client.d.ts.map +1 -0
  85. package/dist/products/dashboard-session-client.js +28 -0
  86. package/dist/products/dashboard-session-client.js.map +1 -0
  87. package/dist/products/episode-outcomes.d.ts +32 -0
  88. package/dist/products/episode-outcomes.d.ts.map +1 -0
  89. package/dist/products/episode-outcomes.js +280 -0
  90. package/dist/products/episode-outcomes.js.map +1 -0
  91. package/dist/products/episode-report.d.ts +59 -0
  92. package/dist/products/episode-report.d.ts.map +1 -0
  93. package/dist/products/episode-report.js +311 -0
  94. package/dist/products/episode-report.js.map +1 -0
  95. package/extensions/chain-ledger.ts +2 -0
  96. package/extensions/chain-plan.ts +4 -2
  97. package/extensions/dashboard-session-server.ts +86 -0
  98. package/extensions/definition-runtime.ts +93 -0
  99. package/extensions/delegate-chain.ts +31 -2
  100. package/extensions/delegation-ledger.ts +2 -0
  101. package/extensions/delegation.ts +24 -0
  102. package/extensions/effort-advice.ts +12 -0
  103. package/extensions/execute-child.ts +148 -9
  104. package/extensions/grants-command.ts +32 -2
  105. package/extensions/grants.ts +23 -1
  106. package/extensions/pruning-advice.ts +3 -1
  107. package/extensions/run-delegation.ts +54 -6
  108. package/extensions/session-model-prompt.ts +179 -0
  109. package/extensions/session.ts +104 -3
  110. package/package.json +1 -1
  111. package/src/advisors/advisor.ts +45 -2
  112. package/src/advisors/decider.ts +8 -0
  113. package/src/advisors/jev.ts +34 -1
  114. package/src/cli.ts +90 -2
  115. package/src/executors/activity-session.ts +56 -2
  116. package/src/governance/episode-cost-gate.ts +128 -0
  117. package/src/governance/ledger-events.ts +173 -1
  118. package/src/governance/ledger-v3-validation.ts +146 -0
  119. package/src/governance/ledger.ts +29 -1
  120. package/src/kernel/definitions.ts +32 -1
  121. package/src/kernel/delegate-types.ts +4 -0
  122. package/src/kernel/delegate.ts +22 -5
  123. package/src/kernel/env-names.ts +10 -0
  124. package/src/kernel/grant-env.ts +3 -0
  125. package/src/kernel/propagation.ts +7 -0
  126. package/src/products/dashboard-cli.ts +32 -4
  127. package/src/products/dashboard-handshake.ts +5 -0
  128. package/src/products/dashboard-herdr.ts +15 -1
  129. package/src/products/dashboard-projection.ts +13 -6
  130. package/src/products/dashboard-render.ts +11 -0
  131. package/src/products/dashboard-session-client.ts +35 -0
  132. package/src/products/episode-outcomes.ts +317 -0
  133. package/src/products/episode-report.ts +372 -0
@@ -0,0 +1,112 @@
1
+ /** Per-episode cost threshold state shared by every child started by one session. */
2
+ import { readFile } from "node:fs/promises";
3
+ import { readRecords } from "./record.js";
4
+ export const DEFAULT_EPISODE_COST_CEILING = 5;
5
+ export function episodeCostCeilingFromSettings(value) {
6
+ if (!value || typeof value !== "object" || Array.isArray(value))
7
+ return DEFAULT_EPISODE_COST_CEILING;
8
+ const ceiling = value.episodeCostCeiling;
9
+ return typeof ceiling === "number" && Number.isFinite(ceiling) && ceiling > 0
10
+ ? ceiling
11
+ : DEFAULT_EPISODE_COST_CEILING;
12
+ }
13
+ export class EpisodeCostGate {
14
+ #ceiling;
15
+ #costs = new Map();
16
+ #warned = false;
17
+ #usageWarning = false;
18
+ #decision;
19
+ constructor(ceiling) {
20
+ this.#ceiling = ceiling;
21
+ }
22
+ get ceiling() {
23
+ return this.#ceiling;
24
+ }
25
+ get cost() {
26
+ return [...this.#costs.values()].reduce((sum, value) => sum + value, 0);
27
+ }
28
+ setCeiling(ceiling) {
29
+ if (Number.isFinite(ceiling) && ceiling > 0 && !this.#decision)
30
+ this.#ceiling = ceiling;
31
+ }
32
+ seedCost(executionId, cost) {
33
+ if (Number.isFinite(cost) && cost >= 0)
34
+ this.#costs.set(executionId, cost);
35
+ }
36
+ async observe(executionId, cost, terminal, hooks) {
37
+ if (cost === undefined) {
38
+ if (terminal && !this.#usageWarning) {
39
+ this.#usageWarning = true;
40
+ hooks.warn("pi-daddy: provider reported no token usage; the episode cost gate cannot fire");
41
+ }
42
+ return "continue";
43
+ }
44
+ this.#costs.set(executionId, cost);
45
+ const total = [...this.#costs.values()].reduce((sum, value) => sum + value, 0);
46
+ if (!this.#warned && total >= this.#ceiling / 2) {
47
+ this.#warned = true;
48
+ hooks.warn(`pi-daddy: episode cost reached 50% of the $${this.#ceiling} ceiling`);
49
+ }
50
+ if (total <= this.#ceiling)
51
+ return "continue";
52
+ if (this.#decision) {
53
+ const decision = await this.#decision;
54
+ if (decision === "stop")
55
+ await hooks.stop?.();
56
+ return decision;
57
+ }
58
+ this.#decision = this.#decide(total, hooks);
59
+ return this.#decision;
60
+ }
61
+ async #decide(cost, hooks) {
62
+ await hooks.pause?.();
63
+ const answer = await hooks.ask?.();
64
+ if (answer !== undefined && answer !== null && Number.isFinite(answer) && answer > cost) {
65
+ const prior = this.#ceiling;
66
+ this.#ceiling = answer;
67
+ try {
68
+ await hooks.gate({ cost, ceiling: prior, outcome: "continued", newCeiling: answer });
69
+ }
70
+ catch (error) {
71
+ await hooks.stop?.();
72
+ throw error;
73
+ }
74
+ await hooks.resume?.();
75
+ return "continue";
76
+ }
77
+ try {
78
+ await hooks.gate({ cost, ceiling: this.#ceiling, outcome: "stopped" });
79
+ }
80
+ finally {
81
+ await hooks.stop?.();
82
+ }
83
+ return "stop";
84
+ }
85
+ }
86
+ export async function loadEpisodeCosts(path, episodeId) {
87
+ try {
88
+ const parsed = readRecords(await readFile(path, "utf8"));
89
+ if (parsed.damage)
90
+ return new Map();
91
+ const costs = new Map();
92
+ for (const record of parsed.records) {
93
+ const body = record.body;
94
+ if (body?.event !== "child_lifecycle" || body.episodeId !== episodeId)
95
+ continue;
96
+ if (body.state !== "completed" && body.state !== "failed")
97
+ continue;
98
+ const usage = body.usage;
99
+ const cost = usage?.cost?.total;
100
+ if (typeof body.executionId === "string" && typeof cost === "number" && Number.isFinite(cost) && cost >= 0) {
101
+ costs.set(body.executionId, cost);
102
+ }
103
+ }
104
+ return costs;
105
+ }
106
+ catch (error) {
107
+ if (error.code === "ENOENT")
108
+ return new Map();
109
+ throw error;
110
+ }
111
+ }
112
+ //# sourceMappingURL=episode-cost-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episode-cost-gate.js","sourceRoot":"","sources":["../../src/governance/episode-cost-gate.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,13 @@ export type ChildLifecycleState = (typeof CHILD_LIFECYCLE_STATES)[number];
17
17
  /** The complete Node signal vocabulary accepted by a v3 child-lifecycle event. */
18
18
  export declare const CHILD_PROCESS_SIGNALS: readonly ["SIGABRT", "SIGALRM", "SIGBUS", "SIGCHLD", "SIGCONT", "SIGFPE", "SIGHUP", "SIGILL", "SIGINT", "SIGIO", "SIGIOT", "SIGKILL", "SIGPIPE", "SIGPOLL", "SIGPROF", "SIGPWR", "SIGQUIT", "SIGSEGV", "SIGSTKFLT", "SIGSTOP", "SIGSYS", "SIGTERM", "SIGTRAP", "SIGTSTP", "SIGTTIN", "SIGTTOU", "SIGUNUSED", "SIGURG", "SIGUSR1", "SIGUSR2", "SIGVTALRM", "SIGWINCH", "SIGXCPU", "SIGXFSZ", "SIGBREAK", "SIGLOST", "SIGINFO"];
19
19
  export type ChildProcessSignal = (typeof CHILD_PROCESS_SIGNALS)[number];
20
+ export interface ChildTokenDetail {
21
+ inputTokens: number | null;
22
+ outputTokens: number | null;
23
+ cacheReadTokens: number | null;
24
+ cacheWriteTokens: number | null;
25
+ reasoningTokens: number | null;
26
+ }
20
27
  export interface ChildUsageTotals {
21
28
  input: number;
22
29
  output: number;
@@ -81,10 +88,32 @@ export interface ChildLifecycleEvent extends LedgerEventBase {
81
88
  reason?: string;
82
89
  /** The inactivity bound (ms) that governed this child beside the `deadlineAt` ceiling (PR 3e). */
83
90
  idleTimeoutMs?: number;
91
+ /** The provider/model selected for the child, confirmed from its persisted assistant message when available. */
92
+ resolvedModel?: {
93
+ provider: string;
94
+ modelId: string;
95
+ } | null;
96
+ modelSource?: "explicit" | "session" | "definition" | "global" | "pi";
97
+ /** The persisted effective level and its selection source, when pi reports one. */
98
+ thinkingLevel?: {
99
+ level: string;
100
+ source: "explicit" | "session" | "advisor" | "definition" | "global" | "pi";
101
+ } | null;
102
+ thinkingSource?: "explicit" | "session" | "advisor" | "definition" | "global" | "pi";
103
+ /** Provider-reported token dimensions; zero is normalised to null rather than invented as reported usage. */
104
+ tokenDetail?: ChildTokenDetail;
84
105
  /** Aggregate model usage read from the child's pi session file after it stopped. */
85
106
  usage?: ChildUsageTotals;
107
+ /** Number of compaction entries in the child's current turn, when the session file was readable. */
108
+ compactionCount?: number;
86
109
  /** Why totals could not be read; a fixed code, never transcript content. */
87
110
  usageUnavailable?: "session-missing" | "session-invalid" | "usage-missing";
111
+ /** Child-facing identity variables exported at the process boundary. */
112
+ exportedEnvironment?: string[];
113
+ /** SHA-256 of the complete SKILL.md used by this child. */
114
+ definitionHash?: string;
115
+ /** Installed package version exposed for the definition, when available. */
116
+ definitionPackageVersion?: string;
88
117
  }
89
118
  export type CapabilityDecisionEvent = GrantRecord & {
90
119
  ledgerVersion: typeof LEDGER_VERSION;
@@ -93,7 +122,73 @@ export type CapabilityDecisionEvent = GrantRecord & {
93
122
  parentExecutionId: string | null;
94
123
  taskDigest: string;
95
124
  };
96
- export type RuntimeLedgerEvent = CapabilityDecisionEvent | WorkspaceLeaseEvent | ChildLifecycleEvent;
125
+ export interface EpisodeOutcomeEvent extends Omit<LedgerEventBase, "correlation"> {
126
+ ledgerVersion: typeof LEDGER_VERSION;
127
+ event: "episode_outcome";
128
+ episodeId: string;
129
+ commit: string;
130
+ survived: boolean;
131
+ ci: "green" | "red" | "none";
132
+ amended: boolean;
133
+ corrected: boolean;
134
+ label: "positive" | "negative" | "unknown";
135
+ }
136
+ export interface EpisodeCostGateEvent extends Omit<LedgerEventBase, "episodeId" | "correlation"> {
137
+ ledgerVersion: typeof LEDGER_VERSION;
138
+ event: "cost_gate";
139
+ episodeId: string;
140
+ executionId: string;
141
+ parentExecutionId: string | null;
142
+ childId: string;
143
+ gate: "episode_cost";
144
+ cost: number;
145
+ ceiling: number;
146
+ outcome: "continued" | "stopped";
147
+ newCeiling?: number;
148
+ }
149
+ export interface SessionConfigEvent extends Omit<LedgerEventBase, "correlation"> {
150
+ ledgerVersion: typeof LEDGER_VERSION;
151
+ event: "session_config";
152
+ episodeId: string;
153
+ outcome: "kept" | "changed";
154
+ trigger: "first-delegation" | "grants-models";
155
+ overrides: Record<string, {
156
+ model: string;
157
+ thinking: string;
158
+ }>;
159
+ }
160
+ export type RuntimeLedgerEvent = CapabilityDecisionEvent | WorkspaceLeaseEvent | ChildLifecycleEvent | EpisodeCostGateEvent | SessionConfigEvent | EpisodeOutcomeEvent;
161
+ export declare function buildSessionConfigEvent(args: {
162
+ episodeId: string;
163
+ outcome: "kept" | "changed";
164
+ trigger: "first-delegation" | "grants-models";
165
+ overrides: ReadonlyMap<string, {
166
+ model?: string;
167
+ thinking?: string;
168
+ }>;
169
+ now: Date;
170
+ }): SessionConfigEvent;
171
+ export declare function buildEpisodeOutcomeEvent(args: {
172
+ episodeId: string;
173
+ commit: string;
174
+ survived: boolean;
175
+ ci: "green" | "red" | "none";
176
+ amended: boolean;
177
+ corrected: boolean;
178
+ label: "positive" | "negative" | "unknown";
179
+ now: Date;
180
+ }): EpisodeOutcomeEvent;
181
+ export declare function buildEpisodeCostGateEvent(args: {
182
+ episodeId: string;
183
+ executionId: string;
184
+ parentExecutionId: string | null;
185
+ childId: string;
186
+ cost: number;
187
+ ceiling: number;
188
+ outcome: "continued" | "stopped";
189
+ newCeiling?: number;
190
+ now: Date;
191
+ }): EpisodeCostGateEvent;
97
192
  export declare function buildWorkspaceLeaseEvent(args: {
98
193
  episodeId?: string;
99
194
  executionId: string;
@@ -126,8 +221,20 @@ export declare function buildChildLifecycleEvent(args: {
126
221
  aborted?: boolean;
127
222
  truncated?: boolean;
128
223
  reason?: string;
224
+ resolvedModel?: {
225
+ provider: string;
226
+ modelId: string;
227
+ };
228
+ modelSource?: "explicit" | "session" | "definition" | "global" | "pi";
229
+ effectiveThinkingLevel?: string;
230
+ thinkingSource?: "explicit" | "session" | "advisor" | "definition" | "global" | "pi";
231
+ tokenDetail?: ChildTokenDetail;
129
232
  usage?: ChildUsageTotals;
233
+ compactionCount?: number;
130
234
  usageUnavailable?: "session-missing" | "session-invalid" | "usage-missing";
235
+ exportedEnvironment?: readonly string[];
236
+ definitionHash?: string;
237
+ definitionPackageVersion?: string;
131
238
  correlation?: CorrelationMetadata;
132
239
  now: Date;
133
240
  }): ChildLifecycleEvent;
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-events.d.ts","sourceRoot":"","sources":["../../src/governance/ledger-events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ledger-events.d.ts","sourceRoot":"","sources":["../../src/governance/ledger-events.ts"],"names":[],"mappings":"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"}
@@ -73,6 +73,48 @@ export const WORKSPACE_LEASE_OUTCOMES = [
73
73
  "timeout",
74
74
  "recovered",
75
75
  ];
76
+ export function buildSessionConfigEvent(args) {
77
+ return assertLedgerV3Wire({
78
+ ledgerVersion: LEDGER_VERSION,
79
+ event: "session_config",
80
+ ts: args.now.toISOString(),
81
+ episodeId: args.episodeId,
82
+ outcome: args.outcome,
83
+ trigger: args.trigger,
84
+ overrides: Object.fromEntries([...args.overrides].map(([name, value]) => [name, { model: value.model, thinking: value.thinking }])),
85
+ });
86
+ }
87
+ export function buildEpisodeOutcomeEvent(args) {
88
+ return assertLedgerV3Wire({
89
+ ledgerVersion: LEDGER_VERSION,
90
+ event: "episode_outcome",
91
+ ts: args.now.toISOString(),
92
+ episodeId: args.episodeId,
93
+ commit: args.commit,
94
+ survived: args.survived,
95
+ ci: args.ci,
96
+ amended: args.amended,
97
+ corrected: args.corrected,
98
+ label: args.label,
99
+ });
100
+ }
101
+ export function buildEpisodeCostGateEvent(args) {
102
+ assertEventIdentity(args);
103
+ return assertLedgerV3Wire({
104
+ ledgerVersion: LEDGER_VERSION,
105
+ event: "cost_gate",
106
+ ts: args.now.toISOString(),
107
+ episodeId: args.episodeId,
108
+ executionId: args.executionId,
109
+ parentExecutionId: args.parentExecutionId,
110
+ childId: args.childId,
111
+ gate: "episode_cost",
112
+ cost: args.cost,
113
+ ceiling: args.ceiling,
114
+ outcome: args.outcome,
115
+ ...(args.newCeiling !== undefined ? { newCeiling: args.newCeiling } : {}),
116
+ });
117
+ }
76
118
  export function buildWorkspaceLeaseEvent(args) {
77
119
  assertEventIdentity(args);
78
120
  return assertLedgerV3Wire({
@@ -99,6 +141,9 @@ export function buildWorkspaceLeaseEvent(args) {
99
141
  }
100
142
  export function buildChildLifecycleEvent(args) {
101
143
  assertEventIdentity(args);
144
+ if (args.definitionHash && !/^[a-f0-9]{64}$/i.test(args.definitionHash)) {
145
+ throw new TypeError("definitionHash must be a SHA-256 hex digest");
146
+ }
102
147
  return assertLedgerV3Wire({
103
148
  ledgerVersion: LEDGER_VERSION,
104
149
  event: "child_lifecycle",
@@ -119,8 +164,27 @@ export function buildChildLifecycleEvent(args) {
119
164
  ...(args.aborted ? { aborted: true } : {}),
120
165
  ...(args.truncated ? { truncated: true } : {}),
121
166
  ...(args.reason ? { reason: args.reason } : {}),
167
+ resolvedModel: args.resolvedModel ? structuredClone(args.resolvedModel) : null,
168
+ ...(args.modelSource ? { modelSource: args.modelSource } : {}),
169
+ thinkingLevel: args.effectiveThinkingLevel && args.thinkingSource
170
+ ? { level: args.effectiveThinkingLevel, source: args.thinkingSource }
171
+ : null,
172
+ ...(args.thinkingSource ? { thinkingSource: args.thinkingSource } : {}),
173
+ tokenDetail: args.tokenDetail
174
+ ? structuredClone(args.tokenDetail)
175
+ : {
176
+ inputTokens: null,
177
+ outputTokens: null,
178
+ cacheReadTokens: null,
179
+ cacheWriteTokens: null,
180
+ reasoningTokens: null,
181
+ },
122
182
  ...(args.usage ? { usage: structuredClone(args.usage) } : {}),
183
+ ...(args.compactionCount !== undefined ? { compactionCount: args.compactionCount } : {}),
123
184
  ...(args.usageUnavailable ? { usageUnavailable: args.usageUnavailable } : {}),
185
+ ...(args.exportedEnvironment ? { exportedEnvironment: [...args.exportedEnvironment] } : {}),
186
+ ...(args.definitionHash ? { definitionHash: args.definitionHash } : {}),
187
+ ...(args.definitionPackageVersion ? { definitionPackageVersion: args.definitionPackageVersion } : {}),
124
188
  ...(args.correlation ? { correlation: structuredClone(args.correlation) } : {}),
125
189
  });
126
190
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-events.js","sourceRoot":"","sources":["../../src/governance/ledger-events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ledger-events.js","sourceRoot":"","sources":["../../src/governance/ledger-events.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ledger-v3-validation.d.ts","sourceRoot":"","sources":["../../src/governance/ledger-v3-validation.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErD;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,EAAE,WAAW,CAAC,MAAM,CAA+C,CAAC;AAC3G,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAExE;AA4ID,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAItE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEhE;AAKD,2GAA2G;AAC3G,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAkB3D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,EAAE,CAE/D;AAgND,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAY1E;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAWhE"}
1
+ {"version":3,"file":"ledger-v3-validation.d.ts","sourceRoot":"","sources":["../../src/governance/ledger-v3-validation.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErD;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,EAAE,WAAW,CAAC,MAAM,CAA+C,CAAC;AAC3G,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAExE;AAkLD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAItE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEhE;AAKD,2GAA2G;AAC3G,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAkB3D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,EAAE,CAE/D;AAsSD,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAgC1E;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAWhE"}
@@ -3,6 +3,8 @@ import { isExecutionId } from "../kernel/execution-id.js";
3
3
  import { isEpisodeId } from "../kernel/episode-id.js";
4
4
  import { REFUSAL_CODES } from "../kernel/refusals.js";
5
5
  import { isLedgerCapabilityIdentifier, isLedgerDisplayIdentifier } from "../kernel/ledger-identifiers.js";
6
+ import { CHILD_ATTRIBUTION_ENV_KEYS } from "../kernel/env-names.js";
7
+ import { isDefinitionPackageVersion } from "../kernel/definitions.js";
6
8
  /**
7
9
  * Event kinds that 0.30.0 and earlier wrote and 0.31.0 no longer builds (the check runner and workflow facts were
8
10
  * deleted). A ledger is append-only, so a line written then is still a valid line now: readers accept these
@@ -98,6 +100,8 @@ const FIELDS = {
98
100
  "humanDenied",
99
101
  "gateOutcome",
100
102
  "definitionDigest",
103
+ "definitionHash",
104
+ "definitionPackageVersion",
101
105
  "handoff",
102
106
  "executor",
103
107
  "taskFrom",
@@ -123,6 +127,33 @@ const FIELDS = {
123
127
  "refusal",
124
128
  "correlation",
125
129
  ]),
130
+ cost_gate: new Set([
131
+ "ledgerVersion",
132
+ "event",
133
+ "ts",
134
+ "episodeId",
135
+ "executionId",
136
+ "parentExecutionId",
137
+ "childId",
138
+ "gate",
139
+ "cost",
140
+ "ceiling",
141
+ "outcome",
142
+ "newCeiling",
143
+ ]),
144
+ session_config: new Set(["ledgerVersion", "event", "ts", "episodeId", "outcome", "trigger", "overrides"]),
145
+ episode_outcome: new Set([
146
+ "ledgerVersion",
147
+ "event",
148
+ "ts",
149
+ "episodeId",
150
+ "commit",
151
+ "survived",
152
+ "ci",
153
+ "amended",
154
+ "corrected",
155
+ "label",
156
+ ]),
126
157
  child_lifecycle: new Set([
127
158
  "ledgerVersion",
128
159
  "event",
@@ -141,8 +172,17 @@ const FIELDS = {
141
172
  "reason",
142
173
  "deadlineAt",
143
174
  "idleTimeoutMs",
175
+ "resolvedModel",
176
+ "modelSource",
177
+ "thinkingLevel",
178
+ "thinkingSource",
179
+ "tokenDetail",
144
180
  "usage",
181
+ "compactionCount",
145
182
  "usageUnavailable",
183
+ "exportedEnvironment",
184
+ "definitionHash",
185
+ "definitionPackageVersion",
146
186
  "herdrPaneId",
147
187
  "herdrAgentName",
148
188
  "correlation",
@@ -269,6 +309,8 @@ function validateCapabilityDecision(event) {
269
309
  !optional(event, "humanDenied", (value) => value === true) ||
270
310
  !optional(event, "gateOutcome", (value) => GATE_OUTCOMES.has(String(value))) ||
271
311
  !optional(event, "definitionDigest", validDefinitionDigest) ||
312
+ !optional(event, "definitionHash", (value) => SHA256_RE.test(String(value))) ||
313
+ !optional(event, "definitionPackageVersion", isDefinitionPackageVersion) ||
272
314
  !optional(event, "taskFrom", isLedgerDisplayIdentifier) ||
273
315
  !optional(event, "taskFromExecutionId", isExecutionId) ||
274
316
  !optional(event, "correlation", validCorrelation) ||
@@ -307,6 +349,62 @@ function validUsage(value) {
307
349
  return false;
308
350
  return ["input", "output", "cacheRead", "cacheWrite", "total"].every((field) => typeof cost[field] === "number" && Number.isFinite(cost[field]) && cost[field] >= 0);
309
351
  }
352
+ function validResolvedModel(value) {
353
+ return (value === null ||
354
+ (isLedgerObject(value) &&
355
+ Object.keys(value).every((key) => ["provider", "modelId"].includes(key)) &&
356
+ isNonEmptyString(value.provider) &&
357
+ isNonEmptyString(value.modelId)));
358
+ }
359
+ const MODEL_SOURCES = ["explicit", "session", "definition", "global", "pi"];
360
+ const THINKING_SOURCES = [...MODEL_SOURCES, "advisor"];
361
+ function validThinkingLevel(value) {
362
+ return (value === null ||
363
+ (isLedgerObject(value) &&
364
+ Object.keys(value).every((key) => ["level", "source"].includes(key)) &&
365
+ isNonEmptyString(value.level) &&
366
+ THINKING_SOURCES.includes(String(value.source))));
367
+ }
368
+ function validTokenDetail(value) {
369
+ if (!isLedgerObject(value))
370
+ return false;
371
+ const fields = ["inputTokens", "outputTokens", "cacheReadTokens", "cacheWriteTokens", "reasoningTokens"];
372
+ return (Object.keys(value).length === fields.length &&
373
+ fields.every((field) => value[field] === null || (nonNegativeNumber(value[field]) && value[field] > 0)));
374
+ }
375
+ function validExportedEnvironment(value) {
376
+ return (Array.isArray(value) &&
377
+ value.length === CHILD_ATTRIBUTION_ENV_KEYS.length &&
378
+ CHILD_ATTRIBUTION_ENV_KEYS.every((name) => value.filter((entry) => entry === name).length === 1));
379
+ }
380
+ function validateCostGate(event) {
381
+ if (event.gate !== "episode_cost" ||
382
+ !nonNegativeNumber(event.cost) ||
383
+ !nonNegativeNumber(event.ceiling) ||
384
+ event.ceiling <= 0 ||
385
+ !["continued", "stopped"].includes(String(event.outcome))) {
386
+ return "cost gate required fields are invalid";
387
+ }
388
+ if (!optional(event, "newCeiling", (value) => nonNegativeNumber(value) && value > event.cost)) {
389
+ return "cost gate new ceiling is invalid";
390
+ }
391
+ if ((event.outcome === "continued") !== Object.hasOwn(event, "newCeiling")) {
392
+ return "continued cost gate requires exactly one new ceiling";
393
+ }
394
+ return null;
395
+ }
396
+ function validateEpisodeOutcome(event) {
397
+ if (!isTimestamp(event.ts) ||
398
+ !isEpisodeId(event.episodeId) ||
399
+ !/^[a-f0-9]{40}$/i.test(String(event.commit)) ||
400
+ typeof event.survived !== "boolean" ||
401
+ !["green", "red", "none"].includes(String(event.ci)) ||
402
+ typeof event.amended !== "boolean" ||
403
+ typeof event.corrected !== "boolean" ||
404
+ !["positive", "negative", "unknown"].includes(String(event.label)))
405
+ return "episode outcome fields are invalid";
406
+ return null;
407
+ }
310
408
  function validateChildLifecycle(event) {
311
409
  if (!["starting", "running", "completed", "failed"].includes(String(event.state)) ||
312
410
  !EXECUTORS.has(String(event.executor))) {
@@ -323,8 +421,17 @@ function validateChildLifecycle(event) {
323
421
  !optional(event, "aborted", (value) => value === true) ||
324
422
  !optional(event, "truncated", (value) => value === true) ||
325
423
  !optional(event, "reason", (value) => typeof value === "string") ||
424
+ !optional(event, "resolvedModel", validResolvedModel) ||
425
+ !optional(event, "modelSource", (value) => MODEL_SOURCES.includes(String(value))) ||
426
+ !optional(event, "thinkingLevel", validThinkingLevel) ||
427
+ !optional(event, "thinkingSource", (value) => THINKING_SOURCES.includes(String(value))) ||
428
+ !optional(event, "tokenDetail", validTokenDetail) ||
326
429
  !optional(event, "usage", validUsage) ||
430
+ !optional(event, "compactionCount", (value) => Number.isInteger(value) && value >= 0) ||
327
431
  !optional(event, "usageUnavailable", (value) => ["session-missing", "session-invalid", "usage-missing"].includes(String(value))) ||
432
+ !optional(event, "exportedEnvironment", validExportedEnvironment) ||
433
+ !optional(event, "definitionHash", (value) => SHA256_RE.test(String(value))) ||
434
+ !optional(event, "definitionPackageVersion", isDefinitionPackageVersion) ||
328
435
  !optional(event, "correlation", validCorrelation)) {
329
436
  return "child lifecycle optional fields are invalid";
330
437
  }
@@ -355,6 +462,21 @@ export function validateLedgerV3Event(event) {
355
462
  const allowed = FIELDS[kind];
356
463
  if (Object.keys(event).some((field) => !allowed.has(field)))
357
464
  return "ledger v3 contains an unsupported field";
465
+ if (kind === "session_config") {
466
+ if (!isEpisodeId(event.episodeId) ||
467
+ !["kept", "changed"].includes(String(event.outcome)) ||
468
+ !["first-delegation", "grants-models"].includes(String(event.trigger)) ||
469
+ !isLedgerObject(event.overrides) ||
470
+ !Object.entries(event.overrides).every(([name, value]) => isNonEmptyString(name) &&
471
+ isLedgerObject(value) &&
472
+ Object.keys(value).length === 2 &&
473
+ isNonEmptyString(value.model) &&
474
+ isNonEmptyString(value.thinking)))
475
+ return "session config fields are invalid";
476
+ return null;
477
+ }
478
+ if (kind === "episode_outcome")
479
+ return validateEpisodeOutcome(event);
358
480
  const base = validateBase(event);
359
481
  if (base)
360
482
  return base;
@@ -362,6 +484,8 @@ export function validateLedgerV3Event(event) {
362
484
  return validateCapabilityDecision(event);
363
485
  if (kind === "workspace_lease")
364
486
  return validateWorkspaceLease(event);
487
+ if (kind === "cost_gate")
488
+ return validateCostGate(event);
365
489
  return validateChildLifecycle(event);
366
490
  }
367
491
  /** Ensure a public builder cannot emit bytes the closed v3 reader would reject. */