@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,29 @@
1
+ import { ActiveGoal, GoalStatus } from "../../types/goal.cjs";
2
+ //#region src/services/goal/tools.d.ts
3
+ declare const GOAL_COMPLETE_TOOL: "goal_complete";
4
+ declare const GOAL_BLOCKED_TOOL: "goal_blocked";
5
+ declare const GOAL_TOOL_NAMES: readonly ["goal_complete", "goal_blocked"];
6
+ type GoalToolName = (typeof GOAL_TOOL_NAMES)[number];
7
+ interface GoalCompleteInput {
8
+ goal_id: string;
9
+ summary: string;
10
+ }
11
+ interface GoalBlockedInput {
12
+ goal_id: string;
13
+ reason: string;
14
+ evidence: string;
15
+ repeated_turns: number;
16
+ }
17
+ interface ToolValidationResult {
18
+ ok: boolean;
19
+ reason?: string;
20
+ }
21
+ declare function goalToolNamesForState(goal: ActiveGoal | undefined): GoalToolName[];
22
+ declare function filterGoalTools(activeTools: readonly string[]): string[];
23
+ declare function addGoalTools(activeTools: readonly string[], status: GoalStatus): string[];
24
+ declare function validateGoalId(goal: Pick<ActiveGoal, 'id'> | undefined, goalId: unknown): ToolValidationResult;
25
+ declare function validateCompletionInput(goal: ActiveGoal | undefined, input: Partial<GoalCompleteInput>): ToolValidationResult;
26
+ declare function validateBlockedInput(goal: ActiveGoal | undefined, input: Partial<GoalBlockedInput>): ToolValidationResult;
27
+ //#endregion
28
+ export { GOAL_BLOCKED_TOOL, GOAL_COMPLETE_TOOL, GOAL_TOOL_NAMES, GoalBlockedInput, GoalCompleteInput, GoalToolName, ToolValidationResult, addGoalTools, filterGoalTools, goalToolNamesForState, validateBlockedInput, validateCompletionInput, validateGoalId };
29
+ //# sourceMappingURL=tools.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.cts","names":[],"sources":["../../../src/services/goal/tools.ts"],"mappings":";;cACa;cACA;cACA;KACD,uBAAuB;UAClB;EACf;EACA;;UAEe;EACf;EACA;EACA;EACA;;UAEe;EACf;EACA;;iBAEc,sBAAsB,MAAM,yBAAyB;iBAKrD,gBAAgB;iBAGhB,aAAa,gCAAgC,QAAQ;iBAKrD,eAAe,MAAM,KAAK,+BAA+B,kBAAkB;iBAK3E,wBACd,MAAM,wBACN,OAAO,QAAQ,qBACd;iBAMa,qBACd,MAAM,wBACN,OAAO,QAAQ,oBACd"}
@@ -0,0 +1,29 @@
1
+ import { ActiveGoal, GoalStatus } from "../../types/goal.mjs";
2
+ //#region src/services/goal/tools.d.ts
3
+ declare const GOAL_COMPLETE_TOOL: "goal_complete";
4
+ declare const GOAL_BLOCKED_TOOL: "goal_blocked";
5
+ declare const GOAL_TOOL_NAMES: readonly ["goal_complete", "goal_blocked"];
6
+ type GoalToolName = (typeof GOAL_TOOL_NAMES)[number];
7
+ interface GoalCompleteInput {
8
+ goal_id: string;
9
+ summary: string;
10
+ }
11
+ interface GoalBlockedInput {
12
+ goal_id: string;
13
+ reason: string;
14
+ evidence: string;
15
+ repeated_turns: number;
16
+ }
17
+ interface ToolValidationResult {
18
+ ok: boolean;
19
+ reason?: string;
20
+ }
21
+ declare function goalToolNamesForState(goal: ActiveGoal | undefined): GoalToolName[];
22
+ declare function filterGoalTools(activeTools: readonly string[]): string[];
23
+ declare function addGoalTools(activeTools: readonly string[], status: GoalStatus): string[];
24
+ declare function validateGoalId(goal: Pick<ActiveGoal, 'id'> | undefined, goalId: unknown): ToolValidationResult;
25
+ declare function validateCompletionInput(goal: ActiveGoal | undefined, input: Partial<GoalCompleteInput>): ToolValidationResult;
26
+ declare function validateBlockedInput(goal: ActiveGoal | undefined, input: Partial<GoalBlockedInput>): ToolValidationResult;
27
+ //#endregion
28
+ export { GOAL_BLOCKED_TOOL, GOAL_COMPLETE_TOOL, GOAL_TOOL_NAMES, GoalBlockedInput, GoalCompleteInput, GoalToolName, ToolValidationResult, addGoalTools, filterGoalTools, goalToolNamesForState, validateBlockedInput, validateCompletionInput, validateGoalId };
29
+ //# sourceMappingURL=tools.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.mts","names":[],"sources":["../../../src/services/goal/tools.ts"],"mappings":";;cACa;cACA;cACA;KACD,uBAAuB;UAClB;EACf;EACA;;UAEe;EACf;EACA;EACA;EACA;;UAEe;EACf;EACA;;iBAEc,sBAAsB,MAAM,yBAAyB;iBAKrD,gBAAgB;iBAGhB,aAAa,gCAAgC,QAAQ;iBAKrD,eAAe,MAAM,KAAK,+BAA+B,kBAAkB;iBAK3E,wBACd,MAAM,wBACN,OAAO,QAAQ,qBACd;iBAMa,qBACd,MAAM,wBACN,OAAO,QAAQ,oBACd"}
@@ -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}export{t as GOAL_BLOCKED_TOOL,e as GOAL_COMPLETE_TOOL,n as GOAL_TOOL_NAMES,a as addGoalTools,i as filterGoalTools,r as goalToolNamesForState,c as validateBlockedInput,s as validateCompletionInput,o as validateGoalId};
2
+ //# sourceMappingURL=tools.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.mjs","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"}
@@ -0,0 +1,2 @@
1
+ var e=class{store;constructor(e){this.store=e}list(){return this.store.list()}archive(e){return this.store.archive(e)}remove(e){return this.store.remove(e)}async restart(e){let t=(await this.store.list()).find(t=>t.id===e);if(!t)throw Error(`Goal history entry '${e}' was not found.`);return{historyId:t.id,goalId:globalThis.crypto.randomUUID(),objective:t.objective,...t.budget===void 0?{}:{budget:t.budget}}}};exports.GoalHistoryService=e;
2
+ //# sourceMappingURL=historyService.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historyService.cjs","names":[],"sources":["../../../src/services/history/historyService.ts"],"sourcesContent":["import type { GoalHistoryEntry, GoalHistoryPort, HistoryRestart } from '../../types/history.ts';\n\nexport class GoalHistoryService implements GoalHistoryPort {\n constructor(private readonly store: Pick<GoalHistoryPort, 'list' | 'archive' | 'remove'>) {}\n\n list(): Promise<GoalHistoryEntry[]> {\n return this.store.list();\n }\n\n archive(entry: GoalHistoryEntry): Promise<GoalHistoryEntry> {\n return this.store.archive(entry);\n }\n\n remove(id: string): Promise<void> {\n return this.store.remove(id);\n }\n\n async restart(id: string): Promise<HistoryRestart> {\n const entry = (await this.store.list()).find((candidate) => candidate.id === id);\n if (!entry) throw new Error(`Goal history entry '${id}' was not found.`);\n return {\n historyId: entry.id,\n goalId: globalThis.crypto.randomUUID(),\n objective: entry.objective,\n ...(entry.budget === undefined ? {} : { budget: entry.budget }),\n };\n }\n}\n"],"mappings":"AAEA,IAAa,EAAb,KAA2D,CAC5B,MAA7B,YAAY,EAA8E,CAA7D,KAAA,MAAA,CAA8D,CAE3F,MAAoC,CAClC,OAAO,KAAK,MAAM,KAAK,CACzB,CAEA,QAAQ,EAAoD,CAC1D,OAAO,KAAK,MAAM,QAAQ,CAAK,CACjC,CAEA,OAAO,EAA2B,CAChC,OAAO,KAAK,MAAM,OAAO,CAAE,CAC7B,CAEA,MAAM,QAAQ,EAAqC,CACjD,IAAM,GAAS,MAAM,KAAK,MAAM,KAAK,EAAA,CAAG,KAAM,GAAc,EAAU,KAAO,CAAE,EAC/E,GAAI,CAAC,EAAO,MAAU,MAAM,uBAAuB,EAAG,iBAAiB,EACvE,MAAO,CACL,UAAW,EAAM,GACjB,OAAQ,WAAW,OAAO,WAAW,EACrC,UAAW,EAAM,UACjB,GAAI,EAAM,SAAW,IAAA,GAAY,CAAC,EAAI,CAAE,OAAQ,EAAM,MAAO,CAC/D,CACF,CACF"}
@@ -0,0 +1,2 @@
1
+ var e=class{store;constructor(e){this.store=e}list(){return this.store.list()}archive(e){return this.store.archive(e)}remove(e){return this.store.remove(e)}async restart(e){let t=(await this.store.list()).find(t=>t.id===e);if(!t)throw Error(`Goal history entry '${e}' was not found.`);return{historyId:t.id,goalId:globalThis.crypto.randomUUID(),objective:t.objective,...t.budget===void 0?{}:{budget:t.budget}}}};export{e as GoalHistoryService};
2
+ //# sourceMappingURL=historyService.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historyService.mjs","names":[],"sources":["../../../src/services/history/historyService.ts"],"sourcesContent":["import type { GoalHistoryEntry, GoalHistoryPort, HistoryRestart } from '../../types/history.ts';\n\nexport class GoalHistoryService implements GoalHistoryPort {\n constructor(private readonly store: Pick<GoalHistoryPort, 'list' | 'archive' | 'remove'>) {}\n\n list(): Promise<GoalHistoryEntry[]> {\n return this.store.list();\n }\n\n archive(entry: GoalHistoryEntry): Promise<GoalHistoryEntry> {\n return this.store.archive(entry);\n }\n\n remove(id: string): Promise<void> {\n return this.store.remove(id);\n }\n\n async restart(id: string): Promise<HistoryRestart> {\n const entry = (await this.store.list()).find((candidate) => candidate.id === id);\n if (!entry) throw new Error(`Goal history entry '${id}' was not found.`);\n return {\n historyId: entry.id,\n goalId: globalThis.crypto.randomUUID(),\n objective: entry.objective,\n ...(entry.budget === undefined ? {} : { budget: entry.budget }),\n };\n }\n}\n"],"mappings":"AAEA,IAAa,EAAb,KAA2D,CAC5B,MAA7B,YAAY,EAA8E,CAA7D,KAAA,MAAA,CAA8D,CAE3F,MAAoC,CAClC,OAAO,KAAK,MAAM,KAAK,CACzB,CAEA,QAAQ,EAAoD,CAC1D,OAAO,KAAK,MAAM,QAAQ,CAAK,CACjC,CAEA,OAAO,EAA2B,CAChC,OAAO,KAAK,MAAM,OAAO,CAAE,CAC7B,CAEA,MAAM,QAAQ,EAAqC,CACjD,IAAM,GAAS,MAAM,KAAK,MAAM,KAAK,EAAA,CAAG,KAAM,GAAc,EAAU,KAAO,CAAE,EAC/E,GAAI,CAAC,EAAO,MAAU,MAAM,uBAAuB,EAAG,iBAAiB,EACvE,MAAO,CACL,UAAW,EAAM,GACjB,OAAQ,WAAW,OAAO,WAAW,EACrC,UAAW,EAAM,UACjB,GAAI,EAAM,SAAW,IAAA,GAAY,CAAC,EAAI,CAAE,OAAQ,EAAM,MAAO,CAC/D,CACF,CACF"}
@@ -0,0 +1,3 @@
1
+ let e=require("@agimon-ai/doompi-ui/components/doomOverlay"),t=require("@earendil-works/pi-tui");var n=class extends e.DoomOverlay{manager;context;done;entries=[];selected=0;loading=!0;constructor(e,t,n,r,i){super(e,t),this.manager=n,this.context=r,this.done=i,this.refresh()}handleInput(e){if((0,t.matchesKey)(e,`escape`)||(0,t.matchesKey)(e,`ctrl+c`)||e===`q`){this.done(void 0);return}if((0,t.matchesKey)(e,`up`)||e===`k`){this.move(-1);return}if((0,t.matchesKey)(e,`down`)||e===`j`){this.move(1);return}if((0,t.matchesKey)(e,`enter`)||e===`\r`||e===`
2
+ `){this.restartSelected();return}e===`x`&&this.removeSelected()}getChrome(){return{title:`GOAL HISTORY`,breadcrumb:`SPC › g / goal › p / history`,headerRight:`${this.entries.length} archived`,footer:`enter restart · x remove · j/k move · esc close`,footerHints:[[`enter`,`restart`],[`x`,`remove`],[`j/k`,`move`],[`esc`,`close`]],accent:e.DOOM_OVERLAY_ACCENT}}renderBody(e){return this.loading?[this.theme.fg(`dim`,`Loading Goal history…`)]:this.entries.length===0?[this.theme.fg(`dim`,`No archived Goals for this repository.`)]:this.entries.flatMap((n,r)=>{let i=r===this.selected?this.theme.fg(`accent`,`▸`):` `,a=(0,t.truncateToWidth)(`${i} ${n.objective}`,e),o=`${n.status} · ${new Date(n.archivedAt).toLocaleString()}`;return[a,` ${this.theme.fg(`dim`,(0,t.truncateToWidth)(o,Math.max(0,e-4)))}`]})}move(e){this.entries.length!==0&&(this.selected=Math.max(0,Math.min(this.selected+e,this.entries.length-1)),this.invalidate())}async refresh(){try{this.entries=(await this.manager.listHistory(this.context)).toSorted((e,t)=>Date.parse(t.archivedAt)-Date.parse(e.archivedAt)),this.selected=Math.min(this.selected,Math.max(0,this.entries.length-1))}catch{this.entries=[]}finally{this.loading=!1,this.invalidate()}}async restartSelected(){let e=this.entries[this.selected];e&&(await this.manager.restartFromHistory(e.id,this.context),this.done(void 0))}async removeSelected(){let e=this.entries[this.selected];e&&await this.context.ui.confirm(`Remove Goal history?`,e.objective)&&(await this.manager.removeHistory(e.id,this.context),await this.refresh())}};async function r(t,r){if(!t.hasUI||t.mode!==`tui`){t.ui.notify(`Goal history is available in the Doom TUI.`,`warning`);return}await t.ui.custom((e,i,a,o)=>new n(e,i,r,t,o),e.DOOM_FULLSCREEN_UI_OPTIONS)}exports.GoalHistoryOverlay=n,exports.openGoalHistoryOverlay=r;
3
+ //# sourceMappingURL=goalHistoryOverlay.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goalHistoryOverlay.cjs","names":["DoomOverlay","matchesKey","DOOM_OVERLAY_ACCENT","truncateToWidth","DOOM_FULLSCREEN_UI_OPTIONS"],"sources":["../../src/tui/goalHistoryOverlay.ts"],"sourcesContent":["import {\n DOOM_FULLSCREEN_UI_OPTIONS,\n DOOM_OVERLAY_ACCENT,\n DoomOverlay,\n type DoomOverlayChrome,\n type DoomOverlayTui,\n} from '@agimon-ai/doompi-ui/components/doomOverlay';\nimport type { ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport { matchesKey, truncateToWidth } from '@earendil-works/pi-tui';\nimport type { GoalHistoryEntry } from '../types/history.ts';\n\ninterface GoalHistoryManager {\n listHistory(context: ExtensionContext): Promise<GoalHistoryEntry[]>;\n restartFromHistory(id: string, context: ExtensionContext): Promise<void>;\n removeHistory(id: string, context: ExtensionContext): Promise<void>;\n}\n\nconst EMPTY_MESSAGE = 'No archived Goals for this repository.';\n\nexport class GoalHistoryOverlay extends DoomOverlay {\n private entries: GoalHistoryEntry[] = [];\n private selected = 0;\n private loading = true;\n\n constructor(\n tui: DoomOverlayTui,\n theme: Theme,\n private readonly manager: GoalHistoryManager,\n private readonly context: ExtensionContext,\n private readonly done: (result: undefined) => void,\n ) {\n super(tui, theme);\n void this.refresh();\n }\n\n handleInput(data: string): void {\n if (matchesKey(data, 'escape') || matchesKey(data, 'ctrl+c') || data === 'q') {\n this.done(undefined);\n return;\n }\n if (matchesKey(data, 'up') || data === 'k') {\n this.move(-1);\n return;\n }\n if (matchesKey(data, 'down') || data === 'j') {\n this.move(1);\n return;\n }\n if (matchesKey(data, 'enter') || data === '\\r' || data === '\\n') {\n void this.restartSelected();\n return;\n }\n if (data === 'x') void this.removeSelected();\n }\n\n protected getChrome(): DoomOverlayChrome {\n return {\n title: 'GOAL HISTORY',\n breadcrumb: 'SPC › g / goal › p / history',\n headerRight: `${this.entries.length} archived`,\n footer: 'enter restart · x remove · j/k move · esc close',\n footerHints: [\n ['enter', 'restart'],\n ['x', 'remove'],\n ['j/k', 'move'],\n ['esc', 'close'],\n ],\n accent: DOOM_OVERLAY_ACCENT,\n };\n }\n\n protected renderBody(width: number): string[] {\n if (this.loading) return [this.theme.fg('dim', 'Loading Goal history…')];\n if (this.entries.length === 0) return [this.theme.fg('dim', EMPTY_MESSAGE)];\n return this.entries.flatMap((entry, index) => {\n const marker = index === this.selected ? this.theme.fg('accent', '▸') : ' ';\n const objective = truncateToWidth(`${marker} ${entry.objective}`, width);\n const detail = `${entry.status} · ${new Date(entry.archivedAt).toLocaleString()}`;\n return [objective, ` ${this.theme.fg('dim', truncateToWidth(detail, Math.max(0, width - 4)))}`];\n });\n }\n\n private move(delta: number): void {\n if (this.entries.length === 0) return;\n this.selected = Math.max(0, Math.min(this.selected + delta, this.entries.length - 1));\n this.invalidate();\n }\n\n private async refresh(): Promise<void> {\n try {\n this.entries = (await this.manager.listHistory(this.context)).toSorted(\n (left, right) => Date.parse(right.archivedAt) - Date.parse(left.archivedAt),\n );\n this.selected = Math.min(this.selected, Math.max(0, this.entries.length - 1));\n } catch {\n this.entries = [];\n } finally {\n this.loading = false;\n this.invalidate();\n }\n }\n\n private async restartSelected(): Promise<void> {\n const entry = this.entries[this.selected];\n if (!entry) return;\n await this.manager.restartFromHistory(entry.id, this.context);\n this.done(undefined);\n }\n\n private async removeSelected(): Promise<void> {\n const entry = this.entries[this.selected];\n if (!entry) return;\n const accepted = await this.context.ui.confirm('Remove Goal history?', entry.objective);\n if (!accepted) return;\n await this.manager.removeHistory(entry.id, this.context);\n await this.refresh();\n }\n}\n\nexport async function openGoalHistoryOverlay(ctx: ExtensionContext, manager: GoalHistoryManager): Promise<void> {\n if (!ctx.hasUI || ctx.mode !== 'tui') {\n ctx.ui.notify('Goal history is available in the Doom TUI.', 'warning');\n return;\n }\n await ctx.ui.custom<undefined>(\n (tui, theme, _keybindings, done) => new GoalHistoryOverlay(tui, theme, manager, ctx, done),\n DOOM_FULLSCREEN_UI_OPTIONS,\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import{DOOM_FULLSCREEN_UI_OPTIONS as e,DOOM_OVERLAY_ACCENT as t,DoomOverlay as n}from"@agimon-ai/doompi-ui/components/doomOverlay";import{matchesKey as r,truncateToWidth as i}from"@earendil-works/pi-tui";var a=class extends n{manager;context;done;entries=[];selected=0;loading=!0;constructor(e,t,n,r,i){super(e,t),this.manager=n,this.context=r,this.done=i,this.refresh()}handleInput(e){if(r(e,`escape`)||r(e,`ctrl+c`)||e===`q`){this.done(void 0);return}if(r(e,`up`)||e===`k`){this.move(-1);return}if(r(e,`down`)||e===`j`){this.move(1);return}if(r(e,`enter`)||e===`\r`||e===`
2
+ `){this.restartSelected();return}e===`x`&&this.removeSelected()}getChrome(){return{title:`GOAL HISTORY`,breadcrumb:`SPC › g / goal › p / history`,headerRight:`${this.entries.length} archived`,footer:`enter restart · x remove · j/k move · esc close`,footerHints:[[`enter`,`restart`],[`x`,`remove`],[`j/k`,`move`],[`esc`,`close`]],accent:t}}renderBody(e){return this.loading?[this.theme.fg(`dim`,`Loading Goal history…`)]:this.entries.length===0?[this.theme.fg(`dim`,`No archived Goals for this repository.`)]:this.entries.flatMap((t,n)=>{let r=n===this.selected?this.theme.fg(`accent`,`▸`):` `,a=i(`${r} ${t.objective}`,e),o=`${t.status} · ${new Date(t.archivedAt).toLocaleString()}`;return[a,` ${this.theme.fg(`dim`,i(o,Math.max(0,e-4)))}`]})}move(e){this.entries.length!==0&&(this.selected=Math.max(0,Math.min(this.selected+e,this.entries.length-1)),this.invalidate())}async refresh(){try{this.entries=(await this.manager.listHistory(this.context)).toSorted((e,t)=>Date.parse(t.archivedAt)-Date.parse(e.archivedAt)),this.selected=Math.min(this.selected,Math.max(0,this.entries.length-1))}catch{this.entries=[]}finally{this.loading=!1,this.invalidate()}}async restartSelected(){let e=this.entries[this.selected];e&&(await this.manager.restartFromHistory(e.id,this.context),this.done(void 0))}async removeSelected(){let e=this.entries[this.selected];e&&await this.context.ui.confirm(`Remove Goal history?`,e.objective)&&(await this.manager.removeHistory(e.id,this.context),await this.refresh())}};async function o(t,n){if(!t.hasUI||t.mode!==`tui`){t.ui.notify(`Goal history is available in the Doom TUI.`,`warning`);return}await t.ui.custom((e,r,i,o)=>new a(e,r,n,t,o),e)}export{a as GoalHistoryOverlay,o as openGoalHistoryOverlay};
3
+ //# sourceMappingURL=goalHistoryOverlay.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goalHistoryOverlay.mjs","names":[],"sources":["../../src/tui/goalHistoryOverlay.ts"],"sourcesContent":["import {\n DOOM_FULLSCREEN_UI_OPTIONS,\n DOOM_OVERLAY_ACCENT,\n DoomOverlay,\n type DoomOverlayChrome,\n type DoomOverlayTui,\n} from '@agimon-ai/doompi-ui/components/doomOverlay';\nimport type { ExtensionContext, Theme } from '@earendil-works/pi-coding-agent';\nimport { matchesKey, truncateToWidth } from '@earendil-works/pi-tui';\nimport type { GoalHistoryEntry } from '../types/history.ts';\n\ninterface GoalHistoryManager {\n listHistory(context: ExtensionContext): Promise<GoalHistoryEntry[]>;\n restartFromHistory(id: string, context: ExtensionContext): Promise<void>;\n removeHistory(id: string, context: ExtensionContext): Promise<void>;\n}\n\nconst EMPTY_MESSAGE = 'No archived Goals for this repository.';\n\nexport class GoalHistoryOverlay extends DoomOverlay {\n private entries: GoalHistoryEntry[] = [];\n private selected = 0;\n private loading = true;\n\n constructor(\n tui: DoomOverlayTui,\n theme: Theme,\n private readonly manager: GoalHistoryManager,\n private readonly context: ExtensionContext,\n private readonly done: (result: undefined) => void,\n ) {\n super(tui, theme);\n void this.refresh();\n }\n\n handleInput(data: string): void {\n if (matchesKey(data, 'escape') || matchesKey(data, 'ctrl+c') || data === 'q') {\n this.done(undefined);\n return;\n }\n if (matchesKey(data, 'up') || data === 'k') {\n this.move(-1);\n return;\n }\n if (matchesKey(data, 'down') || data === 'j') {\n this.move(1);\n return;\n }\n if (matchesKey(data, 'enter') || data === '\\r' || data === '\\n') {\n void this.restartSelected();\n return;\n }\n if (data === 'x') void this.removeSelected();\n }\n\n protected getChrome(): DoomOverlayChrome {\n return {\n title: 'GOAL HISTORY',\n breadcrumb: 'SPC › g / goal › p / history',\n headerRight: `${this.entries.length} archived`,\n footer: 'enter restart · x remove · j/k move · esc close',\n footerHints: [\n ['enter', 'restart'],\n ['x', 'remove'],\n ['j/k', 'move'],\n ['esc', 'close'],\n ],\n accent: DOOM_OVERLAY_ACCENT,\n };\n }\n\n protected renderBody(width: number): string[] {\n if (this.loading) return [this.theme.fg('dim', 'Loading Goal history…')];\n if (this.entries.length === 0) return [this.theme.fg('dim', EMPTY_MESSAGE)];\n return this.entries.flatMap((entry, index) => {\n const marker = index === this.selected ? this.theme.fg('accent', '▸') : ' ';\n const objective = truncateToWidth(`${marker} ${entry.objective}`, width);\n const detail = `${entry.status} · ${new Date(entry.archivedAt).toLocaleString()}`;\n return [objective, ` ${this.theme.fg('dim', truncateToWidth(detail, Math.max(0, width - 4)))}`];\n });\n }\n\n private move(delta: number): void {\n if (this.entries.length === 0) return;\n this.selected = Math.max(0, Math.min(this.selected + delta, this.entries.length - 1));\n this.invalidate();\n }\n\n private async refresh(): Promise<void> {\n try {\n this.entries = (await this.manager.listHistory(this.context)).toSorted(\n (left, right) => Date.parse(right.archivedAt) - Date.parse(left.archivedAt),\n );\n this.selected = Math.min(this.selected, Math.max(0, this.entries.length - 1));\n } catch {\n this.entries = [];\n } finally {\n this.loading = false;\n this.invalidate();\n }\n }\n\n private async restartSelected(): Promise<void> {\n const entry = this.entries[this.selected];\n if (!entry) return;\n await this.manager.restartFromHistory(entry.id, this.context);\n this.done(undefined);\n }\n\n private async removeSelected(): Promise<void> {\n const entry = this.entries[this.selected];\n if (!entry) return;\n const accepted = await this.context.ui.confirm('Remove Goal history?', entry.objective);\n if (!accepted) return;\n await this.manager.removeHistory(entry.id, this.context);\n await this.refresh();\n }\n}\n\nexport async function openGoalHistoryOverlay(ctx: ExtensionContext, manager: GoalHistoryManager): Promise<void> {\n if (!ctx.hasUI || ctx.mode !== 'tui') {\n ctx.ui.notify('Goal history is available in the Doom TUI.', 'warning');\n return;\n }\n await ctx.ui.custom<undefined>(\n (tui, theme, _keybindings, done) => new GoalHistoryOverlay(tui, theme, manager, ctx, done),\n DOOM_FULLSCREEN_UI_OPTIONS,\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { GoalHistoryPort } from "./history.cjs";
2
+ //#region src/types/extension.d.ts
3
+ type GoalNotificationLevel = 'info';
4
+ interface GoalExtensionResult {
5
+ message: string;
6
+ level: GoalNotificationLevel;
7
+ }
8
+ interface GoalExtensionService {
9
+ execute(): Promise<GoalExtensionResult>;
10
+ }
11
+ interface GoalExtensionDependencies {
12
+ service: GoalExtensionService;
13
+ history?: GoalHistoryPort;
14
+ }
15
+ //#endregion
16
+ export { GoalExtensionDependencies, GoalExtensionResult, GoalExtensionService, GoalNotificationLevel };
17
+ //# sourceMappingURL=extension.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.cts","names":[],"sources":["../../src/types/extension.ts"],"mappings":";;KAEY;UAEK;EACf;EACA,OAAO;;UAGQ;EACf,WAAW,QAAQ;;UAGJ;EACf,SAAS;EACT,UAAU"}
@@ -0,0 +1,17 @@
1
+ import { GoalHistoryPort } from "./history.mjs";
2
+ //#region src/types/extension.d.ts
3
+ type GoalNotificationLevel = 'info';
4
+ interface GoalExtensionResult {
5
+ message: string;
6
+ level: GoalNotificationLevel;
7
+ }
8
+ interface GoalExtensionService {
9
+ execute(): Promise<GoalExtensionResult>;
10
+ }
11
+ interface GoalExtensionDependencies {
12
+ service: GoalExtensionService;
13
+ history?: GoalHistoryPort;
14
+ }
15
+ //#endregion
16
+ export { GoalExtensionDependencies, GoalExtensionResult, GoalExtensionService, GoalNotificationLevel };
17
+ //# sourceMappingURL=extension.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.mts","names":[],"sources":["../../src/types/extension.ts"],"mappings":";;KAEY;UAEK;EACf;EACA,OAAO;;UAGQ;EACf,WAAW,QAAQ;;UAGJ;EACf,SAAS;EACT,UAAU"}
@@ -0,0 +1,2 @@
1
+ const e=[`active`,`queued`,`paused`,`blocked`,`usage_limited`,`budget_limited`,`complete`];exports.GOAL_STATUSES=e;
2
+ //# sourceMappingURL=goal.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal.cjs","names":[],"sources":["../../src/types/goal.ts"],"sourcesContent":["export const GOAL_STATUSES = [\n 'active',\n 'queued',\n 'paused',\n 'blocked',\n 'usage_limited',\n 'budget_limited',\n 'complete',\n] as const;\nexport type GoalStatus = (typeof GOAL_STATUSES)[number];\nexport type SafetyPauseCause = 'continuation_limit' | 'no_progress';\nexport interface ActiveGoal {\n id: string;\n text: string;\n status: GoalStatus;\n startedAt: number;\n updatedAt: number;\n iteration: number;\n tokenBudget?: number;\n tokensUsed: number;\n timeUsedSeconds: number;\n baselineTokens: number;\n activeStartedAt?: number;\n automaticModelTurns: number;\n toolFreeRepeatCount: number;\n lastToolFreeOutputFingerprint?: string;\n safetyPauseCause?: SafetyPauseCause;\n safetyResetPending?: boolean;\n}\nexport type PendingQueueAction =\n | { kind: 'prioritize'; objective: string; tokenBudget?: number; displacedUsageFinalized?: boolean }\n | { kind: 'advance'; goalId: string; reason: 'complete' | 'skip'; completedText: string };\nexport interface GoalStateData {\n goal: ActiveGoal | null;\n queue?: ActiveGoal[];\n pendingAction?: PendingQueueAction;\n}\nexport interface LoadedGoalState {\n goal?: ActiveGoal;\n queue: ActiveGoal[];\n pendingAction?: PendingQueueAction;\n hasExperimentalQueueState: boolean;\n source: 'none' | 'canonical' | 'legacy-goals';\n malformed: boolean;\n}\nexport type GoalExecutionState = 'dormant' | 'executing' | 'retained';\nexport interface GoalRuntimeSnapshot {\n loaded: boolean;\n execution: GoalExecutionState;\n goal?: ActiveGoal;\n queue: readonly ActiveGoal[];\n pendingAction?: PendingQueueAction;\n}\n"],"mappings":"AAAA,MAAa,EAAgB,CAC3B,SACA,SACA,SACA,UACA,gBACA,iBACA,UACF"}
@@ -0,0 +1,57 @@
1
+ //#region src/types/goal.d.ts
2
+ declare const GOAL_STATUSES: readonly ["active", "queued", "paused", "blocked", "usage_limited", "budget_limited", "complete"];
3
+ type GoalStatus = (typeof GOAL_STATUSES)[number];
4
+ type SafetyPauseCause = 'continuation_limit' | 'no_progress';
5
+ interface ActiveGoal {
6
+ id: string;
7
+ text: string;
8
+ status: GoalStatus;
9
+ startedAt: number;
10
+ updatedAt: number;
11
+ iteration: number;
12
+ tokenBudget?: number;
13
+ tokensUsed: number;
14
+ timeUsedSeconds: number;
15
+ baselineTokens: number;
16
+ activeStartedAt?: number;
17
+ automaticModelTurns: number;
18
+ toolFreeRepeatCount: number;
19
+ lastToolFreeOutputFingerprint?: string;
20
+ safetyPauseCause?: SafetyPauseCause;
21
+ safetyResetPending?: boolean;
22
+ }
23
+ type PendingQueueAction = {
24
+ kind: 'prioritize';
25
+ objective: string;
26
+ tokenBudget?: number;
27
+ displacedUsageFinalized?: boolean;
28
+ } | {
29
+ kind: 'advance';
30
+ goalId: string;
31
+ reason: 'complete' | 'skip';
32
+ completedText: string;
33
+ };
34
+ interface GoalStateData {
35
+ goal: ActiveGoal | null;
36
+ queue?: ActiveGoal[];
37
+ pendingAction?: PendingQueueAction;
38
+ }
39
+ interface LoadedGoalState {
40
+ goal?: ActiveGoal;
41
+ queue: ActiveGoal[];
42
+ pendingAction?: PendingQueueAction;
43
+ hasExperimentalQueueState: boolean;
44
+ source: 'none' | 'canonical' | 'legacy-goals';
45
+ malformed: boolean;
46
+ }
47
+ type GoalExecutionState = 'dormant' | 'executing' | 'retained';
48
+ interface GoalRuntimeSnapshot {
49
+ loaded: boolean;
50
+ execution: GoalExecutionState;
51
+ goal?: ActiveGoal;
52
+ queue: readonly ActiveGoal[];
53
+ pendingAction?: PendingQueueAction;
54
+ }
55
+ //#endregion
56
+ export { ActiveGoal, GOAL_STATUSES, GoalExecutionState, GoalRuntimeSnapshot, GoalStateData, GoalStatus, LoadedGoalState, PendingQueueAction, SafetyPauseCause };
57
+ //# sourceMappingURL=goal.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal.d.cts","names":[],"sources":["../../src/types/goal.ts"],"mappings":";cAAa;KASD,qBAAqB;KACrB;UACK;EACf;EACA;EACA,QAAQ;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,mBAAmB;EACnB;;KAEU;EACN;EAAoB;EAAmB;EAAsB;;EAC7D;EAAiB;EAAgB;EAA6B;;UACnD;EACf,MAAM;EACN,QAAQ;EACR,gBAAgB;;UAED;EACf,OAAO;EACP,OAAO;EACP,gBAAgB;EAChB;EACA;EACA;;KAEU;UACK;EACf;EACA,WAAW;EACX,OAAO;EACP,gBAAgB;EAChB,gBAAgB"}
@@ -0,0 +1,57 @@
1
+ //#region src/types/goal.d.ts
2
+ declare const GOAL_STATUSES: readonly ["active", "queued", "paused", "blocked", "usage_limited", "budget_limited", "complete"];
3
+ type GoalStatus = (typeof GOAL_STATUSES)[number];
4
+ type SafetyPauseCause = 'continuation_limit' | 'no_progress';
5
+ interface ActiveGoal {
6
+ id: string;
7
+ text: string;
8
+ status: GoalStatus;
9
+ startedAt: number;
10
+ updatedAt: number;
11
+ iteration: number;
12
+ tokenBudget?: number;
13
+ tokensUsed: number;
14
+ timeUsedSeconds: number;
15
+ baselineTokens: number;
16
+ activeStartedAt?: number;
17
+ automaticModelTurns: number;
18
+ toolFreeRepeatCount: number;
19
+ lastToolFreeOutputFingerprint?: string;
20
+ safetyPauseCause?: SafetyPauseCause;
21
+ safetyResetPending?: boolean;
22
+ }
23
+ type PendingQueueAction = {
24
+ kind: 'prioritize';
25
+ objective: string;
26
+ tokenBudget?: number;
27
+ displacedUsageFinalized?: boolean;
28
+ } | {
29
+ kind: 'advance';
30
+ goalId: string;
31
+ reason: 'complete' | 'skip';
32
+ completedText: string;
33
+ };
34
+ interface GoalStateData {
35
+ goal: ActiveGoal | null;
36
+ queue?: ActiveGoal[];
37
+ pendingAction?: PendingQueueAction;
38
+ }
39
+ interface LoadedGoalState {
40
+ goal?: ActiveGoal;
41
+ queue: ActiveGoal[];
42
+ pendingAction?: PendingQueueAction;
43
+ hasExperimentalQueueState: boolean;
44
+ source: 'none' | 'canonical' | 'legacy-goals';
45
+ malformed: boolean;
46
+ }
47
+ type GoalExecutionState = 'dormant' | 'executing' | 'retained';
48
+ interface GoalRuntimeSnapshot {
49
+ loaded: boolean;
50
+ execution: GoalExecutionState;
51
+ goal?: ActiveGoal;
52
+ queue: readonly ActiveGoal[];
53
+ pendingAction?: PendingQueueAction;
54
+ }
55
+ //#endregion
56
+ export { ActiveGoal, GOAL_STATUSES, GoalExecutionState, GoalRuntimeSnapshot, GoalStateData, GoalStatus, LoadedGoalState, PendingQueueAction, SafetyPauseCause };
57
+ //# sourceMappingURL=goal.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal.d.mts","names":[],"sources":["../../src/types/goal.ts"],"mappings":";cAAa;KASD,qBAAqB;KACrB;UACK;EACf;EACA;EACA,QAAQ;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,mBAAmB;EACnB;;KAEU;EACN;EAAoB;EAAmB;EAAsB;;EAC7D;EAAiB;EAAgB;EAA6B;;UACnD;EACf,MAAM;EACN,QAAQ;EACR,gBAAgB;;UAED;EACf,OAAO;EACP,OAAO;EACP,gBAAgB;EAChB;EACA;EACA;;KAEU;UACK;EACf;EACA,WAAW;EACX,OAAO;EACP,gBAAgB;EAChB,gBAAgB"}
@@ -0,0 +1,2 @@
1
+ const e=[`active`,`queued`,`paused`,`blocked`,`usage_limited`,`budget_limited`,`complete`];export{e as GOAL_STATUSES};
2
+ //# sourceMappingURL=goal.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal.mjs","names":[],"sources":["../../src/types/goal.ts"],"sourcesContent":["export const GOAL_STATUSES = [\n 'active',\n 'queued',\n 'paused',\n 'blocked',\n 'usage_limited',\n 'budget_limited',\n 'complete',\n] as const;\nexport type GoalStatus = (typeof GOAL_STATUSES)[number];\nexport type SafetyPauseCause = 'continuation_limit' | 'no_progress';\nexport interface ActiveGoal {\n id: string;\n text: string;\n status: GoalStatus;\n startedAt: number;\n updatedAt: number;\n iteration: number;\n tokenBudget?: number;\n tokensUsed: number;\n timeUsedSeconds: number;\n baselineTokens: number;\n activeStartedAt?: number;\n automaticModelTurns: number;\n toolFreeRepeatCount: number;\n lastToolFreeOutputFingerprint?: string;\n safetyPauseCause?: SafetyPauseCause;\n safetyResetPending?: boolean;\n}\nexport type PendingQueueAction =\n | { kind: 'prioritize'; objective: string; tokenBudget?: number; displacedUsageFinalized?: boolean }\n | { kind: 'advance'; goalId: string; reason: 'complete' | 'skip'; completedText: string };\nexport interface GoalStateData {\n goal: ActiveGoal | null;\n queue?: ActiveGoal[];\n pendingAction?: PendingQueueAction;\n}\nexport interface LoadedGoalState {\n goal?: ActiveGoal;\n queue: ActiveGoal[];\n pendingAction?: PendingQueueAction;\n hasExperimentalQueueState: boolean;\n source: 'none' | 'canonical' | 'legacy-goals';\n malformed: boolean;\n}\nexport type GoalExecutionState = 'dormant' | 'executing' | 'retained';\nexport interface GoalRuntimeSnapshot {\n loaded: boolean;\n execution: GoalExecutionState;\n goal?: ActiveGoal;\n queue: readonly ActiveGoal[];\n pendingAction?: PendingQueueAction;\n}\n"],"mappings":"AAAA,MAAa,EAAgB,CAC3B,SACA,SACA,SACA,UACA,gBACA,iBACA,UACF"}
@@ -0,0 +1,27 @@
1
+ //#region src/types/history.d.ts
2
+ type GoalHistoryStatus = 'active' | 'queued' | 'paused' | 'blocked' | 'usage_limited' | 'budget_limited' | 'complete';
3
+ interface GoalHistoryEntry {
4
+ id: string;
5
+ objective: string;
6
+ status: GoalHistoryStatus;
7
+ reason?: string;
8
+ budget?: number;
9
+ archivedAt: string;
10
+ startedAt?: string;
11
+ completedAt?: string;
12
+ }
13
+ interface HistoryRestart {
14
+ historyId: string;
15
+ goalId: string;
16
+ objective: string;
17
+ budget?: number;
18
+ }
19
+ interface GoalHistoryPort {
20
+ list(): Promise<GoalHistoryEntry[]>;
21
+ archive(entry: GoalHistoryEntry): Promise<GoalHistoryEntry>;
22
+ remove(id: string): Promise<void>;
23
+ restart(id: string): Promise<HistoryRestart>;
24
+ }
25
+ //#endregion
26
+ export { GoalHistoryEntry, GoalHistoryPort, GoalHistoryStatus, HistoryRestart };
27
+ //# sourceMappingURL=history.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.cts","names":[],"sources":["../../src/types/history.ts"],"mappings":";KAAY;UASK;EACf;EACA;EACA,QAAQ;EACR;EACA;EACA;EACA;EACA;;UAsBe;EACf;EACA;EACA;EACA;;UAGe;EACf,QAAQ,QAAQ;EAChB,QAAQ,OAAO,mBAAmB,QAAQ;EAC1C,OAAO,aAAa;EACpB,QAAQ,aAAa,QAAQ"}
@@ -0,0 +1,27 @@
1
+ //#region src/types/history.d.ts
2
+ type GoalHistoryStatus = 'active' | 'queued' | 'paused' | 'blocked' | 'usage_limited' | 'budget_limited' | 'complete';
3
+ interface GoalHistoryEntry {
4
+ id: string;
5
+ objective: string;
6
+ status: GoalHistoryStatus;
7
+ reason?: string;
8
+ budget?: number;
9
+ archivedAt: string;
10
+ startedAt?: string;
11
+ completedAt?: string;
12
+ }
13
+ interface HistoryRestart {
14
+ historyId: string;
15
+ goalId: string;
16
+ objective: string;
17
+ budget?: number;
18
+ }
19
+ interface GoalHistoryPort {
20
+ list(): Promise<GoalHistoryEntry[]>;
21
+ archive(entry: GoalHistoryEntry): Promise<GoalHistoryEntry>;
22
+ remove(id: string): Promise<void>;
23
+ restart(id: string): Promise<HistoryRestart>;
24
+ }
25
+ //#endregion
26
+ export { GoalHistoryEntry, GoalHistoryPort, GoalHistoryStatus, HistoryRestart };
27
+ //# sourceMappingURL=history.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.mts","names":[],"sources":["../../src/types/history.ts"],"mappings":";KAAY;UASK;EACf;EACA;EACA,QAAQ;EACR;EACA;EACA;EACA;EACA;;UAsBe;EACf;EACA;EACA;EACA;;UAGe;EACf,QAAQ,QAAQ;EAChB,QAAQ,OAAO,mBAAmB,QAAQ;EAC1C,OAAO,aAAa;EACpB,QAAQ,aAAa,QAAQ"}
@@ -0,0 +1,19 @@
1
+ import { ActiveGoal, GoalStateData, PendingQueueAction } from "./goal.cjs";
2
+ //#region src/types/ports.d.ts
3
+ interface GoalClock {
4
+ now(): number;
5
+ }
6
+ interface GoalIdFactory {
7
+ create(): string;
8
+ }
9
+ interface GoalStateStore {
10
+ append(state: GoalStateData): void;
11
+ }
12
+ interface GoalQueuePort {
13
+ readonly enabled: boolean;
14
+ readonly goals: readonly ActiveGoal[];
15
+ readonly pendingAction?: PendingQueueAction;
16
+ }
17
+ //#endregion
18
+ export { GoalClock, GoalIdFactory, GoalQueuePort, GoalStateStore };
19
+ //# sourceMappingURL=ports.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.cts","names":[],"sources":["../../src/types/ports.ts"],"mappings":";;UACiB;EACf;;UAEe;EACf;;UAEe;EACf,OAAO,OAAO;;UAEC;WACN;WACA,gBAAgB;WAChB,gBAAgB"}
@@ -0,0 +1,19 @@
1
+ import { ActiveGoal, GoalStateData, PendingQueueAction } from "./goal.mjs";
2
+ //#region src/types/ports.d.ts
3
+ interface GoalClock {
4
+ now(): number;
5
+ }
6
+ interface GoalIdFactory {
7
+ create(): string;
8
+ }
9
+ interface GoalStateStore {
10
+ append(state: GoalStateData): void;
11
+ }
12
+ interface GoalQueuePort {
13
+ readonly enabled: boolean;
14
+ readonly goals: readonly ActiveGoal[];
15
+ readonly pendingAction?: PendingQueueAction;
16
+ }
17
+ //#endregion
18
+ export { GoalClock, GoalIdFactory, GoalQueuePort, GoalStateStore };
19
+ //# sourceMappingURL=ports.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.mts","names":[],"sources":["../../src/types/ports.ts"],"mappings":";;UACiB;EACf;;UAEe;EACf;;UAEe;EACf,OAAO,OAAO;;UAEC;WACN;WACA,gBAAgB;WAChB,gBAAgB"}
@@ -0,0 +1,6 @@
1
+ //#region src/types/settings.d.ts
2
+ type LegacyGoalToolVisibility = 'always' | 'after-first-goal';
3
+ type GoalToolVisibility = LegacyGoalToolVisibility | 'operational';
4
+ //#endregion
5
+ export { GoalToolVisibility, LegacyGoalToolVisibility };
6
+ //# sourceMappingURL=settings.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.cts","names":[],"sources":["../../src/types/settings.ts"],"mappings":";KAAY;KACA,qBAAqB"}
@@ -0,0 +1,6 @@
1
+ //#region src/types/settings.d.ts
2
+ type LegacyGoalToolVisibility = 'always' | 'after-first-goal';
3
+ type GoalToolVisibility = LegacyGoalToolVisibility | 'operational';
4
+ //#endregion
5
+ export { GoalToolVisibility, LegacyGoalToolVisibility };
6
+ //# sourceMappingURL=settings.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.mts","names":[],"sources":["../../src/types/settings.ts"],"mappings":";KAAY;KACA,qBAAqB"}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "@agimon-ai/doompi-goal",
3
+ "version": "0.0.1-alpha.0",
4
+ "description": "Goal execution minor mode for DoomPi",
5
+ "homepage": "https://agimon.ai",
6
+ "license": "MIT",
7
+ "author": "Vuong Ngo",
8
+ "files": [
9
+ "dist",
10
+ "README.md",
11
+ "LICENSE",
12
+ "package.json"
13
+ ],
14
+ "type": "module",
15
+ "main": "./dist/index.cjs",
16
+ "types": "./dist/index.d.mts",
17
+ "jsnext:main": "./dist/index.mjs",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.mts",
21
+ "import": "./dist/index.mjs",
22
+ "require": "./dist/index.cjs"
23
+ },
24
+ "./extensions/pi": {
25
+ "types": "./dist/extensions/pi.d.mts",
26
+ "import": "./dist/extensions/pi.mjs",
27
+ "require": "./dist/extensions/pi.cjs"
28
+ },
29
+ "./extensions/doom": {
30
+ "types": "./dist/extensions/doom.d.mts",
31
+ "import": "./dist/extensions/doom.mjs",
32
+ "require": "./dist/extensions/doom.cjs"
33
+ },
34
+ "./package.json": "./package.json"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "dependencies": {
40
+ "@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.10",
41
+ "@agimon-ai/doompi-ui": "0.0.1-alpha.10"
42
+ },
43
+ "devDependencies": {
44
+ "@earendil-works/pi-coding-agent": "0.84.1",
45
+ "@earendil-works/pi-tui": "0.84.1",
46
+ "@types/node": "26.1.1",
47
+ "@vitest/coverage-v8": "4.1.10",
48
+ "tsdown": "0.22.14",
49
+ "typescript": "6.0.3",
50
+ "vitest": "4.1.10"
51
+ },
52
+ "peerDependencies": {
53
+ "@earendil-works/pi-coding-agent": "0.84.1",
54
+ "@earendil-works/pi-tui": "0.84.1"
55
+ },
56
+ "peerDependenciesMeta": {
57
+ "@earendil-works/pi-coding-agent": {
58
+ "optional": true
59
+ },
60
+ "@earendil-works/pi-tui": {
61
+ "optional": true
62
+ }
63
+ },
64
+ "engines": {
65
+ "node": ">=22.19.0"
66
+ },
67
+ "pi": {
68
+ "extensions": [
69
+ "./dist/extensions/pi.mjs"
70
+ ]
71
+ },
72
+ "scripts": {
73
+ "build": "tsdown",
74
+ "test": "vitest --run",
75
+ "typecheck": "tsc --noEmit",
76
+ "lint": "oxlint . && oxfmt . --check",
77
+ "fixcode": "oxlint . --fix && oxfmt ."
78
+ }
79
+ }