@agimon-ai/doompi-goal 0.0.1-alpha.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 (180) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +25 -0
  3. package/dist/_virtual/_rolldown/runtime.cjs +1 -0
  4. package/dist/adapters/node/historyLock.cjs +2 -0
  5. package/dist/adapters/node/historyLock.cjs.map +1 -0
  6. package/dist/adapters/node/historyLock.mjs +2 -0
  7. package/dist/adapters/node/historyLock.mjs.map +1 -0
  8. package/dist/adapters/node/historyStore.cjs +2 -0
  9. package/dist/adapters/node/historyStore.cjs.map +1 -0
  10. package/dist/adapters/node/historyStore.mjs +2 -0
  11. package/dist/adapters/node/historyStore.mjs.map +1 -0
  12. package/dist/adapters/node/repositoryIdentity.cjs +2 -0
  13. package/dist/adapters/node/repositoryIdentity.cjs.map +1 -0
  14. package/dist/adapters/node/repositoryIdentity.mjs +2 -0
  15. package/dist/adapters/node/repositoryIdentity.mjs.map +1 -0
  16. package/dist/adapters/pi/goalManager.cjs +2 -0
  17. package/dist/adapters/pi/goalManager.cjs.map +1 -0
  18. package/dist/adapters/pi/goalManager.d.cts +86 -0
  19. package/dist/adapters/pi/goalManager.d.cts.map +1 -0
  20. package/dist/adapters/pi/goalManager.d.mts +86 -0
  21. package/dist/adapters/pi/goalManager.d.mts.map +1 -0
  22. package/dist/adapters/pi/goalManager.mjs +2 -0
  23. package/dist/adapters/pi/goalManager.mjs.map +1 -0
  24. package/dist/adapters/pi/toolVisibility.cjs +2 -0
  25. package/dist/adapters/pi/toolVisibility.cjs.map +1 -0
  26. package/dist/adapters/pi/toolVisibility.mjs +2 -0
  27. package/dist/adapters/pi/toolVisibility.mjs.map +1 -0
  28. package/dist/container/index.cjs +2 -0
  29. package/dist/container/index.cjs.map +1 -0
  30. package/dist/container/index.mjs +2 -0
  31. package/dist/container/index.mjs.map +1 -0
  32. package/dist/extensions/doom.cjs +2 -0
  33. package/dist/extensions/doom.cjs.map +1 -0
  34. package/dist/extensions/doom.d.cts +6 -0
  35. package/dist/extensions/doom.d.cts.map +1 -0
  36. package/dist/extensions/doom.d.mts +6 -0
  37. package/dist/extensions/doom.d.mts.map +1 -0
  38. package/dist/extensions/doom.mjs +2 -0
  39. package/dist/extensions/doom.mjs.map +1 -0
  40. package/dist/extensions/pi.cjs +2 -0
  41. package/dist/extensions/pi.cjs.map +1 -0
  42. package/dist/extensions/pi.d.cts +7 -0
  43. package/dist/extensions/pi.d.cts.map +1 -0
  44. package/dist/extensions/pi.d.mts +7 -0
  45. package/dist/extensions/pi.d.mts.map +1 -0
  46. package/dist/extensions/pi.mjs +2 -0
  47. package/dist/extensions/pi.mjs.map +1 -0
  48. package/dist/extensions/runtimeActivation.cjs +2 -0
  49. package/dist/extensions/runtimeActivation.cjs.map +1 -0
  50. package/dist/extensions/runtimeActivation.d.cts +14 -0
  51. package/dist/extensions/runtimeActivation.d.cts.map +1 -0
  52. package/dist/extensions/runtimeActivation.d.mts +14 -0
  53. package/dist/extensions/runtimeActivation.d.mts.map +1 -0
  54. package/dist/extensions/runtimeActivation.mjs +2 -0
  55. package/dist/extensions/runtimeActivation.mjs.map +1 -0
  56. package/dist/index.cjs +1 -0
  57. package/dist/index.d.cts +17 -0
  58. package/dist/index.d.mts +17 -0
  59. package/dist/index.mjs +1 -0
  60. package/dist/services/extensionService.cjs +2 -0
  61. package/dist/services/extensionService.cjs.map +1 -0
  62. package/dist/services/extensionService.d.cts +8 -0
  63. package/dist/services/extensionService.d.cts.map +1 -0
  64. package/dist/services/extensionService.d.mts +8 -0
  65. package/dist/services/extensionService.d.mts.map +1 -0
  66. package/dist/services/extensionService.mjs +2 -0
  67. package/dist/services/extensionService.mjs.map +1 -0
  68. package/dist/services/goal/accounting.cjs +2 -0
  69. package/dist/services/goal/accounting.cjs.map +1 -0
  70. package/dist/services/goal/accounting.d.cts +34 -0
  71. package/dist/services/goal/accounting.d.cts.map +1 -0
  72. package/dist/services/goal/accounting.d.mts +34 -0
  73. package/dist/services/goal/accounting.d.mts.map +1 -0
  74. package/dist/services/goal/accounting.mjs +2 -0
  75. package/dist/services/goal/accounting.mjs.map +1 -0
  76. package/dist/services/goal/parser.cjs +2 -0
  77. package/dist/services/goal/parser.cjs.map +1 -0
  78. package/dist/services/goal/parser.d.cts +24 -0
  79. package/dist/services/goal/parser.d.cts.map +1 -0
  80. package/dist/services/goal/parser.d.mts +24 -0
  81. package/dist/services/goal/parser.d.mts.map +1 -0
  82. package/dist/services/goal/parser.mjs +2 -0
  83. package/dist/services/goal/parser.mjs.map +1 -0
  84. package/dist/services/goal/prompts.cjs +3 -0
  85. package/dist/services/goal/prompts.cjs.map +1 -0
  86. package/dist/services/goal/prompts.d.cts +23 -0
  87. package/dist/services/goal/prompts.d.cts.map +1 -0
  88. package/dist/services/goal/prompts.d.mts +23 -0
  89. package/dist/services/goal/prompts.d.mts.map +1 -0
  90. package/dist/services/goal/prompts.mjs +3 -0
  91. package/dist/services/goal/prompts.mjs.map +1 -0
  92. package/dist/services/goal/queue.cjs +2 -0
  93. package/dist/services/goal/queue.cjs.map +1 -0
  94. package/dist/services/goal/queue.d.cts +19 -0
  95. package/dist/services/goal/queue.d.cts.map +1 -0
  96. package/dist/services/goal/queue.d.mts +19 -0
  97. package/dist/services/goal/queue.d.mts.map +1 -0
  98. package/dist/services/goal/queue.mjs +2 -0
  99. package/dist/services/goal/queue.mjs.map +1 -0
  100. package/dist/services/goal/runtime.cjs +2 -0
  101. package/dist/services/goal/runtime.cjs.map +1 -0
  102. package/dist/services/goal/runtime.d.cts +31 -0
  103. package/dist/services/goal/runtime.d.cts.map +1 -0
  104. package/dist/services/goal/runtime.d.mts +31 -0
  105. package/dist/services/goal/runtime.d.mts.map +1 -0
  106. package/dist/services/goal/runtime.mjs +2 -0
  107. package/dist/services/goal/runtime.mjs.map +1 -0
  108. package/dist/services/goal/safety.cjs +3 -0
  109. package/dist/services/goal/safety.cjs.map +1 -0
  110. package/dist/services/goal/safety.d.cts +18 -0
  111. package/dist/services/goal/safety.d.cts.map +1 -0
  112. package/dist/services/goal/safety.d.mts +18 -0
  113. package/dist/services/goal/safety.d.mts.map +1 -0
  114. package/dist/services/goal/safety.mjs +3 -0
  115. package/dist/services/goal/safety.mjs.map +1 -0
  116. package/dist/services/goal/settings.cjs +2 -0
  117. package/dist/services/goal/settings.cjs.map +1 -0
  118. package/dist/services/goal/settings.d.cts +24 -0
  119. package/dist/services/goal/settings.d.cts.map +1 -0
  120. package/dist/services/goal/settings.d.mts +24 -0
  121. package/dist/services/goal/settings.d.mts.map +1 -0
  122. package/dist/services/goal/settings.mjs +2 -0
  123. package/dist/services/goal/settings.mjs.map +1 -0
  124. package/dist/services/goal/stateCodec.cjs +2 -0
  125. package/dist/services/goal/stateCodec.cjs.map +1 -0
  126. package/dist/services/goal/stateCodec.d.cts +22 -0
  127. package/dist/services/goal/stateCodec.d.cts.map +1 -0
  128. package/dist/services/goal/stateCodec.d.mts +22 -0
  129. package/dist/services/goal/stateCodec.d.mts.map +1 -0
  130. package/dist/services/goal/stateCodec.mjs +2 -0
  131. package/dist/services/goal/stateCodec.mjs.map +1 -0
  132. package/dist/services/goal/stateMachine.cjs +3 -0
  133. package/dist/services/goal/stateMachine.cjs.map +1 -0
  134. package/dist/services/goal/stateMachine.d.cts +25 -0
  135. package/dist/services/goal/stateMachine.d.cts.map +1 -0
  136. package/dist/services/goal/stateMachine.d.mts +25 -0
  137. package/dist/services/goal/stateMachine.d.mts.map +1 -0
  138. package/dist/services/goal/stateMachine.mjs +3 -0
  139. package/dist/services/goal/stateMachine.mjs.map +1 -0
  140. package/dist/services/goal/tools.cjs +2 -0
  141. package/dist/services/goal/tools.cjs.map +1 -0
  142. package/dist/services/goal/tools.d.cts +29 -0
  143. package/dist/services/goal/tools.d.cts.map +1 -0
  144. package/dist/services/goal/tools.d.mts +29 -0
  145. package/dist/services/goal/tools.d.mts.map +1 -0
  146. package/dist/services/goal/tools.mjs +2 -0
  147. package/dist/services/goal/tools.mjs.map +1 -0
  148. package/dist/services/history/historyService.cjs +2 -0
  149. package/dist/services/history/historyService.cjs.map +1 -0
  150. package/dist/services/history/historyService.mjs +2 -0
  151. package/dist/services/history/historyService.mjs.map +1 -0
  152. package/dist/tui/goalHistoryOverlay.cjs +3 -0
  153. package/dist/tui/goalHistoryOverlay.cjs.map +1 -0
  154. package/dist/tui/goalHistoryOverlay.mjs +3 -0
  155. package/dist/tui/goalHistoryOverlay.mjs.map +1 -0
  156. package/dist/types/extension.d.cts +17 -0
  157. package/dist/types/extension.d.cts.map +1 -0
  158. package/dist/types/extension.d.mts +17 -0
  159. package/dist/types/extension.d.mts.map +1 -0
  160. package/dist/types/goal.cjs +2 -0
  161. package/dist/types/goal.cjs.map +1 -0
  162. package/dist/types/goal.d.cts +57 -0
  163. package/dist/types/goal.d.cts.map +1 -0
  164. package/dist/types/goal.d.mts +57 -0
  165. package/dist/types/goal.d.mts.map +1 -0
  166. package/dist/types/goal.mjs +2 -0
  167. package/dist/types/goal.mjs.map +1 -0
  168. package/dist/types/history.d.cts +27 -0
  169. package/dist/types/history.d.cts.map +1 -0
  170. package/dist/types/history.d.mts +27 -0
  171. package/dist/types/history.d.mts.map +1 -0
  172. package/dist/types/ports.d.cts +19 -0
  173. package/dist/types/ports.d.cts.map +1 -0
  174. package/dist/types/ports.d.mts +19 -0
  175. package/dist/types/ports.d.mts.map +1 -0
  176. package/dist/types/settings.d.cts +6 -0
  177. package/dist/types/settings.d.cts.map +1 -0
  178. package/dist/types/settings.d.mts +6 -0
  179. package/dist/types/settings.d.mts.map +1 -0
  180. package/package.json +79 -0
@@ -0,0 +1,31 @@
1
+ import { ActiveGoal, GoalRuntimeSnapshot, GoalStateData, PendingQueueAction } from "../../types/goal.cjs";
2
+ //#region src/services/goal/runtime.d.ts
3
+ interface RuntimeCommitPort {
4
+ persist(state: GoalStateData): void;
5
+ }
6
+ declare class GoalRuntimeModel {
7
+ private current?;
8
+ private queue;
9
+ private pendingAction?;
10
+ private readonly loaded;
11
+ constructor(port: RuntimeCommitPort, loaded?: boolean);
12
+ private readonly port;
13
+ snapshot(): GoalRuntimeSnapshot;
14
+ load(state: {
15
+ goal?: ActiveGoal;
16
+ queue?: readonly ActiveGoal[];
17
+ pendingAction?: PendingQueueAction;
18
+ }): void;
19
+ start(goal: ActiveGoal): GoalRuntimeSnapshot;
20
+ stop(status: 'paused' | 'blocked' | 'usage_limited' | 'budget_limited'): GoalRuntimeSnapshot;
21
+ clear(): GoalRuntimeSnapshot;
22
+ replaceState(state: {
23
+ goal?: ActiveGoal;
24
+ queue?: readonly ActiveGoal[];
25
+ pendingAction?: PendingQueueAction;
26
+ }): GoalRuntimeSnapshot;
27
+ private commit;
28
+ }
29
+ //#endregion
30
+ export { GoalRuntimeModel, RuntimeCommitPort };
31
+ //# sourceMappingURL=runtime.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.cts","names":[],"sources":["../../../src/services/goal/runtime.ts"],"mappings":";;UAGiB;EACf,QAAQ,OAAO;;cAEJ;UACH;UACA;UACA;mBACS;EACL,YAAA,MAAM,mBAAmB;mBAIpB;EACjB,YAAY;EASZ,KAAK;IAAS,OAAO;IAAY,iBAAiB;IAAc,gBAAgB;;EAKhF,MAAM,MAAM,aAAa;EAIzB,KAAK,oEAAoE;EAKzE,SAAS;EAIT,aAAa;IACX,OAAO;IACP,iBAAiB;IACjB,gBAAgB;MACd;UAII"}
@@ -0,0 +1,31 @@
1
+ import { ActiveGoal, GoalRuntimeSnapshot, GoalStateData, PendingQueueAction } from "../../types/goal.mjs";
2
+ //#region src/services/goal/runtime.d.ts
3
+ interface RuntimeCommitPort {
4
+ persist(state: GoalStateData): void;
5
+ }
6
+ declare class GoalRuntimeModel {
7
+ private current?;
8
+ private queue;
9
+ private pendingAction?;
10
+ private readonly loaded;
11
+ constructor(port: RuntimeCommitPort, loaded?: boolean);
12
+ private readonly port;
13
+ snapshot(): GoalRuntimeSnapshot;
14
+ load(state: {
15
+ goal?: ActiveGoal;
16
+ queue?: readonly ActiveGoal[];
17
+ pendingAction?: PendingQueueAction;
18
+ }): void;
19
+ start(goal: ActiveGoal): GoalRuntimeSnapshot;
20
+ stop(status: 'paused' | 'blocked' | 'usage_limited' | 'budget_limited'): GoalRuntimeSnapshot;
21
+ clear(): GoalRuntimeSnapshot;
22
+ replaceState(state: {
23
+ goal?: ActiveGoal;
24
+ queue?: readonly ActiveGoal[];
25
+ pendingAction?: PendingQueueAction;
26
+ }): GoalRuntimeSnapshot;
27
+ private commit;
28
+ }
29
+ //#endregion
30
+ export { GoalRuntimeModel, RuntimeCommitPort };
31
+ //# sourceMappingURL=runtime.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.mts","names":[],"sources":["../../../src/services/goal/runtime.ts"],"mappings":";;UAGiB;EACf,QAAQ,OAAO;;cAEJ;UACH;UACA;UACA;mBACS;EACL,YAAA,MAAM,mBAAmB;mBAIpB;EACjB,YAAY;EASZ,KAAK;IAAS,OAAO;IAAY,iBAAiB;IAAc,gBAAgB;;EAKhF,MAAM,MAAM,aAAa;EAIzB,KAAK,oEAAoE;EAKzE,SAAS;EAIT,aAAa;IACX,OAAO;IACP,iBAAiB;IACjB,gBAAgB;MACd;UAII"}
@@ -0,0 +1,2 @@
1
+ import{getExecutionState as e,transitionGoal as t}from"./stateMachine.mjs";import{serializeGoalState as n}from"./stateCodec.mjs";var r=class{current;queue=[];pendingAction;loaded;constructor(e,t=!0){this.port=e,this.loaded=t}port;snapshot(){return{loaded:this.loaded,execution:e({goal:this.current,queue:this.queue}),goal:this.current,queue:[...this.queue],pendingAction:this.pendingAction}}load(e){this.current=e.goal,this.queue=[...e.queue??[]],this.pendingAction=e.pendingAction}start(e){return this.commit({goal:e,queue:this.queue,pendingAction:this.pendingAction}),this.snapshot()}stop(e){return this.current&&this.commit({goal:t(this.current,e),queue:this.queue,pendingAction:this.pendingAction}),this.snapshot()}clear(){return this.commit({goal:void 0,queue:[],pendingAction:void 0}),this.snapshot()}replaceState(e){return this.commit({goal:e.goal,queue:e.queue??[],pendingAction:e.pendingAction}),this.snapshot()}commit(e){this.port.persist(n(e.goal,e.queue,e.pendingAction)),this.current=e.goal,this.queue=[...e.queue],this.pendingAction=e.pendingAction}};export{r as GoalRuntimeModel};
2
+ //# sourceMappingURL=runtime.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.mjs","names":[],"sources":["../../../src/services/goal/runtime.ts"],"sourcesContent":["import type { ActiveGoal, GoalRuntimeSnapshot, GoalStateData, PendingQueueAction } from '../../types/goal.ts';\nimport { serializeGoalState } from './stateCodec.ts';\nimport { getExecutionState, transitionGoal } from './stateMachine.ts';\nexport interface RuntimeCommitPort {\n persist(state: GoalStateData): void;\n}\nexport class GoalRuntimeModel {\n private current?: ActiveGoal;\n private queue: ActiveGoal[] = [];\n private pendingAction?: PendingQueueAction;\n private readonly loaded: boolean;\n constructor(port: RuntimeCommitPort, loaded = true) {\n this.port = port;\n this.loaded = loaded;\n }\n private readonly port: RuntimeCommitPort;\n snapshot(): GoalRuntimeSnapshot {\n return {\n loaded: this.loaded,\n execution: getExecutionState({ goal: this.current, queue: this.queue }),\n goal: this.current,\n queue: [...this.queue],\n pendingAction: this.pendingAction,\n };\n }\n load(state: { goal?: ActiveGoal; queue?: readonly ActiveGoal[]; pendingAction?: PendingQueueAction }): void {\n this.current = state.goal;\n this.queue = [...(state.queue ?? [])];\n this.pendingAction = state.pendingAction;\n }\n start(goal: ActiveGoal): GoalRuntimeSnapshot {\n this.commit({ goal, queue: this.queue, pendingAction: this.pendingAction });\n return this.snapshot();\n }\n stop(status: 'paused' | 'blocked' | 'usage_limited' | 'budget_limited'): GoalRuntimeSnapshot {\n if (!this.current) return this.snapshot();\n this.commit({ goal: transitionGoal(this.current, status), queue: this.queue, pendingAction: this.pendingAction });\n return this.snapshot();\n }\n clear(): GoalRuntimeSnapshot {\n this.commit({ goal: undefined, queue: [], pendingAction: undefined });\n return this.snapshot();\n }\n replaceState(state: {\n goal?: ActiveGoal;\n queue?: readonly ActiveGoal[];\n pendingAction?: PendingQueueAction;\n }): GoalRuntimeSnapshot {\n this.commit({ goal: state.goal, queue: state.queue ?? [], pendingAction: state.pendingAction });\n return this.snapshot();\n }\n private commit(state: { goal?: ActiveGoal; queue: readonly ActiveGoal[]; pendingAction?: PendingQueueAction }): void {\n this.port.persist(serializeGoalState(state.goal, state.queue, state.pendingAction));\n this.current = state.goal;\n this.queue = [...state.queue];\n this.pendingAction = state.pendingAction;\n }\n}\n"],"mappings":"iIAMA,IAAa,EAAb,KAA8B,CAC5B,QACA,MAA8B,CAAC,EAC/B,cACA,OACA,YAAY,EAAyB,EAAS,GAAM,CAClD,KAAK,KAAO,EACZ,KAAK,OAAS,CAChB,CACA,KACA,UAAgC,CAC9B,MAAO,CACL,OAAQ,KAAK,OACb,UAAW,EAAkB,CAAE,KAAM,KAAK,QAAS,MAAO,KAAK,KAAM,CAAC,EACtE,KAAM,KAAK,QACX,MAAO,CAAC,GAAG,KAAK,KAAK,EACrB,cAAe,KAAK,aACtB,CACF,CACA,KAAK,EAAuG,CAC1G,KAAK,QAAU,EAAM,KACrB,KAAK,MAAQ,CAAC,GAAI,EAAM,OAAS,CAAC,CAAE,EACpC,KAAK,cAAgB,EAAM,aAC7B,CACA,MAAM,EAAuC,CAE3C,OADA,KAAK,OAAO,CAAE,OAAM,MAAO,KAAK,MAAO,cAAe,KAAK,aAAc,CAAC,EACnE,KAAK,SAAS,CACvB,CACA,KAAK,EAAwF,CAG3F,OAFK,KAAK,SACV,KAAK,OAAO,CAAE,KAAM,EAAe,KAAK,QAAS,CAAM,EAAG,MAAO,KAAK,MAAO,cAAe,KAAK,aAAc,CAAC,EADtF,KAAK,SAAS,CAG1C,CACA,OAA6B,CAE3B,OADA,KAAK,OAAO,CAAE,KAAM,IAAA,GAAW,MAAO,CAAC,EAAG,cAAe,IAAA,EAAU,CAAC,EAC7D,KAAK,SAAS,CACvB,CACA,aAAa,EAIW,CAEtB,OADA,KAAK,OAAO,CAAE,KAAM,EAAM,KAAM,MAAO,EAAM,OAAS,CAAC,EAAG,cAAe,EAAM,aAAc,CAAC,EACvF,KAAK,SAAS,CACvB,CACA,OAAe,EAAsG,CACnH,KAAK,KAAK,QAAQ,EAAmB,EAAM,KAAM,EAAM,MAAO,EAAM,aAAa,CAAC,EAClF,KAAK,QAAU,EAAM,KACrB,KAAK,MAAQ,CAAC,GAAG,EAAM,KAAK,EAC5B,KAAK,cAAgB,EAAM,aAC7B,CACF"}
@@ -0,0 +1,3 @@
1
+ function e(e,t=Date.now()){return{...e,automaticModelTurns:0,toolFreeRepeatCount:0,lastToolFreeOutputFingerprint:void 0,safetyPauseCause:void 0,safetyResetPending:void 0,updatedAt:t}}function t(e,t,n){if(n)return{toolFreeRepeatCount:0,lastToolFreeOutputFingerprint:void 0};let r=i(t);return r?{toolFreeRepeatCount:r===e.lastToolFreeOutputFingerprint?e.toolFreeRepeatCount+1:1,lastToolFreeOutputFingerprint:r}:{toolFreeRepeatCount:0,lastToolFreeOutputFingerprint:void 0}}function n(e,t){if(t.automaticTurns!==null&&e.automaticModelTurns>=t.automaticTurns)return`continuation_limit`;if(t.noProgressTurns!==null&&e.toolFreeRepeatCount>=t.noProgressTurns)return`no_progress`}function r(e,t){return e.status===`active`&&n(e,t)!==void 0}function i(e){let t=e.map(a).filter(Boolean).join(`
2
+ `);if(!t)return;let n=2166136261;for(let e of t)n^=e.codePointAt(0)??0,n=Math.imul(n,16777619);return`${(n>>>0).toString(16).padStart(8,`0`)}`.repeat(8)}function a(e){if(!e||typeof e!=`object`)return``;let t=e;return t.role!==void 0&&t.role!==`assistant`?``:typeof t.text==`string`?t.text:typeof t.content==`string`?t.content:Array.isArray(t.content)?t.content.map(e=>e&&typeof e==`object`&&typeof e.text==`string`?e.text:``).join(``):``}exports.nextToolFreeRepeatState=t,exports.outputFingerprint=i,exports.resetGoalSafetyEpoch=e,exports.safetyLimitReached=n,exports.shouldPauseForSafety=r;
3
+ //# sourceMappingURL=safety.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.cjs","names":[],"sources":["../../../src/services/goal/safety.ts"],"sourcesContent":["import type { ActiveGoal, SafetyPauseCause } from '../../types/goal.ts';\nexport interface SafetySettings {\n automaticTurns: number | null;\n noProgressTurns: number | null;\n}\nexport interface SafetyProgress {\n toolFreeRepeatCount: number;\n lastToolFreeOutputFingerprint?: string;\n}\nexport function resetGoalSafetyEpoch(goal: ActiveGoal, now = Date.now()): ActiveGoal {\n return {\n ...goal,\n automaticModelTurns: 0,\n toolFreeRepeatCount: 0,\n lastToolFreeOutputFingerprint: undefined,\n safetyPauseCause: undefined,\n safetyResetPending: undefined,\n updatedAt: now,\n };\n}\nexport function nextToolFreeRepeatState(\n goal: Pick<ActiveGoal, 'toolFreeRepeatCount' | 'lastToolFreeOutputFingerprint'>,\n messages: readonly unknown[],\n toolAttempted: boolean,\n): SafetyProgress {\n if (toolAttempted) return { toolFreeRepeatCount: 0, lastToolFreeOutputFingerprint: undefined };\n const fingerprint = outputFingerprint(messages);\n if (!fingerprint) return { toolFreeRepeatCount: 0, lastToolFreeOutputFingerprint: undefined };\n return {\n toolFreeRepeatCount: fingerprint === goal.lastToolFreeOutputFingerprint ? goal.toolFreeRepeatCount + 1 : 1,\n lastToolFreeOutputFingerprint: fingerprint,\n };\n}\nexport function safetyLimitReached(\n goal: Pick<ActiveGoal, 'automaticModelTurns' | 'toolFreeRepeatCount'>,\n settings: SafetySettings,\n): SafetyPauseCause | undefined {\n if (settings.automaticTurns !== null && goal.automaticModelTurns >= settings.automaticTurns)\n return 'continuation_limit';\n if (settings.noProgressTurns !== null && goal.toolFreeRepeatCount >= settings.noProgressTurns) return 'no_progress';\n return undefined;\n}\nexport function shouldPauseForSafety(\n goal: Pick<ActiveGoal, 'status' | 'automaticModelTurns' | 'toolFreeRepeatCount'>,\n settings: SafetySettings,\n): boolean {\n return goal.status === 'active' && safetyLimitReached(goal, settings) !== undefined;\n}\nexport function outputFingerprint(messages: readonly unknown[]): string | undefined {\n const text = messages.map(messageText).filter(Boolean).join('\\n');\n if (!text) return undefined;\n let hash = 2166136261;\n for (const char of text) {\n hash ^= char.codePointAt(0) ?? 0;\n hash = Math.imul(hash, 16777619);\n }\n return `${(hash >>> 0).toString(16).padStart(8, '0')}`.repeat(8);\n}\nfunction messageText(message: unknown): string {\n if (!message || typeof message !== 'object') return '';\n const candidate = message as { role?: unknown; content?: unknown; text?: unknown };\n if (candidate.role !== undefined && candidate.role !== 'assistant') return '';\n if (typeof candidate.text === 'string') return candidate.text;\n if (typeof candidate.content === 'string') return candidate.content;\n if (!Array.isArray(candidate.content)) return '';\n return candidate.content\n .map((part) =>\n part && typeof part === 'object' && typeof (part as { text?: unknown }).text === 'string'\n ? (part as { text: string }).text\n : '',\n )\n .join('');\n}\n"],"mappings":"AASA,SAAgB,EAAqB,EAAkB,EAAM,KAAK,IAAI,EAAe,CACnF,MAAO,CACL,GAAG,EACH,oBAAqB,EACrB,oBAAqB,EACrB,8BAA+B,IAAA,GAC/B,iBAAkB,IAAA,GAClB,mBAAoB,IAAA,GACpB,UAAW,CACb,CACF,CACA,SAAgB,EACd,EACA,EACA,EACgB,CAChB,GAAI,EAAe,MAAO,CAAE,oBAAqB,EAAG,8BAA+B,IAAA,EAAU,EAC7F,IAAM,EAAc,EAAkB,CAAQ,EAE9C,OADK,EACE,CACL,oBAAqB,IAAgB,EAAK,8BAAgC,EAAK,oBAAsB,EAAI,EACzG,8BAA+B,CACjC,EAJyB,CAAE,oBAAqB,EAAG,8BAA+B,IAAA,EAAU,CAK9F,CACA,SAAgB,EACd,EACA,EAC8B,CAC9B,GAAI,EAAS,iBAAmB,MAAQ,EAAK,qBAAuB,EAAS,eAC3E,MAAO,qBACT,GAAI,EAAS,kBAAoB,MAAQ,EAAK,qBAAuB,EAAS,gBAAiB,MAAO,aAExG,CACA,SAAgB,EACd,EACA,EACS,CACT,OAAO,EAAK,SAAW,UAAY,EAAmB,EAAM,CAAQ,IAAM,IAAA,EAC5E,CACA,SAAgB,EAAkB,EAAkD,CAClF,IAAM,EAAO,EAAS,IAAI,CAAW,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK;CAAI,EAChE,GAAI,CAAC,EAAM,OACX,IAAI,EAAO,WACX,IAAK,IAAM,KAAQ,EACjB,GAAQ,EAAK,YAAY,CAAC,GAAK,EAC/B,EAAO,KAAK,KAAK,EAAM,QAAQ,EAEjC,MAAO,IAAI,IAAS,EAAA,CAAG,SAAS,EAAE,CAAC,CAAC,SAAS,EAAG,GAAG,IAAI,OAAO,CAAC,CACjE,CACA,SAAS,EAAY,EAA0B,CAC7C,GAAI,CAAC,GAAW,OAAO,GAAY,SAAU,MAAO,GACpD,IAAM,EAAY,EAKlB,OAJI,EAAU,OAAS,IAAA,IAAa,EAAU,OAAS,YAAoB,GACvE,OAAO,EAAU,MAAS,SAAiB,EAAU,KACrD,OAAO,EAAU,SAAY,SAAiB,EAAU,QACvD,MAAM,QAAQ,EAAU,OAAO,EAC7B,EAAU,QACd,IAAK,GACJ,GAAQ,OAAO,GAAS,UAAY,OAAQ,EAA4B,MAAS,SAC5E,EAA0B,KAC3B,EACN,CAAC,CACA,KAAK,EAAE,EAPoC,EAQhD"}
@@ -0,0 +1,18 @@
1
+ import { ActiveGoal, SafetyPauseCause } from "../../types/goal.cjs";
2
+ //#region src/services/goal/safety.d.ts
3
+ interface SafetySettings {
4
+ automaticTurns: number | null;
5
+ noProgressTurns: number | null;
6
+ }
7
+ interface SafetyProgress {
8
+ toolFreeRepeatCount: number;
9
+ lastToolFreeOutputFingerprint?: string;
10
+ }
11
+ declare function resetGoalSafetyEpoch(goal: ActiveGoal, now?: number): ActiveGoal;
12
+ declare function nextToolFreeRepeatState(goal: Pick<ActiveGoal, 'toolFreeRepeatCount' | 'lastToolFreeOutputFingerprint'>, messages: readonly unknown[], toolAttempted: boolean): SafetyProgress;
13
+ declare function safetyLimitReached(goal: Pick<ActiveGoal, 'automaticModelTurns' | 'toolFreeRepeatCount'>, settings: SafetySettings): SafetyPauseCause | undefined;
14
+ declare function shouldPauseForSafety(goal: Pick<ActiveGoal, 'status' | 'automaticModelTurns' | 'toolFreeRepeatCount'>, settings: SafetySettings): boolean;
15
+ declare function outputFingerprint(messages: readonly unknown[]): string | undefined;
16
+ //#endregion
17
+ export { SafetyProgress, SafetySettings, nextToolFreeRepeatState, outputFingerprint, resetGoalSafetyEpoch, safetyLimitReached, shouldPauseForSafety };
18
+ //# sourceMappingURL=safety.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.d.cts","names":[],"sources":["../../../src/services/goal/safety.ts"],"mappings":";;UACiB;EACf;EACA;;UAEe;EACf;EACA;;iBAEc,qBAAqB,MAAM,YAAY,eAAmB;iBAW1D,wBACd,MAAM,KAAK,sEACX,8BACA,yBACC;iBASa,mBACd,MAAM,KAAK,4DACX,UAAU,iBACT;iBAMa,qBACd,MAAM,KAAK,uEACX,UAAU;iBAII,kBAAkB"}
@@ -0,0 +1,18 @@
1
+ import { ActiveGoal, SafetyPauseCause } from "../../types/goal.mjs";
2
+ //#region src/services/goal/safety.d.ts
3
+ interface SafetySettings {
4
+ automaticTurns: number | null;
5
+ noProgressTurns: number | null;
6
+ }
7
+ interface SafetyProgress {
8
+ toolFreeRepeatCount: number;
9
+ lastToolFreeOutputFingerprint?: string;
10
+ }
11
+ declare function resetGoalSafetyEpoch(goal: ActiveGoal, now?: number): ActiveGoal;
12
+ declare function nextToolFreeRepeatState(goal: Pick<ActiveGoal, 'toolFreeRepeatCount' | 'lastToolFreeOutputFingerprint'>, messages: readonly unknown[], toolAttempted: boolean): SafetyProgress;
13
+ declare function safetyLimitReached(goal: Pick<ActiveGoal, 'automaticModelTurns' | 'toolFreeRepeatCount'>, settings: SafetySettings): SafetyPauseCause | undefined;
14
+ declare function shouldPauseForSafety(goal: Pick<ActiveGoal, 'status' | 'automaticModelTurns' | 'toolFreeRepeatCount'>, settings: SafetySettings): boolean;
15
+ declare function outputFingerprint(messages: readonly unknown[]): string | undefined;
16
+ //#endregion
17
+ export { SafetyProgress, SafetySettings, nextToolFreeRepeatState, outputFingerprint, resetGoalSafetyEpoch, safetyLimitReached, shouldPauseForSafety };
18
+ //# sourceMappingURL=safety.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.d.mts","names":[],"sources":["../../../src/services/goal/safety.ts"],"mappings":";;UACiB;EACf;EACA;;UAEe;EACf;EACA;;iBAEc,qBAAqB,MAAM,YAAY,eAAmB;iBAW1D,wBACd,MAAM,KAAK,sEACX,8BACA,yBACC;iBASa,mBACd,MAAM,KAAK,4DACX,UAAU,iBACT;iBAMa,qBACd,MAAM,KAAK,uEACX,UAAU;iBAII,kBAAkB"}
@@ -0,0 +1,3 @@
1
+ function e(e,t=Date.now()){return{...e,automaticModelTurns:0,toolFreeRepeatCount:0,lastToolFreeOutputFingerprint:void 0,safetyPauseCause:void 0,safetyResetPending:void 0,updatedAt:t}}function t(e,t,n){if(n)return{toolFreeRepeatCount:0,lastToolFreeOutputFingerprint:void 0};let r=i(t);return r?{toolFreeRepeatCount:r===e.lastToolFreeOutputFingerprint?e.toolFreeRepeatCount+1:1,lastToolFreeOutputFingerprint:r}:{toolFreeRepeatCount:0,lastToolFreeOutputFingerprint:void 0}}function n(e,t){if(t.automaticTurns!==null&&e.automaticModelTurns>=t.automaticTurns)return`continuation_limit`;if(t.noProgressTurns!==null&&e.toolFreeRepeatCount>=t.noProgressTurns)return`no_progress`}function r(e,t){return e.status===`active`&&n(e,t)!==void 0}function i(e){let t=e.map(a).filter(Boolean).join(`
2
+ `);if(!t)return;let n=2166136261;for(let e of t)n^=e.codePointAt(0)??0,n=Math.imul(n,16777619);return`${(n>>>0).toString(16).padStart(8,`0`)}`.repeat(8)}function a(e){if(!e||typeof e!=`object`)return``;let t=e;return t.role!==void 0&&t.role!==`assistant`?``:typeof t.text==`string`?t.text:typeof t.content==`string`?t.content:Array.isArray(t.content)?t.content.map(e=>e&&typeof e==`object`&&typeof e.text==`string`?e.text:``).join(``):``}export{t as nextToolFreeRepeatState,i as outputFingerprint,e as resetGoalSafetyEpoch,n as safetyLimitReached,r as shouldPauseForSafety};
3
+ //# sourceMappingURL=safety.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.mjs","names":[],"sources":["../../../src/services/goal/safety.ts"],"sourcesContent":["import type { ActiveGoal, SafetyPauseCause } from '../../types/goal.ts';\nexport interface SafetySettings {\n automaticTurns: number | null;\n noProgressTurns: number | null;\n}\nexport interface SafetyProgress {\n toolFreeRepeatCount: number;\n lastToolFreeOutputFingerprint?: string;\n}\nexport function resetGoalSafetyEpoch(goal: ActiveGoal, now = Date.now()): ActiveGoal {\n return {\n ...goal,\n automaticModelTurns: 0,\n toolFreeRepeatCount: 0,\n lastToolFreeOutputFingerprint: undefined,\n safetyPauseCause: undefined,\n safetyResetPending: undefined,\n updatedAt: now,\n };\n}\nexport function nextToolFreeRepeatState(\n goal: Pick<ActiveGoal, 'toolFreeRepeatCount' | 'lastToolFreeOutputFingerprint'>,\n messages: readonly unknown[],\n toolAttempted: boolean,\n): SafetyProgress {\n if (toolAttempted) return { toolFreeRepeatCount: 0, lastToolFreeOutputFingerprint: undefined };\n const fingerprint = outputFingerprint(messages);\n if (!fingerprint) return { toolFreeRepeatCount: 0, lastToolFreeOutputFingerprint: undefined };\n return {\n toolFreeRepeatCount: fingerprint === goal.lastToolFreeOutputFingerprint ? goal.toolFreeRepeatCount + 1 : 1,\n lastToolFreeOutputFingerprint: fingerprint,\n };\n}\nexport function safetyLimitReached(\n goal: Pick<ActiveGoal, 'automaticModelTurns' | 'toolFreeRepeatCount'>,\n settings: SafetySettings,\n): SafetyPauseCause | undefined {\n if (settings.automaticTurns !== null && goal.automaticModelTurns >= settings.automaticTurns)\n return 'continuation_limit';\n if (settings.noProgressTurns !== null && goal.toolFreeRepeatCount >= settings.noProgressTurns) return 'no_progress';\n return undefined;\n}\nexport function shouldPauseForSafety(\n goal: Pick<ActiveGoal, 'status' | 'automaticModelTurns' | 'toolFreeRepeatCount'>,\n settings: SafetySettings,\n): boolean {\n return goal.status === 'active' && safetyLimitReached(goal, settings) !== undefined;\n}\nexport function outputFingerprint(messages: readonly unknown[]): string | undefined {\n const text = messages.map(messageText).filter(Boolean).join('\\n');\n if (!text) return undefined;\n let hash = 2166136261;\n for (const char of text) {\n hash ^= char.codePointAt(0) ?? 0;\n hash = Math.imul(hash, 16777619);\n }\n return `${(hash >>> 0).toString(16).padStart(8, '0')}`.repeat(8);\n}\nfunction messageText(message: unknown): string {\n if (!message || typeof message !== 'object') return '';\n const candidate = message as { role?: unknown; content?: unknown; text?: unknown };\n if (candidate.role !== undefined && candidate.role !== 'assistant') return '';\n if (typeof candidate.text === 'string') return candidate.text;\n if (typeof candidate.content === 'string') return candidate.content;\n if (!Array.isArray(candidate.content)) return '';\n return candidate.content\n .map((part) =>\n part && typeof part === 'object' && typeof (part as { text?: unknown }).text === 'string'\n ? (part as { text: string }).text\n : '',\n )\n .join('');\n}\n"],"mappings":"AASA,SAAgB,EAAqB,EAAkB,EAAM,KAAK,IAAI,EAAe,CACnF,MAAO,CACL,GAAG,EACH,oBAAqB,EACrB,oBAAqB,EACrB,8BAA+B,IAAA,GAC/B,iBAAkB,IAAA,GAClB,mBAAoB,IAAA,GACpB,UAAW,CACb,CACF,CACA,SAAgB,EACd,EACA,EACA,EACgB,CAChB,GAAI,EAAe,MAAO,CAAE,oBAAqB,EAAG,8BAA+B,IAAA,EAAU,EAC7F,IAAM,EAAc,EAAkB,CAAQ,EAE9C,OADK,EACE,CACL,oBAAqB,IAAgB,EAAK,8BAAgC,EAAK,oBAAsB,EAAI,EACzG,8BAA+B,CACjC,EAJyB,CAAE,oBAAqB,EAAG,8BAA+B,IAAA,EAAU,CAK9F,CACA,SAAgB,EACd,EACA,EAC8B,CAC9B,GAAI,EAAS,iBAAmB,MAAQ,EAAK,qBAAuB,EAAS,eAC3E,MAAO,qBACT,GAAI,EAAS,kBAAoB,MAAQ,EAAK,qBAAuB,EAAS,gBAAiB,MAAO,aAExG,CACA,SAAgB,EACd,EACA,EACS,CACT,OAAO,EAAK,SAAW,UAAY,EAAmB,EAAM,CAAQ,IAAM,IAAA,EAC5E,CACA,SAAgB,EAAkB,EAAkD,CAClF,IAAM,EAAO,EAAS,IAAI,CAAW,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK;CAAI,EAChE,GAAI,CAAC,EAAM,OACX,IAAI,EAAO,WACX,IAAK,IAAM,KAAQ,EACjB,GAAQ,EAAK,YAAY,CAAC,GAAK,EAC/B,EAAO,KAAK,KAAK,EAAM,QAAQ,EAEjC,MAAO,IAAI,IAAS,EAAA,CAAG,SAAS,EAAE,CAAC,CAAC,SAAS,EAAG,GAAG,IAAI,OAAO,CAAC,CACjE,CACA,SAAS,EAAY,EAA0B,CAC7C,GAAI,CAAC,GAAW,OAAO,GAAY,SAAU,MAAO,GACpD,IAAM,EAAY,EAKlB,OAJI,EAAU,OAAS,IAAA,IAAa,EAAU,OAAS,YAAoB,GACvE,OAAO,EAAU,MAAS,SAAiB,EAAU,KACrD,OAAO,EAAU,SAAY,SAAiB,EAAU,QACvD,MAAM,QAAQ,EAAU,OAAO,EAC7B,EAAU,QACd,IAAK,GACJ,GAAQ,OAAO,GAAS,UAAY,OAAQ,EAA4B,MAAS,SAC5E,EAA0B,KAC3B,EACN,CAAC,CACA,KAAK,EAAE,EAPoC,EAQhD"}
@@ -0,0 +1,2 @@
1
+ const e={toolVisibility:`operational`,experimental:{goals:!1},continuationLimits:{automaticTurns:null,noProgressTurns:3}};function t(e){if(!a(e))return;let t=n(e.toolVisibility);if(!t||e.experimental!==void 0&&!a(e.experimental))return;let r=a(e.experimental)?e.experimental.goals??!1:!1;if(typeof r!=`boolean`||e.continuationLimits!==void 0&&!a(e.continuationLimits))return;let o=a(e.continuationLimits)?e.continuationLimits:{},s=i(o.automaticTurns,null),c=i(o.noProgressTurns,3);if(s!==void 0&&c!==void 0)return{toolVisibility:t,experimental:{goals:r},continuationLimits:{automaticTurns:s,noProgressTurns:c}}}function n(e){return e===void 0||e===`always`||e===`after-first-goal`||e===`operational`?`operational`:void 0}function r(e){let n=t(e);return n?{kind:`loaded`,settings:n}:{kind:`invalid`,reason:`invalid Goal settings shape`}}function i(e,t){return e===void 0?t:e===null?null:typeof e==`number`&&Number.isSafeInteger(e)&&e>0?e:void 0}function a(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}exports.DEFAULT_GOAL_SETTINGS=e,exports.decodeGoalSettings=r,exports.normalizeGoalSettings=t,exports.normalizeToolVisibility=n;
2
+ //# sourceMappingURL=settings.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.cjs","names":[],"sources":["../../../src/services/goal/settings.ts"],"sourcesContent":["import type { GoalToolVisibility } from '../../types/settings.ts';\nexport interface GoalSettings {\n toolVisibility: GoalToolVisibility;\n experimental: { goals: boolean };\n continuationLimits: { automaticTurns: number | null; noProgressTurns: number | null };\n}\nexport const DEFAULT_GOAL_SETTINGS: GoalSettings = {\n toolVisibility: 'operational',\n experimental: { goals: false },\n continuationLimits: { automaticTurns: null, noProgressTurns: 3 },\n};\nexport interface GoalSettingsLoadResult {\n kind: 'missing' | 'invalid' | 'loaded';\n settings?: GoalSettings;\n reason?: string;\n}\nexport function normalizeGoalSettings(value: unknown): GoalSettings | undefined {\n if (!record(value)) return undefined;\n const toolVisibility = normalizeToolVisibility(value.toolVisibility);\n if (!toolVisibility) return undefined;\n if (value.experimental !== undefined && !record(value.experimental)) return undefined;\n const goals = record(value.experimental) ? (value.experimental.goals ?? false) : false;\n if (typeof goals !== 'boolean') return undefined;\n if (value.continuationLimits !== undefined && !record(value.continuationLimits)) return undefined;\n const limits = record(value.continuationLimits) ? value.continuationLimits : {};\n const automaticTurns = normalizeLimit(limits.automaticTurns, null);\n const noProgressTurns = normalizeLimit(limits.noProgressTurns, 3);\n if (automaticTurns === undefined || noProgressTurns === undefined) return undefined;\n return { toolVisibility, experimental: { goals }, continuationLimits: { automaticTurns, noProgressTurns } };\n}\nexport function normalizeToolVisibility(value: unknown): GoalToolVisibility | undefined {\n return value === undefined || value === 'always' || value === 'after-first-goal' || value === 'operational'\n ? 'operational'\n : undefined;\n}\nexport function decodeGoalSettings(value: unknown): GoalSettingsLoadResult {\n const settings = normalizeGoalSettings(value);\n return settings ? { kind: 'loaded', settings } : { kind: 'invalid', reason: 'invalid Goal settings shape' };\n}\nfunction normalizeLimit(value: unknown, fallback: number | null): number | null | undefined {\n if (value === undefined) return fallback;\n if (value === null) return null;\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0 ? value : undefined;\n}\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":"AAMA,MAAa,EAAsC,CACjD,eAAgB,cAChB,aAAc,CAAE,MAAO,EAAM,EAC7B,mBAAoB,CAAE,eAAgB,KAAM,gBAAiB,CAAE,CACjE,EAMA,SAAgB,EAAsB,EAA0C,CAC9E,GAAI,CAAC,EAAO,CAAK,EAAG,OACpB,IAAM,EAAiB,EAAwB,EAAM,cAAc,EAEnE,GADI,CAAC,GACD,EAAM,eAAiB,IAAA,IAAa,CAAC,EAAO,EAAM,YAAY,EAAG,OACrE,IAAM,EAAQ,EAAO,EAAM,YAAY,EAAK,EAAM,aAAa,OAAS,GAAS,GAEjF,GADI,OAAO,GAAU,WACjB,EAAM,qBAAuB,IAAA,IAAa,CAAC,EAAO,EAAM,kBAAkB,EAAG,OACjF,IAAM,EAAS,EAAO,EAAM,kBAAkB,EAAI,EAAM,mBAAqB,CAAC,EACxE,EAAiB,EAAe,EAAO,eAAgB,IAAI,EAC3D,EAAkB,EAAe,EAAO,gBAAiB,CAAC,EAC5D,OAAmB,IAAA,IAAa,IAAoB,IAAA,GACxD,MAAO,CAAE,iBAAgB,aAAc,CAAE,OAAM,EAAG,mBAAoB,CAAE,iBAAgB,iBAAgB,CAAE,CAC5G,CACA,SAAgB,EAAwB,EAAgD,CACtF,OAAO,IAAU,IAAA,IAAa,IAAU,UAAY,IAAU,oBAAsB,IAAU,cAC1F,cACA,IAAA,EACN,CACA,SAAgB,EAAmB,EAAwC,CACzE,IAAM,EAAW,EAAsB,CAAK,EAC5C,OAAO,EAAW,CAAE,KAAM,SAAU,UAAS,EAAI,CAAE,KAAM,UAAW,OAAQ,6BAA8B,CAC5G,CACA,SAAS,EAAe,EAAgB,EAAoD,CAG1F,OAFI,IAAU,IAAA,GAAkB,EAC5B,IAAU,KAAa,KACpB,OAAO,GAAU,UAAY,OAAO,cAAc,CAAK,GAAK,EAAQ,EAAI,EAAQ,IAAA,EACzF,CACA,SAAS,EAAO,EAAkD,CAChE,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,CAC5E"}
@@ -0,0 +1,24 @@
1
+ import { GoalToolVisibility } from "../../types/settings.cjs";
2
+ //#region src/services/goal/settings.d.ts
3
+ interface GoalSettings {
4
+ toolVisibility: GoalToolVisibility;
5
+ experimental: {
6
+ goals: boolean;
7
+ };
8
+ continuationLimits: {
9
+ automaticTurns: number | null;
10
+ noProgressTurns: number | null;
11
+ };
12
+ }
13
+ declare const DEFAULT_GOAL_SETTINGS: GoalSettings;
14
+ interface GoalSettingsLoadResult {
15
+ kind: 'missing' | 'invalid' | 'loaded';
16
+ settings?: GoalSettings;
17
+ reason?: string;
18
+ }
19
+ declare function normalizeGoalSettings(value: unknown): GoalSettings | undefined;
20
+ declare function normalizeToolVisibility(value: unknown): GoalToolVisibility | undefined;
21
+ declare function decodeGoalSettings(value: unknown): GoalSettingsLoadResult;
22
+ //#endregion
23
+ export { DEFAULT_GOAL_SETTINGS, GoalSettings, GoalSettingsLoadResult, decodeGoalSettings, normalizeGoalSettings, normalizeToolVisibility };
24
+ //# sourceMappingURL=settings.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.cts","names":[],"sources":["../../../src/services/goal/settings.ts"],"mappings":";;UACiB;EACf,gBAAgB;EAChB;IAAgB;;EAChB;IAAsB;IAA+B;;;cAE1C,uBAAuB;UAKnB;EACf;EACA,WAAW;EACX;;iBAEc,sBAAsB,iBAAiB;iBAcvC,wBAAwB,iBAAiB;iBAKzC,mBAAmB,iBAAiB"}
@@ -0,0 +1,24 @@
1
+ import { GoalToolVisibility } from "../../types/settings.mjs";
2
+ //#region src/services/goal/settings.d.ts
3
+ interface GoalSettings {
4
+ toolVisibility: GoalToolVisibility;
5
+ experimental: {
6
+ goals: boolean;
7
+ };
8
+ continuationLimits: {
9
+ automaticTurns: number | null;
10
+ noProgressTurns: number | null;
11
+ };
12
+ }
13
+ declare const DEFAULT_GOAL_SETTINGS: GoalSettings;
14
+ interface GoalSettingsLoadResult {
15
+ kind: 'missing' | 'invalid' | 'loaded';
16
+ settings?: GoalSettings;
17
+ reason?: string;
18
+ }
19
+ declare function normalizeGoalSettings(value: unknown): GoalSettings | undefined;
20
+ declare function normalizeToolVisibility(value: unknown): GoalToolVisibility | undefined;
21
+ declare function decodeGoalSettings(value: unknown): GoalSettingsLoadResult;
22
+ //#endregion
23
+ export { DEFAULT_GOAL_SETTINGS, GoalSettings, GoalSettingsLoadResult, decodeGoalSettings, normalizeGoalSettings, normalizeToolVisibility };
24
+ //# sourceMappingURL=settings.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.mts","names":[],"sources":["../../../src/services/goal/settings.ts"],"mappings":";;UACiB;EACf,gBAAgB;EAChB;IAAgB;;EAChB;IAAsB;IAA+B;;;cAE1C,uBAAuB;UAKnB;EACf;EACA,WAAW;EACX;;iBAEc,sBAAsB,iBAAiB;iBAcvC,wBAAwB,iBAAiB;iBAKzC,mBAAmB,iBAAiB"}
@@ -0,0 +1,2 @@
1
+ const e={toolVisibility:`operational`,experimental:{goals:!1},continuationLimits:{automaticTurns:null,noProgressTurns:3}};function t(e){if(!a(e))return;let t=n(e.toolVisibility);if(!t||e.experimental!==void 0&&!a(e.experimental))return;let r=a(e.experimental)?e.experimental.goals??!1:!1;if(typeof r!=`boolean`||e.continuationLimits!==void 0&&!a(e.continuationLimits))return;let o=a(e.continuationLimits)?e.continuationLimits:{},s=i(o.automaticTurns,null),c=i(o.noProgressTurns,3);if(s!==void 0&&c!==void 0)return{toolVisibility:t,experimental:{goals:r},continuationLimits:{automaticTurns:s,noProgressTurns:c}}}function n(e){return e===void 0||e===`always`||e===`after-first-goal`||e===`operational`?`operational`:void 0}function r(e){let n=t(e);return n?{kind:`loaded`,settings:n}:{kind:`invalid`,reason:`invalid Goal settings shape`}}function i(e,t){return e===void 0?t:e===null?null:typeof e==`number`&&Number.isSafeInteger(e)&&e>0?e:void 0}function a(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{e as DEFAULT_GOAL_SETTINGS,r as decodeGoalSettings,t as normalizeGoalSettings,n as normalizeToolVisibility};
2
+ //# sourceMappingURL=settings.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.mjs","names":[],"sources":["../../../src/services/goal/settings.ts"],"sourcesContent":["import type { GoalToolVisibility } from '../../types/settings.ts';\nexport interface GoalSettings {\n toolVisibility: GoalToolVisibility;\n experimental: { goals: boolean };\n continuationLimits: { automaticTurns: number | null; noProgressTurns: number | null };\n}\nexport const DEFAULT_GOAL_SETTINGS: GoalSettings = {\n toolVisibility: 'operational',\n experimental: { goals: false },\n continuationLimits: { automaticTurns: null, noProgressTurns: 3 },\n};\nexport interface GoalSettingsLoadResult {\n kind: 'missing' | 'invalid' | 'loaded';\n settings?: GoalSettings;\n reason?: string;\n}\nexport function normalizeGoalSettings(value: unknown): GoalSettings | undefined {\n if (!record(value)) return undefined;\n const toolVisibility = normalizeToolVisibility(value.toolVisibility);\n if (!toolVisibility) return undefined;\n if (value.experimental !== undefined && !record(value.experimental)) return undefined;\n const goals = record(value.experimental) ? (value.experimental.goals ?? false) : false;\n if (typeof goals !== 'boolean') return undefined;\n if (value.continuationLimits !== undefined && !record(value.continuationLimits)) return undefined;\n const limits = record(value.continuationLimits) ? value.continuationLimits : {};\n const automaticTurns = normalizeLimit(limits.automaticTurns, null);\n const noProgressTurns = normalizeLimit(limits.noProgressTurns, 3);\n if (automaticTurns === undefined || noProgressTurns === undefined) return undefined;\n return { toolVisibility, experimental: { goals }, continuationLimits: { automaticTurns, noProgressTurns } };\n}\nexport function normalizeToolVisibility(value: unknown): GoalToolVisibility | undefined {\n return value === undefined || value === 'always' || value === 'after-first-goal' || value === 'operational'\n ? 'operational'\n : undefined;\n}\nexport function decodeGoalSettings(value: unknown): GoalSettingsLoadResult {\n const settings = normalizeGoalSettings(value);\n return settings ? { kind: 'loaded', settings } : { kind: 'invalid', reason: 'invalid Goal settings shape' };\n}\nfunction normalizeLimit(value: unknown, fallback: number | null): number | null | undefined {\n if (value === undefined) return fallback;\n if (value === null) return null;\n return typeof value === 'number' && Number.isSafeInteger(value) && value > 0 ? value : undefined;\n}\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":"AAMA,MAAa,EAAsC,CACjD,eAAgB,cAChB,aAAc,CAAE,MAAO,EAAM,EAC7B,mBAAoB,CAAE,eAAgB,KAAM,gBAAiB,CAAE,CACjE,EAMA,SAAgB,EAAsB,EAA0C,CAC9E,GAAI,CAAC,EAAO,CAAK,EAAG,OACpB,IAAM,EAAiB,EAAwB,EAAM,cAAc,EAEnE,GADI,CAAC,GACD,EAAM,eAAiB,IAAA,IAAa,CAAC,EAAO,EAAM,YAAY,EAAG,OACrE,IAAM,EAAQ,EAAO,EAAM,YAAY,EAAK,EAAM,aAAa,OAAS,GAAS,GAEjF,GADI,OAAO,GAAU,WACjB,EAAM,qBAAuB,IAAA,IAAa,CAAC,EAAO,EAAM,kBAAkB,EAAG,OACjF,IAAM,EAAS,EAAO,EAAM,kBAAkB,EAAI,EAAM,mBAAqB,CAAC,EACxE,EAAiB,EAAe,EAAO,eAAgB,IAAI,EAC3D,EAAkB,EAAe,EAAO,gBAAiB,CAAC,EAC5D,OAAmB,IAAA,IAAa,IAAoB,IAAA,GACxD,MAAO,CAAE,iBAAgB,aAAc,CAAE,OAAM,EAAG,mBAAoB,CAAE,iBAAgB,iBAAgB,CAAE,CAC5G,CACA,SAAgB,EAAwB,EAAgD,CACtF,OAAO,IAAU,IAAA,IAAa,IAAU,UAAY,IAAU,oBAAsB,IAAU,cAC1F,cACA,IAAA,EACN,CACA,SAAgB,EAAmB,EAAwC,CACzE,IAAM,EAAW,EAAsB,CAAK,EAC5C,OAAO,EAAW,CAAE,KAAM,SAAU,UAAS,EAAI,CAAE,KAAM,UAAW,OAAQ,6BAA8B,CAC5G,CACA,SAAS,EAAe,EAAgB,EAAoD,CAG1F,OAFI,IAAU,IAAA,GAAkB,EAC5B,IAAU,KAAa,KACpB,OAAO,GAAU,UAAY,OAAO,cAAc,CAAK,GAAK,EAAQ,EAAI,EAAQ,IAAA,EACzF,CACA,SAAS,EAAO,EAAkD,CAChE,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,CAC5E"}
@@ -0,0 +1,2 @@
1
+ const e=require("./accounting.cjs");require("./parser.cjs");function t(e,t=[],n){return{goal:e??null,...t.length?{queue:t.map(e=>({...e}))}:{},...n?{pendingAction:{...n}}:{}}}function n(e){let t=[...e].reverse().find(e=>e.type===`custom`&&e.customType===`goal-state`);if(t)return o(t.data);let n=[...e].reverse().find(e=>e.type===`custom`&&e.customType===`goals-state`);return n?s(n.data):b(`none`)}function r(e){return n(e.sessionManager?.getBranch?.()??e.sessionManager?.getEntries?.()??[])}function i(t,n=Date.now()){return{...t,startedAt:h(t.startedAt)?t.startedAt:n,updatedAt:h(t.updatedAt)?t.updatedAt:n,iteration:g(t.iteration),tokenBudget:e.normalizeTokenBudget(t.tokenBudget),tokensUsed:e.nonNegativeFiniteNumber(t.tokensUsed),timeUsedSeconds:e.nonNegativeFiniteNumber(t.timeUsedSeconds),baselineTokens:e.nonNegativeFiniteNumber(t.baselineTokens),activeStartedAt:t.status===`active`?h(t.activeStartedAt)?t.activeStartedAt:n:void 0,automaticModelTurns:g(t.automaticModelTurns),toolFreeRepeatCount:g(t.toolFreeRepeatCount),lastToolFreeOutputFingerprint:_(t.lastToolFreeOutputFingerprint),safetyPauseCause:v(t.safetyPauseCause),safetyResetPending:t.safetyResetPending===!0||void 0}}function a(e){return!o(e).malformed}function o(e){if(!y(e)||!Object.hasOwn(e,`goal`))return b(`canonical`,!0);let t=e.goal;if(t!==null&&!d(t))return b(`canonical`,!0);let n=e.queue;if(n!==void 0&&(!Array.isArray(n)||!n.every(f)))return b(`canonical`,!0);let r=e.pendingAction,a=r===void 0?void 0:l(r);if(r!==void 0&&!a)return b(`canonical`,!0);if(t===null)return b(`canonical`);let o=i(t);if(o.status===`complete`&&!a)return b(`canonical`);let s=(n??[]).map(c);return o.status===`queued`&&!s.length&&!a?b(`canonical`,!0):{goal:o,queue:s,pendingAction:a,hasExperimentalQueueState:o.status===`queued`||s.length>0||a!==void 0,source:`canonical`,malformed:!1}}function s(e){if(!y(e))return b(`legacy-goals`,!0);let t=Array.isArray(e.goals)?e.goals:d(e.goal)?[e.goal]:[];if(!t.every(d))return b(`legacy-goals`,!0);let n=e.pendingUnshift===void 0?void 0:u(e.pendingUnshift);if(e.pendingUnshift!==void 0&&!n)return b(`legacy-goals`,!0);let r=t.filter(e=>e.status!==`complete`);if(!r.length)return b(`legacy-goals`);let a=r.map((e,t)=>t===0?i(e):c(e));return{goal:a[0],queue:a.slice(1),pendingAction:n,hasExperimentalQueueState:a.length>1||a[0]?.status===`queued`||n!==void 0,source:`legacy-goals`,malformed:!1}}function c(e){let t=i(e);return{...t,status:t.status===`active`?`queued`:t.status,activeStartedAt:void 0}}function l(t){if(y(t)){if(t.kind===`prioritize`)return!p(t.objective)||t.tokenBudget!==void 0&&!e.normalizeTokenBudget(t.tokenBudget)||t.displacedUsageFinalized!==void 0&&typeof t.displacedUsageFinalized!=`boolean`?void 0:{kind:`prioritize`,objective:t.objective,tokenBudget:e.normalizeTokenBudget(t.tokenBudget),...t.displacedUsageFinalized===!0?{displacedUsageFinalized:!0}:{}};if(t.kind===`advance`&&typeof t.goalId==`string`&&t.goalId.trim()===t.goalId&&t.goalId&&(t.reason===`complete`||t.reason===`skip`)&&p(t.completedText))return{kind:`advance`,goalId:t.goalId,reason:t.reason,completedText:t.completedText}}}function u(t){return y(t)&&p(t.objective)?{kind:`prioritize`,objective:t.objective,tokenBudget:e.normalizeTokenBudget(t.tokenBudget)}:void 0}function d(t){return y(t)?typeof t.id==`string`&&t.id.length>0&&t.id.trim()===t.id&&p(t.text)&&m(t.status)&&h(t.startedAt)&&h(t.updatedAt)&&typeof t.iteration==`number`&&Number.isFinite(t.iteration)&&e.isNonNegativeFiniteNumber(t.tokensUsed)&&e.isNonNegativeFiniteNumber(t.timeUsedSeconds)&&e.isNonNegativeFiniteNumber(t.baselineTokens)&&(t.tokenBudget===void 0||e.normalizeTokenBudget(t.tokenBudget)!==void 0)&&(t.activeStartedAt===void 0||h(t.activeStartedAt)):!1}function f(e){return d(e)&&e.status!==`complete`}function p(e){return typeof e==`string`&&e.trim().length>0&&e.length<=4e3}function m(e){return e===`active`||e===`queued`||e===`paused`||e===`blocked`||e===`usage_limited`||e===`budget_limited`||e===`complete`}function h(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function g(e){return typeof e==`number`&&Number.isSafeInteger(e)&&e>=0?e:0}function _(e){return typeof e==`string`&&/^[a-f0-9]{64}$/u.test(e)?e:void 0}function v(e){return e===`continuation_limit`||e===`no_progress`?e:void 0}function y(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function b(e,t=!1){return{goal:void 0,queue:[],pendingAction:void 0,hasExperimentalQueueState:!1,source:e,malformed:t}}exports.GOAL_STATE_ENTRY_TYPE=`goal-state`,exports.LEGACY_GOAL_STATE_ENTRY_TYPE=`goals-state`,exports.decodeGoalStateEntries=n,exports.isCanonicalGoalState=a,exports.loadGoalStateFromSession=r,exports.normalizeLoadedGoal=i,exports.serializeGoalState=t;
2
+ //# sourceMappingURL=stateCodec.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateCodec.cjs","names":["normalizeTokenBudget","nonNegativeFiniteNumber","isNonNegativeFiniteNumber"],"sources":["../../../src/services/goal/stateCodec.ts"],"sourcesContent":["import type {\n ActiveGoal,\n GoalStateData,\n LoadedGoalState,\n PendingQueueAction,\n SafetyPauseCause,\n} from '../../types/goal.ts';\nimport { isNonNegativeFiniteNumber, nonNegativeFiniteNumber, normalizeTokenBudget } from './accounting.ts';\nimport { MAX_OBJECTIVE_LENGTH } from './parser.ts';\nexport const GOAL_STATE_ENTRY_TYPE = 'goal-state';\nexport const LEGACY_GOAL_STATE_ENTRY_TYPE = 'goals-state';\nexport interface SessionEntryLike {\n type?: unknown;\n customType?: unknown;\n data?: unknown;\n}\nexport function serializeGoalState(\n goal: ActiveGoal | undefined,\n queue: readonly ActiveGoal[] = [],\n pendingAction?: PendingQueueAction,\n): GoalStateData {\n return {\n goal: goal ?? null,\n ...(queue.length ? { queue: queue.map((item) => ({ ...item })) } : {}),\n ...(pendingAction ? { pendingAction: { ...pendingAction } } : {}),\n };\n}\nexport function decodeGoalStateEntries(entries: readonly SessionEntryLike[]): LoadedGoalState {\n const canonical = [...entries]\n .reverse()\n .find((entry) => entry.type === 'custom' && entry.customType === GOAL_STATE_ENTRY_TYPE);\n if (canonical) return decodeCanonical(canonical.data);\n const legacy = [...entries]\n .reverse()\n .find((entry) => entry.type === 'custom' && entry.customType === LEGACY_GOAL_STATE_ENTRY_TYPE);\n return legacy ? decodeLegacy(legacy.data) : empty('none');\n}\nexport function loadGoalStateFromSession(context: {\n sessionManager?: { getBranch?: () => SessionEntryLike[]; getEntries?: () => SessionEntryLike[] };\n}): LoadedGoalState {\n return decodeGoalStateEntries(context.sessionManager?.getBranch?.() ?? context.sessionManager?.getEntries?.() ?? []);\n}\nexport function normalizeLoadedGoal(goal: ActiveGoal, now = Date.now()): ActiveGoal {\n return {\n ...goal,\n startedAt: timestamp(goal.startedAt) ? goal.startedAt : now,\n updatedAt: timestamp(goal.updatedAt) ? goal.updatedAt : now,\n iteration: counter(goal.iteration),\n tokenBudget: normalizeTokenBudget(goal.tokenBudget),\n tokensUsed: nonNegativeFiniteNumber(goal.tokensUsed),\n timeUsedSeconds: nonNegativeFiniteNumber(goal.timeUsedSeconds),\n baselineTokens: nonNegativeFiniteNumber(goal.baselineTokens),\n activeStartedAt:\n goal.status === 'active' ? (timestamp(goal.activeStartedAt) ? goal.activeStartedAt : now) : undefined,\n automaticModelTurns: counter(goal.automaticModelTurns),\n toolFreeRepeatCount: counter(goal.toolFreeRepeatCount),\n lastToolFreeOutputFingerprint: fingerprint(goal.lastToolFreeOutputFingerprint),\n safetyPauseCause: cause(goal.safetyPauseCause),\n safetyResetPending: goal.safetyResetPending === true ? true : undefined,\n };\n}\nexport function isCanonicalGoalState(value: unknown): value is GoalStateData {\n return !decodeCanonical(value).malformed;\n}\nfunction decodeCanonical(value: unknown): LoadedGoalState {\n if (!record(value) || !Object.hasOwn(value, 'goal')) return empty('canonical', true);\n const rawGoal = value.goal;\n if (rawGoal !== null && !isGoal(rawGoal)) return empty('canonical', true);\n const queueValue = value.queue;\n if (queueValue !== undefined && (!Array.isArray(queueValue) || !queueValue.every(isQueueGoal)))\n return empty('canonical', true);\n const pendingValue = value.pendingAction;\n const pending = pendingValue === undefined ? undefined : normalizePending(pendingValue);\n if (pendingValue !== undefined && !pending) return empty('canonical', true);\n if (rawGoal === null) return empty('canonical');\n const goal = normalizeLoadedGoal(rawGoal);\n if (goal.status === 'complete' && !pending) return empty('canonical');\n const queue = (queueValue ?? []).map(normalizeQueued);\n if (goal.status === 'queued' && !queue.length && !pending) return empty('canonical', true);\n return {\n goal,\n queue,\n pendingAction: pending,\n hasExperimentalQueueState: goal.status === 'queued' || queue.length > 0 || pending !== undefined,\n source: 'canonical',\n malformed: false,\n };\n}\nfunction decodeLegacy(value: unknown): LoadedGoalState {\n if (!record(value)) return empty('legacy-goals', true);\n const rawGoals = Array.isArray(value.goals) ? value.goals : isGoal(value.goal) ? [value.goal] : [];\n if (!rawGoals.every(isGoal)) return empty('legacy-goals', true);\n const pending = value.pendingUnshift === undefined ? undefined : normalizeLegacyPending(value.pendingUnshift);\n if (value.pendingUnshift !== undefined && !pending) return empty('legacy-goals', true);\n const goals = rawGoals.filter((goal) => goal.status !== 'complete');\n if (!goals.length) return empty('legacy-goals');\n const normalized = goals.map((goal, index) => (index === 0 ? normalizeLoadedGoal(goal) : normalizeQueued(goal)));\n return {\n goal: normalized[0],\n queue: normalized.slice(1),\n pendingAction: pending,\n hasExperimentalQueueState: normalized.length > 1 || normalized[0]?.status === 'queued' || pending !== undefined,\n source: 'legacy-goals',\n malformed: false,\n };\n}\nfunction normalizeQueued(goal: ActiveGoal): ActiveGoal {\n const normalized = normalizeLoadedGoal(goal);\n return {\n ...normalized,\n status: normalized.status === 'active' ? 'queued' : normalized.status,\n activeStartedAt: undefined,\n };\n}\nfunction normalizePending(value: unknown): PendingQueueAction | undefined {\n if (!record(value)) return undefined;\n if (value.kind === 'prioritize') {\n if (\n !validObjective(value.objective) ||\n (value.tokenBudget !== undefined && !normalizeTokenBudget(value.tokenBudget)) ||\n (value.displacedUsageFinalized !== undefined && typeof value.displacedUsageFinalized !== 'boolean')\n )\n return undefined;\n return {\n kind: 'prioritize',\n objective: value.objective,\n tokenBudget: normalizeTokenBudget(value.tokenBudget),\n ...(value.displacedUsageFinalized === true ? { displacedUsageFinalized: true } : {}),\n };\n }\n if (\n value.kind === 'advance' &&\n typeof value.goalId === 'string' &&\n value.goalId.trim() === value.goalId &&\n value.goalId &&\n (value.reason === 'complete' || value.reason === 'skip') &&\n validObjective(value.completedText)\n )\n return { kind: 'advance', goalId: value.goalId, reason: value.reason, completedText: value.completedText };\n return undefined;\n}\nfunction normalizeLegacyPending(value: unknown): PendingQueueAction | undefined {\n return record(value) && validObjective(value.objective)\n ? { kind: 'prioritize', objective: value.objective, tokenBudget: normalizeTokenBudget(value.tokenBudget) }\n : undefined;\n}\nfunction isGoal(value: unknown): value is ActiveGoal {\n if (!record(value)) return false;\n return (\n typeof value.id === 'string' &&\n value.id.length > 0 &&\n value.id.trim() === value.id &&\n validObjective(value.text) &&\n status(value.status) &&\n timestamp(value.startedAt) &&\n timestamp(value.updatedAt) &&\n typeof value.iteration === 'number' &&\n Number.isFinite(value.iteration) &&\n isNonNegativeFiniteNumber(value.tokensUsed) &&\n isNonNegativeFiniteNumber(value.timeUsedSeconds) &&\n isNonNegativeFiniteNumber(value.baselineTokens) &&\n (value.tokenBudget === undefined || normalizeTokenBudget(value.tokenBudget) !== undefined) &&\n (value.activeStartedAt === undefined || timestamp(value.activeStartedAt))\n );\n}\nfunction isQueueGoal(value: unknown): value is ActiveGoal {\n return isGoal(value) && value.status !== 'complete';\n}\nfunction validObjective(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0 && value.length <= MAX_OBJECTIVE_LENGTH;\n}\nfunction status(value: unknown): value is ActiveGoal['status'] {\n return (\n value === 'active' ||\n value === 'queued' ||\n value === 'paused' ||\n value === 'blocked' ||\n value === 'usage_limited' ||\n value === 'budget_limited' ||\n value === 'complete'\n );\n}\nfunction timestamp(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0;\n}\nfunction counter(value: unknown): number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : 0;\n}\nfunction fingerprint(value: unknown): string | undefined {\n return typeof value === 'string' && /^[a-f0-9]{64}$/u.test(value) ? value : undefined;\n}\nfunction cause(value: unknown): SafetyPauseCause | undefined {\n return value === 'continuation_limit' || value === 'no_progress' ? value : undefined;\n}\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\nfunction empty(source: LoadedGoalState['source'], malformed = false): LoadedGoalState {\n return { goal: undefined, queue: [], pendingAction: undefined, hasExperimentalQueueState: false, source, malformed };\n}\n"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { ActiveGoal, GoalStateData, LoadedGoalState, PendingQueueAction } from "../../types/goal.cjs";
2
+ //#region src/services/goal/stateCodec.d.ts
3
+ declare const GOAL_STATE_ENTRY_TYPE = "goal-state";
4
+ declare const LEGACY_GOAL_STATE_ENTRY_TYPE = "goals-state";
5
+ interface SessionEntryLike {
6
+ type?: unknown;
7
+ customType?: unknown;
8
+ data?: unknown;
9
+ }
10
+ declare function serializeGoalState(goal: ActiveGoal | undefined, queue?: readonly ActiveGoal[], pendingAction?: PendingQueueAction): GoalStateData;
11
+ declare function decodeGoalStateEntries(entries: readonly SessionEntryLike[]): LoadedGoalState;
12
+ declare function loadGoalStateFromSession(context: {
13
+ sessionManager?: {
14
+ getBranch?: () => SessionEntryLike[];
15
+ getEntries?: () => SessionEntryLike[];
16
+ };
17
+ }): LoadedGoalState;
18
+ declare function normalizeLoadedGoal(goal: ActiveGoal, now?: number): ActiveGoal;
19
+ declare function isCanonicalGoalState(value: unknown): value is GoalStateData;
20
+ //#endregion
21
+ export { GOAL_STATE_ENTRY_TYPE, LEGACY_GOAL_STATE_ENTRY_TYPE, SessionEntryLike, decodeGoalStateEntries, isCanonicalGoalState, loadGoalStateFromSession, normalizeLoadedGoal, serializeGoalState };
22
+ //# sourceMappingURL=stateCodec.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateCodec.d.cts","names":[],"sources":["../../../src/services/goal/stateCodec.ts"],"mappings":";;cASa;cACA;UACI;EACf;EACA;EACA;;iBAEc,mBACd,MAAM,wBACN,iBAAgB,cAChB,gBAAgB,qBACf;iBAOa,uBAAuB,kBAAkB,qBAAqB;iBAU9D,yBAAyB;EACvC;IAAmB,kBAAkB;IAAoB,mBAAmB;;IAC1E;iBAGY,oBAAoB,MAAM,YAAY,eAAmB;iBAmBzD,qBAAqB,iBAAiB,SAAS"}
@@ -0,0 +1,22 @@
1
+ import { ActiveGoal, GoalStateData, LoadedGoalState, PendingQueueAction } from "../../types/goal.mjs";
2
+ //#region src/services/goal/stateCodec.d.ts
3
+ declare const GOAL_STATE_ENTRY_TYPE = "goal-state";
4
+ declare const LEGACY_GOAL_STATE_ENTRY_TYPE = "goals-state";
5
+ interface SessionEntryLike {
6
+ type?: unknown;
7
+ customType?: unknown;
8
+ data?: unknown;
9
+ }
10
+ declare function serializeGoalState(goal: ActiveGoal | undefined, queue?: readonly ActiveGoal[], pendingAction?: PendingQueueAction): GoalStateData;
11
+ declare function decodeGoalStateEntries(entries: readonly SessionEntryLike[]): LoadedGoalState;
12
+ declare function loadGoalStateFromSession(context: {
13
+ sessionManager?: {
14
+ getBranch?: () => SessionEntryLike[];
15
+ getEntries?: () => SessionEntryLike[];
16
+ };
17
+ }): LoadedGoalState;
18
+ declare function normalizeLoadedGoal(goal: ActiveGoal, now?: number): ActiveGoal;
19
+ declare function isCanonicalGoalState(value: unknown): value is GoalStateData;
20
+ //#endregion
21
+ export { GOAL_STATE_ENTRY_TYPE, LEGACY_GOAL_STATE_ENTRY_TYPE, SessionEntryLike, decodeGoalStateEntries, isCanonicalGoalState, loadGoalStateFromSession, normalizeLoadedGoal, serializeGoalState };
22
+ //# sourceMappingURL=stateCodec.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateCodec.d.mts","names":[],"sources":["../../../src/services/goal/stateCodec.ts"],"mappings":";;cASa;cACA;UACI;EACf;EACA;EACA;;iBAEc,mBACd,MAAM,wBACN,iBAAgB,cAChB,gBAAgB,qBACf;iBAOa,uBAAuB,kBAAkB,qBAAqB;iBAU9D,yBAAyB;EACvC;IAAmB,kBAAkB;IAAoB,mBAAmB;;IAC1E;iBAGY,oBAAoB,MAAM,YAAY,eAAmB;iBAmBzD,qBAAqB,iBAAiB,SAAS"}
@@ -0,0 +1,2 @@
1
+ import{isNonNegativeFiniteNumber as e,nonNegativeFiniteNumber as t,normalizeTokenBudget as n}from"./accounting.mjs";import"./parser.mjs";const r=`goal-state`,i=`goals-state`;function a(e,t=[],n){return{goal:e??null,...t.length?{queue:t.map(e=>({...e}))}:{},...n?{pendingAction:{...n}}:{}}}function o(e){let t=[...e].reverse().find(e=>e.type===`custom`&&e.customType===`goal-state`);if(t)return u(t.data);let n=[...e].reverse().find(e=>e.type===`custom`&&e.customType===`goals-state`);return n?d(n.data):w(`none`)}function s(e){return o(e.sessionManager?.getBranch?.()??e.sessionManager?.getEntries?.()??[])}function c(e,r=Date.now()){return{...e,startedAt:y(e.startedAt)?e.startedAt:r,updatedAt:y(e.updatedAt)?e.updatedAt:r,iteration:b(e.iteration),tokenBudget:n(e.tokenBudget),tokensUsed:t(e.tokensUsed),timeUsedSeconds:t(e.timeUsedSeconds),baselineTokens:t(e.baselineTokens),activeStartedAt:e.status===`active`?y(e.activeStartedAt)?e.activeStartedAt:r:void 0,automaticModelTurns:b(e.automaticModelTurns),toolFreeRepeatCount:b(e.toolFreeRepeatCount),lastToolFreeOutputFingerprint:x(e.lastToolFreeOutputFingerprint),safetyPauseCause:S(e.safetyPauseCause),safetyResetPending:e.safetyResetPending===!0||void 0}}function l(e){return!u(e).malformed}function u(e){if(!C(e)||!Object.hasOwn(e,`goal`))return w(`canonical`,!0);let t=e.goal;if(t!==null&&!h(t))return w(`canonical`,!0);let n=e.queue;if(n!==void 0&&(!Array.isArray(n)||!n.every(g)))return w(`canonical`,!0);let r=e.pendingAction,i=r===void 0?void 0:p(r);if(r!==void 0&&!i)return w(`canonical`,!0);if(t===null)return w(`canonical`);let a=c(t);if(a.status===`complete`&&!i)return w(`canonical`);let o=(n??[]).map(f);return a.status===`queued`&&!o.length&&!i?w(`canonical`,!0):{goal:a,queue:o,pendingAction:i,hasExperimentalQueueState:a.status===`queued`||o.length>0||i!==void 0,source:`canonical`,malformed:!1}}function d(e){if(!C(e))return w(`legacy-goals`,!0);let t=Array.isArray(e.goals)?e.goals:h(e.goal)?[e.goal]:[];if(!t.every(h))return w(`legacy-goals`,!0);let n=e.pendingUnshift===void 0?void 0:m(e.pendingUnshift);if(e.pendingUnshift!==void 0&&!n)return w(`legacy-goals`,!0);let r=t.filter(e=>e.status!==`complete`);if(!r.length)return w(`legacy-goals`);let i=r.map((e,t)=>t===0?c(e):f(e));return{goal:i[0],queue:i.slice(1),pendingAction:n,hasExperimentalQueueState:i.length>1||i[0]?.status===`queued`||n!==void 0,source:`legacy-goals`,malformed:!1}}function f(e){let t=c(e);return{...t,status:t.status===`active`?`queued`:t.status,activeStartedAt:void 0}}function p(e){if(C(e)){if(e.kind===`prioritize`)return!_(e.objective)||e.tokenBudget!==void 0&&!n(e.tokenBudget)||e.displacedUsageFinalized!==void 0&&typeof e.displacedUsageFinalized!=`boolean`?void 0:{kind:`prioritize`,objective:e.objective,tokenBudget:n(e.tokenBudget),...e.displacedUsageFinalized===!0?{displacedUsageFinalized:!0}:{}};if(e.kind===`advance`&&typeof e.goalId==`string`&&e.goalId.trim()===e.goalId&&e.goalId&&(e.reason===`complete`||e.reason===`skip`)&&_(e.completedText))return{kind:`advance`,goalId:e.goalId,reason:e.reason,completedText:e.completedText}}}function m(e){return C(e)&&_(e.objective)?{kind:`prioritize`,objective:e.objective,tokenBudget:n(e.tokenBudget)}:void 0}function h(t){return C(t)?typeof t.id==`string`&&t.id.length>0&&t.id.trim()===t.id&&_(t.text)&&v(t.status)&&y(t.startedAt)&&y(t.updatedAt)&&typeof t.iteration==`number`&&Number.isFinite(t.iteration)&&e(t.tokensUsed)&&e(t.timeUsedSeconds)&&e(t.baselineTokens)&&(t.tokenBudget===void 0||n(t.tokenBudget)!==void 0)&&(t.activeStartedAt===void 0||y(t.activeStartedAt)):!1}function g(e){return h(e)&&e.status!==`complete`}function _(e){return typeof e==`string`&&e.trim().length>0&&e.length<=4e3}function v(e){return e===`active`||e===`queued`||e===`paused`||e===`blocked`||e===`usage_limited`||e===`budget_limited`||e===`complete`}function y(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function b(e){return typeof e==`number`&&Number.isSafeInteger(e)&&e>=0?e:0}function x(e){return typeof e==`string`&&/^[a-f0-9]{64}$/u.test(e)?e:void 0}function S(e){return e===`continuation_limit`||e===`no_progress`?e:void 0}function C(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function w(e,t=!1){return{goal:void 0,queue:[],pendingAction:void 0,hasExperimentalQueueState:!1,source:e,malformed:t}}export{r as GOAL_STATE_ENTRY_TYPE,i as LEGACY_GOAL_STATE_ENTRY_TYPE,o as decodeGoalStateEntries,l as isCanonicalGoalState,s as loadGoalStateFromSession,c as normalizeLoadedGoal,a as serializeGoalState};
2
+ //# sourceMappingURL=stateCodec.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateCodec.mjs","names":[],"sources":["../../../src/services/goal/stateCodec.ts"],"sourcesContent":["import type {\n ActiveGoal,\n GoalStateData,\n LoadedGoalState,\n PendingQueueAction,\n SafetyPauseCause,\n} from '../../types/goal.ts';\nimport { isNonNegativeFiniteNumber, nonNegativeFiniteNumber, normalizeTokenBudget } from './accounting.ts';\nimport { MAX_OBJECTIVE_LENGTH } from './parser.ts';\nexport const GOAL_STATE_ENTRY_TYPE = 'goal-state';\nexport const LEGACY_GOAL_STATE_ENTRY_TYPE = 'goals-state';\nexport interface SessionEntryLike {\n type?: unknown;\n customType?: unknown;\n data?: unknown;\n}\nexport function serializeGoalState(\n goal: ActiveGoal | undefined,\n queue: readonly ActiveGoal[] = [],\n pendingAction?: PendingQueueAction,\n): GoalStateData {\n return {\n goal: goal ?? null,\n ...(queue.length ? { queue: queue.map((item) => ({ ...item })) } : {}),\n ...(pendingAction ? { pendingAction: { ...pendingAction } } : {}),\n };\n}\nexport function decodeGoalStateEntries(entries: readonly SessionEntryLike[]): LoadedGoalState {\n const canonical = [...entries]\n .reverse()\n .find((entry) => entry.type === 'custom' && entry.customType === GOAL_STATE_ENTRY_TYPE);\n if (canonical) return decodeCanonical(canonical.data);\n const legacy = [...entries]\n .reverse()\n .find((entry) => entry.type === 'custom' && entry.customType === LEGACY_GOAL_STATE_ENTRY_TYPE);\n return legacy ? decodeLegacy(legacy.data) : empty('none');\n}\nexport function loadGoalStateFromSession(context: {\n sessionManager?: { getBranch?: () => SessionEntryLike[]; getEntries?: () => SessionEntryLike[] };\n}): LoadedGoalState {\n return decodeGoalStateEntries(context.sessionManager?.getBranch?.() ?? context.sessionManager?.getEntries?.() ?? []);\n}\nexport function normalizeLoadedGoal(goal: ActiveGoal, now = Date.now()): ActiveGoal {\n return {\n ...goal,\n startedAt: timestamp(goal.startedAt) ? goal.startedAt : now,\n updatedAt: timestamp(goal.updatedAt) ? goal.updatedAt : now,\n iteration: counter(goal.iteration),\n tokenBudget: normalizeTokenBudget(goal.tokenBudget),\n tokensUsed: nonNegativeFiniteNumber(goal.tokensUsed),\n timeUsedSeconds: nonNegativeFiniteNumber(goal.timeUsedSeconds),\n baselineTokens: nonNegativeFiniteNumber(goal.baselineTokens),\n activeStartedAt:\n goal.status === 'active' ? (timestamp(goal.activeStartedAt) ? goal.activeStartedAt : now) : undefined,\n automaticModelTurns: counter(goal.automaticModelTurns),\n toolFreeRepeatCount: counter(goal.toolFreeRepeatCount),\n lastToolFreeOutputFingerprint: fingerprint(goal.lastToolFreeOutputFingerprint),\n safetyPauseCause: cause(goal.safetyPauseCause),\n safetyResetPending: goal.safetyResetPending === true ? true : undefined,\n };\n}\nexport function isCanonicalGoalState(value: unknown): value is GoalStateData {\n return !decodeCanonical(value).malformed;\n}\nfunction decodeCanonical(value: unknown): LoadedGoalState {\n if (!record(value) || !Object.hasOwn(value, 'goal')) return empty('canonical', true);\n const rawGoal = value.goal;\n if (rawGoal !== null && !isGoal(rawGoal)) return empty('canonical', true);\n const queueValue = value.queue;\n if (queueValue !== undefined && (!Array.isArray(queueValue) || !queueValue.every(isQueueGoal)))\n return empty('canonical', true);\n const pendingValue = value.pendingAction;\n const pending = pendingValue === undefined ? undefined : normalizePending(pendingValue);\n if (pendingValue !== undefined && !pending) return empty('canonical', true);\n if (rawGoal === null) return empty('canonical');\n const goal = normalizeLoadedGoal(rawGoal);\n if (goal.status === 'complete' && !pending) return empty('canonical');\n const queue = (queueValue ?? []).map(normalizeQueued);\n if (goal.status === 'queued' && !queue.length && !pending) return empty('canonical', true);\n return {\n goal,\n queue,\n pendingAction: pending,\n hasExperimentalQueueState: goal.status === 'queued' || queue.length > 0 || pending !== undefined,\n source: 'canonical',\n malformed: false,\n };\n}\nfunction decodeLegacy(value: unknown): LoadedGoalState {\n if (!record(value)) return empty('legacy-goals', true);\n const rawGoals = Array.isArray(value.goals) ? value.goals : isGoal(value.goal) ? [value.goal] : [];\n if (!rawGoals.every(isGoal)) return empty('legacy-goals', true);\n const pending = value.pendingUnshift === undefined ? undefined : normalizeLegacyPending(value.pendingUnshift);\n if (value.pendingUnshift !== undefined && !pending) return empty('legacy-goals', true);\n const goals = rawGoals.filter((goal) => goal.status !== 'complete');\n if (!goals.length) return empty('legacy-goals');\n const normalized = goals.map((goal, index) => (index === 0 ? normalizeLoadedGoal(goal) : normalizeQueued(goal)));\n return {\n goal: normalized[0],\n queue: normalized.slice(1),\n pendingAction: pending,\n hasExperimentalQueueState: normalized.length > 1 || normalized[0]?.status === 'queued' || pending !== undefined,\n source: 'legacy-goals',\n malformed: false,\n };\n}\nfunction normalizeQueued(goal: ActiveGoal): ActiveGoal {\n const normalized = normalizeLoadedGoal(goal);\n return {\n ...normalized,\n status: normalized.status === 'active' ? 'queued' : normalized.status,\n activeStartedAt: undefined,\n };\n}\nfunction normalizePending(value: unknown): PendingQueueAction | undefined {\n if (!record(value)) return undefined;\n if (value.kind === 'prioritize') {\n if (\n !validObjective(value.objective) ||\n (value.tokenBudget !== undefined && !normalizeTokenBudget(value.tokenBudget)) ||\n (value.displacedUsageFinalized !== undefined && typeof value.displacedUsageFinalized !== 'boolean')\n )\n return undefined;\n return {\n kind: 'prioritize',\n objective: value.objective,\n tokenBudget: normalizeTokenBudget(value.tokenBudget),\n ...(value.displacedUsageFinalized === true ? { displacedUsageFinalized: true } : {}),\n };\n }\n if (\n value.kind === 'advance' &&\n typeof value.goalId === 'string' &&\n value.goalId.trim() === value.goalId &&\n value.goalId &&\n (value.reason === 'complete' || value.reason === 'skip') &&\n validObjective(value.completedText)\n )\n return { kind: 'advance', goalId: value.goalId, reason: value.reason, completedText: value.completedText };\n return undefined;\n}\nfunction normalizeLegacyPending(value: unknown): PendingQueueAction | undefined {\n return record(value) && validObjective(value.objective)\n ? { kind: 'prioritize', objective: value.objective, tokenBudget: normalizeTokenBudget(value.tokenBudget) }\n : undefined;\n}\nfunction isGoal(value: unknown): value is ActiveGoal {\n if (!record(value)) return false;\n return (\n typeof value.id === 'string' &&\n value.id.length > 0 &&\n value.id.trim() === value.id &&\n validObjective(value.text) &&\n status(value.status) &&\n timestamp(value.startedAt) &&\n timestamp(value.updatedAt) &&\n typeof value.iteration === 'number' &&\n Number.isFinite(value.iteration) &&\n isNonNegativeFiniteNumber(value.tokensUsed) &&\n isNonNegativeFiniteNumber(value.timeUsedSeconds) &&\n isNonNegativeFiniteNumber(value.baselineTokens) &&\n (value.tokenBudget === undefined || normalizeTokenBudget(value.tokenBudget) !== undefined) &&\n (value.activeStartedAt === undefined || timestamp(value.activeStartedAt))\n );\n}\nfunction isQueueGoal(value: unknown): value is ActiveGoal {\n return isGoal(value) && value.status !== 'complete';\n}\nfunction validObjective(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0 && value.length <= MAX_OBJECTIVE_LENGTH;\n}\nfunction status(value: unknown): value is ActiveGoal['status'] {\n return (\n value === 'active' ||\n value === 'queued' ||\n value === 'paused' ||\n value === 'blocked' ||\n value === 'usage_limited' ||\n value === 'budget_limited' ||\n value === 'complete'\n );\n}\nfunction timestamp(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0;\n}\nfunction counter(value: unknown): number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : 0;\n}\nfunction fingerprint(value: unknown): string | undefined {\n return typeof value === 'string' && /^[a-f0-9]{64}$/u.test(value) ? value : undefined;\n}\nfunction cause(value: unknown): SafetyPauseCause | undefined {\n return value === 'continuation_limit' || value === 'no_progress' ? value : undefined;\n}\nfunction record(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\nfunction empty(source: LoadedGoalState['source'], malformed = false): LoadedGoalState {\n return { goal: undefined, queue: [], pendingAction: undefined, hasExperimentalQueueState: false, source, malformed };\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ const e=require("./accounting.cjs");function t(){let e=globalThis.crypto;return e?.randomUUID?e.randomUUID():`goal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}function n(n,r,i={}){let a=i.now??Date.now();return{id:i.id??t(),text:n,status:`active`,startedAt:a,updatedAt:a,iteration:0,tokenBudget:e.normalizeTokenBudget(r),tokensUsed:0,timeUsedSeconds:0,baselineTokens:Math.max(0,i.baselineTokens??0),activeStartedAt:a,automaticModelTurns:0,toolFreeRepeatCount:0}}function r(t,n,r=Date.now()){let i=n===`active`&&t.tokenBudget!==void 0&&t.tokensUsed>=t.tokenBudget?`budget_limited`:n,a={...t,status:i,updatedAt:r};return e.checkpointGoalActiveTime(a,r,i===`active`),a}function i(e,t=Date.now()){return{...e,iteration:e.iteration+1,updatedAt:t}}function a(e,n=Date.now(),r=t()){return{...e,id:r,status:`active`,startedAt:n,updatedAt:n,iteration:0,tokensUsed:0,timeUsedSeconds:0,activeStartedAt:n,automaticModelTurns:0,toolFreeRepeatCount:0,lastToolFreeOutputFingerprint:void 0,safetyPauseCause:void 0,safetyResetPending:void 0}}function o(e){return e===`paused`||e===`blocked`||e===`usage_limited`?e:`active`}function s(e){return e===`paused`||e===`blocked`||e===`usage_limited`||e===`budget_limited`}function c(e){return e===`paused`||e===`blocked`||e===`usage_limited`||e===`budget_limited`}function l(e){return e!==`complete`}function u(e){return!e.goal&&e.queue.length===0?`dormant`:e.goal?.status===`active`?`executing`:`retained`}function d(t){return`${e.formatTokenCount(t.tokensUsed)}/${e.formatTokenCount(t.tokenBudget??0)}`}function f(t){if(t)return t.status===`complete`?`complete`:t.status===`queued`?`queued`:t.status===`paused`?`paused`:t.status===`blocked`?`blocked`:t.status===`usage_limited`?`usage`:t.status===`budget_limited`?`budget ${d(t)}`:t.tokenBudget===void 0?`active ${e.formatDuration(t.timeUsedSeconds)}`:`active ${d(t)}`}function p(t,n=[],r=!1,i=!1,a){let o=[`Goal: ${t.text}`,`Status: ${i?`queue off`:t.status}`,`Iteration: ${t.iteration}`,`Automatic model responses: ${t.automaticModelTurns}`,`Active elapsed: ${e.formatDuration(t.timeUsedSeconds)}`,`Tokens: ${t.tokenBudget===void 0?e.formatTokenCount(t.tokensUsed):d(t)}`];if(t.safetyPauseCause&&o.push(`Safety pause: ${t.safetyPauseCause===`continuation_limit`?`automatic response limit`:`no progress`}`),r||n.length>0||i||a){let e=[`[${t.status}] ${t.text}`,...a?.kind===`prioritize`?[`[pending] ${a.objective}`]:[],...n.map(e=>`[${e.status}] ${e.text}`)];o.push(`Goals (${e.length}):`,...e.map((e,t)=>`${t+1}. ${e}`))}return o.join(`
2
+ `)}function m(e,t){return t?t===e.id?void 0:`goal_id does not match the active goal`:`missing goal_id`}function h(e){return[/(?<!could\s)\bnot\s+(?:yet\s+)?(?:complete|completed|done|finished)\b/iu,/\bstill\s+(?:incomplete|failing|fails?)\b/iu,/\btests?\s+(?:still\s+)?fail(?:ing)?\b/iu].some(t=>t.test(e))}function g(e,t){return e===`active`||e===`budget_limited`&&t===`goal_complete`}exports.blocksStaleGoalToolCalls=c,exports.createGoal=n,exports.editedGoalStatus=o,exports.formatBudget=d,exports.formatStatus=f,exports.getExecutionState=u,exports.goalIdRejectionReason=m,exports.goalSummary=p,exports.incrementGoal=i,exports.isContradictoryCompletionSummary=h,exports.isGoalToolAllowedForState=g,exports.isResumableGoalStatus=s,exports.isRetainedGoalStatus=l,exports.nextGoalInstance=a,exports.transitionGoal=r;
3
+ //# sourceMappingURL=stateMachine.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateMachine.cjs","names":["normalizeTokenBudget","formatTokenCount","formatDuration"],"sources":["../../../src/services/goal/stateMachine.ts"],"sourcesContent":["import { checkpointGoalActiveTime, formatDuration, formatTokenCount, normalizeTokenBudget } from './accounting.ts';\nimport type {\n ActiveGoal,\n GoalExecutionState,\n GoalStatus,\n PendingQueueAction,\n GoalRuntimeSnapshot,\n} from '../../types/goal.ts';\nexport interface GoalCreateOptions {\n id?: string;\n now?: number;\n baselineTokens?: number;\n}\nfunction createGoalId(): string {\n const cryptoApi = globalThis.crypto;\n if (cryptoApi?.randomUUID) return cryptoApi.randomUUID();\n return `goal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\nexport function createGoal(text: string, tokenBudget?: number, options: GoalCreateOptions = {}): ActiveGoal {\n const now = options.now ?? Date.now();\n return {\n id: options.id ?? createGoalId(),\n text,\n status: 'active',\n startedAt: now,\n updatedAt: now,\n iteration: 0,\n tokenBudget: normalizeTokenBudget(tokenBudget),\n tokensUsed: 0,\n timeUsedSeconds: 0,\n baselineTokens: Math.max(0, options.baselineTokens ?? 0),\n activeStartedAt: now,\n automaticModelTurns: 0,\n toolFreeRepeatCount: 0,\n };\n}\nexport function transitionGoal(goal: ActiveGoal, requestedStatus: GoalStatus, now = Date.now()): ActiveGoal {\n const status: GoalStatus =\n requestedStatus === 'active' && goal.tokenBudget !== undefined && goal.tokensUsed >= goal.tokenBudget\n ? 'budget_limited'\n : requestedStatus;\n const next = { ...goal, status, updatedAt: now };\n checkpointGoalActiveTime(next, now, status === 'active');\n return next;\n}\nexport function incrementGoal(goal: ActiveGoal, now = Date.now()): ActiveGoal {\n return { ...goal, iteration: goal.iteration + 1, updatedAt: now };\n}\nexport function nextGoalInstance(goal: ActiveGoal, now = Date.now(), id = createGoalId()): ActiveGoal {\n return {\n ...goal,\n id,\n status: 'active',\n startedAt: now,\n updatedAt: now,\n iteration: 0,\n tokensUsed: 0,\n timeUsedSeconds: 0,\n activeStartedAt: now,\n automaticModelTurns: 0,\n toolFreeRepeatCount: 0,\n lastToolFreeOutputFingerprint: undefined,\n safetyPauseCause: undefined,\n safetyResetPending: undefined,\n };\n}\nexport function editedGoalStatus(status: GoalStatus): GoalStatus {\n return status === 'paused' || status === 'blocked' || status === 'usage_limited' ? status : 'active';\n}\nexport function isResumableGoalStatus(status: GoalStatus): boolean {\n return status === 'paused' || status === 'blocked' || status === 'usage_limited' || status === 'budget_limited';\n}\nexport function blocksStaleGoalToolCalls(status: GoalStatus): boolean {\n return status === 'paused' || status === 'blocked' || status === 'usage_limited' || status === 'budget_limited';\n}\nexport function isRetainedGoalStatus(status: GoalStatus): boolean {\n return status !== 'complete';\n}\nexport function getExecutionState(snapshot: Pick<GoalRuntimeSnapshot, 'goal' | 'queue'>): GoalExecutionState {\n if (!snapshot.goal && snapshot.queue.length === 0) return 'dormant';\n return snapshot.goal?.status === 'active' ? 'executing' : 'retained';\n}\nexport function formatBudget(goal: Pick<ActiveGoal, 'tokensUsed' | 'tokenBudget'>): string {\n return `${formatTokenCount(goal.tokensUsed)}/${formatTokenCount(goal.tokenBudget ?? 0)}`;\n}\nexport function formatStatus(goal: ActiveGoal | undefined): string | undefined {\n if (!goal) return undefined;\n if (goal.status === 'complete') return 'complete';\n if (goal.status === 'queued') return 'queued';\n if (goal.status === 'paused') return 'paused';\n if (goal.status === 'blocked') return 'blocked';\n if (goal.status === 'usage_limited') return 'usage';\n if (goal.status === 'budget_limited') return `budget ${formatBudget(goal)}`;\n return goal.tokenBudget === undefined\n ? `active ${formatDuration(goal.timeUsedSeconds)}`\n : `active ${formatBudget(goal)}`;\n}\nexport function goalSummary(\n goal: ActiveGoal,\n queuedGoals: readonly ActiveGoal[] = [],\n queueEnabled = false,\n queueFrozen = false,\n pendingAction?: PendingQueueAction,\n): string {\n const summary = [\n `Goal: ${goal.text}`,\n `Status: ${queueFrozen ? 'queue off' : goal.status}`,\n `Iteration: ${goal.iteration}`,\n `Automatic model responses: ${goal.automaticModelTurns}`,\n `Active elapsed: ${formatDuration(goal.timeUsedSeconds)}`,\n `Tokens: ${goal.tokenBudget === undefined ? formatTokenCount(goal.tokensUsed) : formatBudget(goal)}`,\n ];\n if (goal.safetyPauseCause)\n summary.push(\n `Safety pause: ${goal.safetyPauseCause === 'continuation_limit' ? 'automatic response limit' : 'no progress'}`,\n );\n if (queueEnabled || queuedGoals.length > 0 || queueFrozen || pendingAction) {\n const ordered = [\n `[${goal.status}] ${goal.text}`,\n ...(pendingAction?.kind === 'prioritize' ? [`[pending] ${pendingAction.objective}`] : []),\n ...queuedGoals.map((queued) => `[${queued.status}] ${queued.text}`),\n ];\n summary.push(`Goals (${ordered.length}):`, ...ordered.map((item, index) => `${index + 1}. ${item}`));\n }\n return summary.join('\\n');\n}\nexport function goalIdRejectionReason(goal: ActiveGoal, requestedGoalId: string): string | undefined {\n if (!requestedGoalId) return 'missing goal_id';\n return requestedGoalId === goal.id ? undefined : 'goal_id does not match the active goal';\n}\nexport function isContradictoryCompletionSummary(summary: string): boolean {\n return [\n /(?<!could\\s)\\bnot\\s+(?:yet\\s+)?(?:complete|completed|done|finished)\\b/iu,\n /\\bstill\\s+(?:incomplete|failing|fails?)\\b/iu,\n /\\btests?\\s+(?:still\\s+)?fail(?:ing)?\\b/iu,\n ].some((pattern) => pattern.test(summary));\n}\nexport function isGoalToolAllowedForState(status: GoalStatus, tool: 'goal_complete' | 'goal_blocked'): boolean {\n return status === 'active' || (status === 'budget_limited' && tool === 'goal_complete');\n}\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { ActiveGoal, GoalExecutionState, GoalRuntimeSnapshot, GoalStatus, PendingQueueAction } from "../../types/goal.cjs";
2
+ //#region src/services/goal/stateMachine.d.ts
3
+ interface GoalCreateOptions {
4
+ id?: string;
5
+ now?: number;
6
+ baselineTokens?: number;
7
+ }
8
+ declare function createGoal(text: string, tokenBudget?: number, options?: GoalCreateOptions): ActiveGoal;
9
+ declare function transitionGoal(goal: ActiveGoal, requestedStatus: GoalStatus, now?: number): ActiveGoal;
10
+ declare function incrementGoal(goal: ActiveGoal, now?: number): ActiveGoal;
11
+ declare function nextGoalInstance(goal: ActiveGoal, now?: number, id?: string): ActiveGoal;
12
+ declare function editedGoalStatus(status: GoalStatus): GoalStatus;
13
+ declare function isResumableGoalStatus(status: GoalStatus): boolean;
14
+ declare function blocksStaleGoalToolCalls(status: GoalStatus): boolean;
15
+ declare function isRetainedGoalStatus(status: GoalStatus): boolean;
16
+ declare function getExecutionState(snapshot: Pick<GoalRuntimeSnapshot, 'goal' | 'queue'>): GoalExecutionState;
17
+ declare function formatBudget(goal: Pick<ActiveGoal, 'tokensUsed' | 'tokenBudget'>): string;
18
+ declare function formatStatus(goal: ActiveGoal | undefined): string | undefined;
19
+ declare function goalSummary(goal: ActiveGoal, queuedGoals?: readonly ActiveGoal[], queueEnabled?: boolean, queueFrozen?: boolean, pendingAction?: PendingQueueAction): string;
20
+ declare function goalIdRejectionReason(goal: ActiveGoal, requestedGoalId: string): string | undefined;
21
+ declare function isContradictoryCompletionSummary(summary: string): boolean;
22
+ declare function isGoalToolAllowedForState(status: GoalStatus, tool: 'goal_complete' | 'goal_blocked'): boolean;
23
+ //#endregion
24
+ export { GoalCreateOptions, blocksStaleGoalToolCalls, createGoal, editedGoalStatus, formatBudget, formatStatus, getExecutionState, goalIdRejectionReason, goalSummary, incrementGoal, isContradictoryCompletionSummary, isGoalToolAllowedForState, isResumableGoalStatus, isRetainedGoalStatus, nextGoalInstance, transitionGoal };
25
+ //# sourceMappingURL=stateMachine.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateMachine.d.cts","names":[],"sources":["../../../src/services/goal/stateMachine.ts"],"mappings":";;UAQiB;EACf;EACA;EACA;;iBAOc,WAAW,cAAc,sBAAsB,UAAS,oBAAyB;iBAkBjF,eAAe,MAAM,YAAY,iBAAiB,YAAY,eAAmB;iBASjF,cAAc,MAAM,YAAY,eAAmB;iBAGnD,iBAAiB,MAAM,YAAY,cAAkB,cAAsB;iBAkB3E,iBAAiB,QAAQ,aAAa;iBAGtC,sBAAsB,QAAQ;iBAG9B,yBAAyB,QAAQ;iBAGjC,qBAAqB,QAAQ;iBAG7B,kBAAkB,UAAU,KAAK,yCAAyC;iBAI1E,aAAa,MAAM,KAAK;iBAGxB,aAAa,MAAM;iBAYnB,YACd,MAAM,YACN,uBAAsB,cACtB,wBACA,uBACA,gBAAgB;iBAwBF,sBAAsB,MAAM,YAAY;iBAIxC,iCAAiC;iBAOjC,0BAA0B,QAAQ,YAAY"}
@@ -0,0 +1,25 @@
1
+ import { ActiveGoal, GoalExecutionState, GoalRuntimeSnapshot, GoalStatus, PendingQueueAction } from "../../types/goal.mjs";
2
+ //#region src/services/goal/stateMachine.d.ts
3
+ interface GoalCreateOptions {
4
+ id?: string;
5
+ now?: number;
6
+ baselineTokens?: number;
7
+ }
8
+ declare function createGoal(text: string, tokenBudget?: number, options?: GoalCreateOptions): ActiveGoal;
9
+ declare function transitionGoal(goal: ActiveGoal, requestedStatus: GoalStatus, now?: number): ActiveGoal;
10
+ declare function incrementGoal(goal: ActiveGoal, now?: number): ActiveGoal;
11
+ declare function nextGoalInstance(goal: ActiveGoal, now?: number, id?: string): ActiveGoal;
12
+ declare function editedGoalStatus(status: GoalStatus): GoalStatus;
13
+ declare function isResumableGoalStatus(status: GoalStatus): boolean;
14
+ declare function blocksStaleGoalToolCalls(status: GoalStatus): boolean;
15
+ declare function isRetainedGoalStatus(status: GoalStatus): boolean;
16
+ declare function getExecutionState(snapshot: Pick<GoalRuntimeSnapshot, 'goal' | 'queue'>): GoalExecutionState;
17
+ declare function formatBudget(goal: Pick<ActiveGoal, 'tokensUsed' | 'tokenBudget'>): string;
18
+ declare function formatStatus(goal: ActiveGoal | undefined): string | undefined;
19
+ declare function goalSummary(goal: ActiveGoal, queuedGoals?: readonly ActiveGoal[], queueEnabled?: boolean, queueFrozen?: boolean, pendingAction?: PendingQueueAction): string;
20
+ declare function goalIdRejectionReason(goal: ActiveGoal, requestedGoalId: string): string | undefined;
21
+ declare function isContradictoryCompletionSummary(summary: string): boolean;
22
+ declare function isGoalToolAllowedForState(status: GoalStatus, tool: 'goal_complete' | 'goal_blocked'): boolean;
23
+ //#endregion
24
+ export { GoalCreateOptions, blocksStaleGoalToolCalls, createGoal, editedGoalStatus, formatBudget, formatStatus, getExecutionState, goalIdRejectionReason, goalSummary, incrementGoal, isContradictoryCompletionSummary, isGoalToolAllowedForState, isResumableGoalStatus, isRetainedGoalStatus, nextGoalInstance, transitionGoal };
25
+ //# sourceMappingURL=stateMachine.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateMachine.d.mts","names":[],"sources":["../../../src/services/goal/stateMachine.ts"],"mappings":";;UAQiB;EACf;EACA;EACA;;iBAOc,WAAW,cAAc,sBAAsB,UAAS,oBAAyB;iBAkBjF,eAAe,MAAM,YAAY,iBAAiB,YAAY,eAAmB;iBASjF,cAAc,MAAM,YAAY,eAAmB;iBAGnD,iBAAiB,MAAM,YAAY,cAAkB,cAAsB;iBAkB3E,iBAAiB,QAAQ,aAAa;iBAGtC,sBAAsB,QAAQ;iBAG9B,yBAAyB,QAAQ;iBAGjC,qBAAqB,QAAQ;iBAG7B,kBAAkB,UAAU,KAAK,yCAAyC;iBAI1E,aAAa,MAAM,KAAK;iBAGxB,aAAa,MAAM;iBAYnB,YACd,MAAM,YACN,uBAAsB,cACtB,wBACA,uBACA,gBAAgB;iBAwBF,sBAAsB,MAAM,YAAY;iBAIxC,iCAAiC;iBAOjC,0BAA0B,QAAQ,YAAY"}
@@ -0,0 +1,3 @@
1
+ import{checkpointGoalActiveTime as e,formatDuration as t,formatTokenCount as n,normalizeTokenBudget as r}from"./accounting.mjs";function i(){let e=globalThis.crypto;return e?.randomUUID?e.randomUUID():`goal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}function a(e,t,n={}){let a=n.now??Date.now();return{id:n.id??i(),text:e,status:`active`,startedAt:a,updatedAt:a,iteration:0,tokenBudget:r(t),tokensUsed:0,timeUsedSeconds:0,baselineTokens:Math.max(0,n.baselineTokens??0),activeStartedAt:a,automaticModelTurns:0,toolFreeRepeatCount:0}}function o(t,n,r=Date.now()){let i=n===`active`&&t.tokenBudget!==void 0&&t.tokensUsed>=t.tokenBudget?`budget_limited`:n,a={...t,status:i,updatedAt:r};return e(a,r,i===`active`),a}function s(e,t=Date.now()){return{...e,iteration:e.iteration+1,updatedAt:t}}function c(e,t=Date.now(),n=i()){return{...e,id:n,status:`active`,startedAt:t,updatedAt:t,iteration:0,tokensUsed:0,timeUsedSeconds:0,activeStartedAt:t,automaticModelTurns:0,toolFreeRepeatCount:0,lastToolFreeOutputFingerprint:void 0,safetyPauseCause:void 0,safetyResetPending:void 0}}function l(e){return e===`paused`||e===`blocked`||e===`usage_limited`?e:`active`}function u(e){return e===`paused`||e===`blocked`||e===`usage_limited`||e===`budget_limited`}function d(e){return e===`paused`||e===`blocked`||e===`usage_limited`||e===`budget_limited`}function f(e){return e!==`complete`}function p(e){return!e.goal&&e.queue.length===0?`dormant`:e.goal?.status===`active`?`executing`:`retained`}function m(e){return`${n(e.tokensUsed)}/${n(e.tokenBudget??0)}`}function h(e){if(e)return e.status===`complete`?`complete`:e.status===`queued`?`queued`:e.status===`paused`?`paused`:e.status===`blocked`?`blocked`:e.status===`usage_limited`?`usage`:e.status===`budget_limited`?`budget ${m(e)}`:e.tokenBudget===void 0?`active ${t(e.timeUsedSeconds)}`:`active ${m(e)}`}function g(e,r=[],i=!1,a=!1,o){let s=[`Goal: ${e.text}`,`Status: ${a?`queue off`:e.status}`,`Iteration: ${e.iteration}`,`Automatic model responses: ${e.automaticModelTurns}`,`Active elapsed: ${t(e.timeUsedSeconds)}`,`Tokens: ${e.tokenBudget===void 0?n(e.tokensUsed):m(e)}`];if(e.safetyPauseCause&&s.push(`Safety pause: ${e.safetyPauseCause===`continuation_limit`?`automatic response limit`:`no progress`}`),i||r.length>0||a||o){let t=[`[${e.status}] ${e.text}`,...o?.kind===`prioritize`?[`[pending] ${o.objective}`]:[],...r.map(e=>`[${e.status}] ${e.text}`)];s.push(`Goals (${t.length}):`,...t.map((e,t)=>`${t+1}. ${e}`))}return s.join(`
2
+ `)}function _(e,t){return t?t===e.id?void 0:`goal_id does not match the active goal`:`missing goal_id`}function v(e){return[/(?<!could\s)\bnot\s+(?:yet\s+)?(?:complete|completed|done|finished)\b/iu,/\bstill\s+(?:incomplete|failing|fails?)\b/iu,/\btests?\s+(?:still\s+)?fail(?:ing)?\b/iu].some(t=>t.test(e))}function y(e,t){return e===`active`||e===`budget_limited`&&t===`goal_complete`}export{d as blocksStaleGoalToolCalls,a as createGoal,l as editedGoalStatus,m as formatBudget,h as formatStatus,p as getExecutionState,_ as goalIdRejectionReason,g as goalSummary,s as incrementGoal,v as isContradictoryCompletionSummary,y as isGoalToolAllowedForState,u as isResumableGoalStatus,f as isRetainedGoalStatus,c as nextGoalInstance,o as transitionGoal};
3
+ //# sourceMappingURL=stateMachine.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateMachine.mjs","names":[],"sources":["../../../src/services/goal/stateMachine.ts"],"sourcesContent":["import { checkpointGoalActiveTime, formatDuration, formatTokenCount, normalizeTokenBudget } from './accounting.ts';\nimport type {\n ActiveGoal,\n GoalExecutionState,\n GoalStatus,\n PendingQueueAction,\n GoalRuntimeSnapshot,\n} from '../../types/goal.ts';\nexport interface GoalCreateOptions {\n id?: string;\n now?: number;\n baselineTokens?: number;\n}\nfunction createGoalId(): string {\n const cryptoApi = globalThis.crypto;\n if (cryptoApi?.randomUUID) return cryptoApi.randomUUID();\n return `goal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\nexport function createGoal(text: string, tokenBudget?: number, options: GoalCreateOptions = {}): ActiveGoal {\n const now = options.now ?? Date.now();\n return {\n id: options.id ?? createGoalId(),\n text,\n status: 'active',\n startedAt: now,\n updatedAt: now,\n iteration: 0,\n tokenBudget: normalizeTokenBudget(tokenBudget),\n tokensUsed: 0,\n timeUsedSeconds: 0,\n baselineTokens: Math.max(0, options.baselineTokens ?? 0),\n activeStartedAt: now,\n automaticModelTurns: 0,\n toolFreeRepeatCount: 0,\n };\n}\nexport function transitionGoal(goal: ActiveGoal, requestedStatus: GoalStatus, now = Date.now()): ActiveGoal {\n const status: GoalStatus =\n requestedStatus === 'active' && goal.tokenBudget !== undefined && goal.tokensUsed >= goal.tokenBudget\n ? 'budget_limited'\n : requestedStatus;\n const next = { ...goal, status, updatedAt: now };\n checkpointGoalActiveTime(next, now, status === 'active');\n return next;\n}\nexport function incrementGoal(goal: ActiveGoal, now = Date.now()): ActiveGoal {\n return { ...goal, iteration: goal.iteration + 1, updatedAt: now };\n}\nexport function nextGoalInstance(goal: ActiveGoal, now = Date.now(), id = createGoalId()): ActiveGoal {\n return {\n ...goal,\n id,\n status: 'active',\n startedAt: now,\n updatedAt: now,\n iteration: 0,\n tokensUsed: 0,\n timeUsedSeconds: 0,\n activeStartedAt: now,\n automaticModelTurns: 0,\n toolFreeRepeatCount: 0,\n lastToolFreeOutputFingerprint: undefined,\n safetyPauseCause: undefined,\n safetyResetPending: undefined,\n };\n}\nexport function editedGoalStatus(status: GoalStatus): GoalStatus {\n return status === 'paused' || status === 'blocked' || status === 'usage_limited' ? status : 'active';\n}\nexport function isResumableGoalStatus(status: GoalStatus): boolean {\n return status === 'paused' || status === 'blocked' || status === 'usage_limited' || status === 'budget_limited';\n}\nexport function blocksStaleGoalToolCalls(status: GoalStatus): boolean {\n return status === 'paused' || status === 'blocked' || status === 'usage_limited' || status === 'budget_limited';\n}\nexport function isRetainedGoalStatus(status: GoalStatus): boolean {\n return status !== 'complete';\n}\nexport function getExecutionState(snapshot: Pick<GoalRuntimeSnapshot, 'goal' | 'queue'>): GoalExecutionState {\n if (!snapshot.goal && snapshot.queue.length === 0) return 'dormant';\n return snapshot.goal?.status === 'active' ? 'executing' : 'retained';\n}\nexport function formatBudget(goal: Pick<ActiveGoal, 'tokensUsed' | 'tokenBudget'>): string {\n return `${formatTokenCount(goal.tokensUsed)}/${formatTokenCount(goal.tokenBudget ?? 0)}`;\n}\nexport function formatStatus(goal: ActiveGoal | undefined): string | undefined {\n if (!goal) return undefined;\n if (goal.status === 'complete') return 'complete';\n if (goal.status === 'queued') return 'queued';\n if (goal.status === 'paused') return 'paused';\n if (goal.status === 'blocked') return 'blocked';\n if (goal.status === 'usage_limited') return 'usage';\n if (goal.status === 'budget_limited') return `budget ${formatBudget(goal)}`;\n return goal.tokenBudget === undefined\n ? `active ${formatDuration(goal.timeUsedSeconds)}`\n : `active ${formatBudget(goal)}`;\n}\nexport function goalSummary(\n goal: ActiveGoal,\n queuedGoals: readonly ActiveGoal[] = [],\n queueEnabled = false,\n queueFrozen = false,\n pendingAction?: PendingQueueAction,\n): string {\n const summary = [\n `Goal: ${goal.text}`,\n `Status: ${queueFrozen ? 'queue off' : goal.status}`,\n `Iteration: ${goal.iteration}`,\n `Automatic model responses: ${goal.automaticModelTurns}`,\n `Active elapsed: ${formatDuration(goal.timeUsedSeconds)}`,\n `Tokens: ${goal.tokenBudget === undefined ? formatTokenCount(goal.tokensUsed) : formatBudget(goal)}`,\n ];\n if (goal.safetyPauseCause)\n summary.push(\n `Safety pause: ${goal.safetyPauseCause === 'continuation_limit' ? 'automatic response limit' : 'no progress'}`,\n );\n if (queueEnabled || queuedGoals.length > 0 || queueFrozen || pendingAction) {\n const ordered = [\n `[${goal.status}] ${goal.text}`,\n ...(pendingAction?.kind === 'prioritize' ? [`[pending] ${pendingAction.objective}`] : []),\n ...queuedGoals.map((queued) => `[${queued.status}] ${queued.text}`),\n ];\n summary.push(`Goals (${ordered.length}):`, ...ordered.map((item, index) => `${index + 1}. ${item}`));\n }\n return summary.join('\\n');\n}\nexport function goalIdRejectionReason(goal: ActiveGoal, requestedGoalId: string): string | undefined {\n if (!requestedGoalId) return 'missing goal_id';\n return requestedGoalId === goal.id ? undefined : 'goal_id does not match the active goal';\n}\nexport function isContradictoryCompletionSummary(summary: string): boolean {\n return [\n /(?<!could\\s)\\bnot\\s+(?:yet\\s+)?(?:complete|completed|done|finished)\\b/iu,\n /\\bstill\\s+(?:incomplete|failing|fails?)\\b/iu,\n /\\btests?\\s+(?:still\\s+)?fail(?:ing)?\\b/iu,\n ].some((pattern) => pattern.test(summary));\n}\nexport function isGoalToolAllowedForState(status: GoalStatus, tool: 'goal_complete' | 'goal_blocked'): boolean {\n return status === 'active' || (status === 'budget_limited' && tool === 'goal_complete');\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=`goal_complete`,t=`goal_blocked`,n=[e,t];function r(t){return t?t.status===`budget_limited`?[e]:t.status===`active`?[...n]:[]:[]}function i(e){return e.filter(e=>!n.includes(e))}function a(t,r){let i=t.filter(e=>!n.includes(e)),a=r===`budget_limited`?[e]:r===`active`?n:[];return[...i,...a]}function o(e,t){return e?typeof t!=`string`||!t.trim()?{ok:!1,reason:`missing goal_id`}:t===e.id?{ok:!0}:{ok:!1,reason:`goal_id does not match the active goal`}:{ok:!1,reason:`no active goal`}}function s(e,t){let n=o(e,t.goal_id);return n.ok?typeof t.summary==`string`&&t.summary.trim()?{ok:!0}:{ok:!1,reason:`summary is empty`}:n}function c(e,t){let n=o(e,t.goal_id);return n.ok?typeof t.reason!=`string`||!t.reason.trim()?{ok:!1,reason:`reason is empty`}:t.reason.length>1e3?{ok:!1,reason:`reason is too long`}:typeof t.evidence!=`string`||!t.evidence.trim()?{ok:!1,reason:`evidence is empty`}:t.evidence.length>4e3?{ok:!1,reason:`evidence is too long`}:typeof t.repeated_turns==`number`&&Number.isInteger(t.repeated_turns)&&t.repeated_turns>=3?{ok:!0}:{ok:!1,reason:`repeated_turns must be at least 3`}:n}exports.GOAL_BLOCKED_TOOL=t,exports.GOAL_COMPLETE_TOOL=e,exports.GOAL_TOOL_NAMES=n,exports.addGoalTools=a,exports.filterGoalTools=i,exports.goalToolNamesForState=r,exports.validateBlockedInput=c,exports.validateCompletionInput=s,exports.validateGoalId=o;
2
+ //# sourceMappingURL=tools.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.cjs","names":[],"sources":["../../../src/services/goal/tools.ts"],"sourcesContent":["import type { ActiveGoal, GoalStatus } from '../../types/goal.ts';\nexport const GOAL_COMPLETE_TOOL = 'goal_complete' as const;\nexport const GOAL_BLOCKED_TOOL = 'goal_blocked' as const;\nexport const GOAL_TOOL_NAMES = [GOAL_COMPLETE_TOOL, GOAL_BLOCKED_TOOL] as const;\nexport type GoalToolName = (typeof GOAL_TOOL_NAMES)[number];\nexport interface GoalCompleteInput {\n goal_id: string;\n summary: string;\n}\nexport interface GoalBlockedInput {\n goal_id: string;\n reason: string;\n evidence: string;\n repeated_turns: number;\n}\nexport interface ToolValidationResult {\n ok: boolean;\n reason?: string;\n}\nexport function goalToolNamesForState(goal: ActiveGoal | undefined): GoalToolName[] {\n if (!goal) return [];\n if (goal.status === 'budget_limited') return [GOAL_COMPLETE_TOOL];\n return goal.status === 'active' ? [...GOAL_TOOL_NAMES] : [];\n}\nexport function filterGoalTools(activeTools: readonly string[]): string[] {\n return activeTools.filter((name) => !(GOAL_TOOL_NAMES as readonly string[]).includes(name));\n}\nexport function addGoalTools(activeTools: readonly string[], status: GoalStatus): string[] {\n const result = activeTools.filter((name) => !(GOAL_TOOL_NAMES as readonly string[]).includes(name));\n const names = status === 'budget_limited' ? [GOAL_COMPLETE_TOOL] : status === 'active' ? GOAL_TOOL_NAMES : [];\n return [...result, ...names];\n}\nexport function validateGoalId(goal: Pick<ActiveGoal, 'id'> | undefined, goalId: unknown): ToolValidationResult {\n if (!goal) return { ok: false, reason: 'no active goal' };\n if (typeof goalId !== 'string' || !goalId.trim()) return { ok: false, reason: 'missing goal_id' };\n return goalId === goal.id ? { ok: true } : { ok: false, reason: 'goal_id does not match the active goal' };\n}\nexport function validateCompletionInput(\n goal: ActiveGoal | undefined,\n input: Partial<GoalCompleteInput>,\n): ToolValidationResult {\n const id = validateGoalId(goal, input.goal_id);\n if (!id.ok) return id;\n const summary = typeof input.summary === 'string' ? input.summary.trim() : '';\n return summary ? { ok: true } : { ok: false, reason: 'summary is empty' };\n}\nexport function validateBlockedInput(\n goal: ActiveGoal | undefined,\n input: Partial<GoalBlockedInput>,\n): ToolValidationResult {\n const id = validateGoalId(goal, input.goal_id);\n if (!id.ok) return id;\n if (typeof input.reason !== 'string' || !input.reason.trim()) return { ok: false, reason: 'reason is empty' };\n if (input.reason.length > 1000) return { ok: false, reason: 'reason is too long' };\n if (typeof input.evidence !== 'string' || !input.evidence.trim()) return { ok: false, reason: 'evidence is empty' };\n if (input.evidence.length > 4000) return { ok: false, reason: 'evidence is too long' };\n return typeof input.repeated_turns === 'number' && Number.isInteger(input.repeated_turns) && input.repeated_turns >= 3\n ? { ok: true }\n : { ok: false, reason: 'repeated_turns must be at least 3' };\n}\n"],"mappings":"AACA,MAAa,EAAqB,gBACrB,EAAoB,eACpB,EAAkB,CAAC,EAAoB,CAAiB,EAgBrE,SAAgB,EAAsB,EAA8C,CAGlF,OAFK,EACD,EAAK,SAAW,iBAAyB,CAAC,CAAkB,EACzD,EAAK,SAAW,SAAW,CAAC,GAAG,CAAe,EAAI,CAAC,EAFxC,CAAC,CAGrB,CACA,SAAgB,EAAgB,EAA0C,CACxE,OAAO,EAAY,OAAQ,GAAS,CAAE,EAAsC,SAAS,CAAI,CAAC,CAC5F,CACA,SAAgB,EAAa,EAAgC,EAA8B,CACzF,IAAM,EAAS,EAAY,OAAQ,GAAS,CAAE,EAAsC,SAAS,CAAI,CAAC,EAC5F,EAAQ,IAAW,iBAAmB,CAAC,CAAkB,EAAI,IAAW,SAAW,EAAkB,CAAC,EAC5G,MAAO,CAAC,GAAG,EAAQ,GAAG,CAAK,CAC7B,CACA,SAAgB,EAAe,EAA0C,EAAuC,CAG9G,OAFK,EACD,OAAO,GAAW,UAAY,CAAC,EAAO,KAAK,EAAU,CAAE,GAAI,GAAO,OAAQ,iBAAkB,EACzF,IAAW,EAAK,GAAK,CAAE,GAAI,EAAK,EAAI,CAAE,GAAI,GAAO,OAAQ,wCAAyC,EAFvF,CAAE,GAAI,GAAO,OAAQ,gBAAiB,CAG1D,CACA,SAAgB,EACd,EACA,EACsB,CACtB,IAAM,EAAK,EAAe,EAAM,EAAM,OAAO,EAG7C,OAFK,EAAG,GACQ,OAAO,EAAM,SAAY,UAAW,EAAM,QAAQ,KAAK,EACtD,CAAE,GAAI,EAAK,EAAI,CAAE,GAAI,GAAO,OAAQ,kBAAmB,EAFrD,CAGrB,CACA,SAAgB,EACd,EACA,EACsB,CACtB,IAAM,EAAK,EAAe,EAAM,EAAM,OAAO,EAM7C,OALK,EAAG,GACJ,OAAO,EAAM,QAAW,UAAY,CAAC,EAAM,OAAO,KAAK,EAAU,CAAE,GAAI,GAAO,OAAQ,iBAAkB,EACxG,EAAM,OAAO,OAAS,IAAa,CAAE,GAAI,GAAO,OAAQ,oBAAqB,EAC7E,OAAO,EAAM,UAAa,UAAY,CAAC,EAAM,SAAS,KAAK,EAAU,CAAE,GAAI,GAAO,OAAQ,mBAAoB,EAC9G,EAAM,SAAS,OAAS,IAAa,CAAE,GAAI,GAAO,OAAQ,sBAAuB,EAC9E,OAAO,EAAM,gBAAmB,UAAY,OAAO,UAAU,EAAM,cAAc,GAAK,EAAM,gBAAkB,EACjH,CAAE,GAAI,EAAK,EACX,CAAE,GAAI,GAAO,OAAQ,mCAAoC,EAP1C,CAQrB"}