openhorse 0.2.23 → 0.2.24

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 (59) hide show
  1. package/dist/commands/target-command.d.ts +21 -0
  2. package/dist/commands/target-command.d.ts.map +1 -0
  3. package/dist/commands/target-command.js +81 -0
  4. package/dist/commands/target-command.js.map +1 -0
  5. package/dist/runtime/agent-runtime-controller.d.ts +5 -0
  6. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
  7. package/dist/runtime/agent-runtime-controller.js +54 -0
  8. package/dist/runtime/agent-runtime-controller.js.map +1 -1
  9. package/dist/runtime/agent-runtime-protocol.d.ts +4 -0
  10. package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
  11. package/dist/runtime/agent-runtime-protocol.js.map +1 -1
  12. package/dist/runtime/goal-coordinator.d.ts +66 -0
  13. package/dist/runtime/goal-coordinator.d.ts.map +1 -0
  14. package/dist/runtime/goal-coordinator.js +200 -0
  15. package/dist/runtime/goal-coordinator.js.map +1 -0
  16. package/dist/runtime/goals/accounting.d.ts +17 -0
  17. package/dist/runtime/goals/accounting.d.ts.map +1 -0
  18. package/dist/runtime/goals/accounting.js +45 -0
  19. package/dist/runtime/goals/accounting.js.map +1 -0
  20. package/dist/runtime/goals/completion-audit.d.ts +24 -0
  21. package/dist/runtime/goals/completion-audit.d.ts.map +1 -0
  22. package/dist/runtime/goals/completion-audit.js +48 -0
  23. package/dist/runtime/goals/completion-audit.js.map +1 -0
  24. package/dist/runtime/goals/coordinator.d.ts +42 -0
  25. package/dist/runtime/goals/coordinator.d.ts.map +1 -0
  26. package/dist/runtime/goals/coordinator.js +277 -0
  27. package/dist/runtime/goals/coordinator.js.map +1 -0
  28. package/dist/runtime/goals/prompt.d.ts +16 -0
  29. package/dist/runtime/goals/prompt.d.ts.map +1 -0
  30. package/dist/runtime/goals/prompt.js +50 -0
  31. package/dist/runtime/goals/prompt.js.map +1 -0
  32. package/dist/runtime/goals/tools.d.ts +43 -0
  33. package/dist/runtime/goals/tools.d.ts.map +1 -0
  34. package/dist/runtime/goals/tools.js +88 -0
  35. package/dist/runtime/goals/tools.js.map +1 -0
  36. package/dist/runtime/goals/types.d.ts +167 -0
  37. package/dist/runtime/goals/types.d.ts.map +1 -0
  38. package/dist/runtime/goals/types.js +72 -0
  39. package/dist/runtime/goals/types.js.map +1 -0
  40. package/dist/services/goal-sidecar.d.ts +96 -0
  41. package/dist/services/goal-sidecar.d.ts.map +1 -0
  42. package/dist/services/goal-sidecar.js +145 -0
  43. package/dist/services/goal-sidecar.js.map +1 -0
  44. package/dist/services/goal-storage.d.ts +22 -0
  45. package/dist/services/goal-storage.d.ts.map +1 -0
  46. package/dist/services/goal-storage.js +153 -0
  47. package/dist/services/goal-storage.js.map +1 -0
  48. package/dist/services/session-storage.d.ts +4 -0
  49. package/dist/services/session-storage.d.ts.map +1 -1
  50. package/dist/services/session-storage.js +10 -0
  51. package/dist/services/session-storage.js.map +1 -1
  52. package/dist/terminal-ui/launch.d.ts.map +1 -1
  53. package/dist/terminal-ui/launch.js +49 -0
  54. package/dist/terminal-ui/launch.js.map +1 -1
  55. package/dist/tools/goal.d.ts +17 -0
  56. package/dist/tools/goal.d.ts.map +1 -0
  57. package/dist/tools/goal.js +191 -0
  58. package/dist/tools/goal.js.map +1 -0
  59. package/package.json +1 -1
@@ -0,0 +1,17 @@
1
+ /**
2
+ * v0.2.24 — Goal Accounting.
3
+ *
4
+ * Token and time ledger for goal-level usage tracking.
5
+ * Deduplicates subagent usage, prevents double-counting across retries.
6
+ */
7
+ import type { AgentTurnOutcome } from './types';
8
+ export interface GoalAccounting {
9
+ tokensUsed: number;
10
+ timeUsedMs: number;
11
+ continuationCount: number;
12
+ noProgressCount: number;
13
+ }
14
+ export declare function accumulateTurn(accounting: GoalAccounting, outcome: AgentTurnOutcome): GoalAccounting;
15
+ export declare function isBudgetExceeded(tokensUsed: number, tokenBudget?: number): boolean;
16
+ export declare function formatGoalUsage(accounting: GoalAccounting): string;
17
+ //# sourceMappingURL=accounting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounting.d.ts","sourceRoot":"","sources":["../../../src/runtime/goals/accounting.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,gBAAgB,GACxB,cAAc,CAOhB;AAED,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAGT;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,cAAc,GAAG,MAAM,CAMlE"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ /**
3
+ * v0.2.24 — Goal Accounting.
4
+ *
5
+ * Token and time ledger for goal-level usage tracking.
6
+ * Deduplicates subagent usage, prevents double-counting across retries.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.accumulateTurn = accumulateTurn;
10
+ exports.isBudgetExceeded = isBudgetExceeded;
11
+ exports.formatGoalUsage = formatGoalUsage;
12
+ function accumulateTurn(accounting, outcome) {
13
+ return {
14
+ tokensUsed: accounting.tokensUsed + outcome.usage.totalTokens,
15
+ timeUsedMs: accounting.timeUsedMs + (outcome.endedAt - outcome.startedAt),
16
+ continuationCount: accounting.continuationCount + 1,
17
+ noProgressCount: outcome.madeProgress ? 0 : accounting.noProgressCount + 1,
18
+ };
19
+ }
20
+ function isBudgetExceeded(tokensUsed, tokenBudget) {
21
+ if (tokenBudget === undefined || tokenBudget <= 0)
22
+ return false;
23
+ return tokensUsed >= tokenBudget;
24
+ }
25
+ function formatGoalUsage(accounting) {
26
+ const tokens = accounting.tokensUsed >= 1000
27
+ ? `${(accounting.tokensUsed / 1000).toFixed(1)}K`
28
+ : String(accounting.tokensUsed);
29
+ const time = formatDuration(accounting.timeUsedMs);
30
+ return `${accounting.continuationCount} turns · ${tokens} tokens · ${time}`;
31
+ }
32
+ function formatDuration(ms) {
33
+ if (ms < 1000)
34
+ return `${ms}ms`;
35
+ const seconds = Math.floor(ms / 1000);
36
+ if (seconds < 60)
37
+ return `${seconds}s`;
38
+ const minutes = Math.floor(seconds / 60);
39
+ const remainingSeconds = seconds % 60;
40
+ if (minutes < 60)
41
+ return `${minutes}m ${remainingSeconds}s`;
42
+ const hours = Math.floor(minutes / 60);
43
+ return `${hours}h ${minutes % 60}m`;
44
+ }
45
+ //# sourceMappingURL=accounting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accounting.js","sourceRoot":"","sources":["../../../src/runtime/goals/accounting.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAWH,wCAUC;AAED,4CAMC;AAED,0CAMC;AA1BD,SAAgB,cAAc,CAC5B,UAA0B,EAC1B,OAAyB;IAEzB,OAAO;QACL,UAAU,EAAE,UAAU,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW;QAC7D,UAAU,EAAE,UAAU,CAAC,UAAU,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;QACzE,iBAAiB,EAAE,UAAU,CAAC,iBAAiB,GAAG,CAAC;QACnD,eAAe,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,GAAG,CAAC;KAC3E,CAAC;AACJ,CAAC;AAED,SAAgB,gBAAgB,CAC9B,UAAkB,EAClB,WAAoB;IAEpB,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAChE,OAAO,UAAU,IAAI,WAAW,CAAC;AACnC,CAAC;AAED,SAAgB,eAAe,CAAC,UAA0B;IACxD,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,IAAI,IAAI;QAC1C,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QACjD,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACnD,OAAO,GAAG,UAAU,CAAC,iBAAiB,YAAY,MAAM,aAAa,IAAI,EAAE,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CAAC,EAAU;IAChC,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,EAAE,IAAI,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,GAAG,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAC;IACtC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,KAAK,gBAAgB,GAAG,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,OAAO,GAAG,KAAK,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;AACtC,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * v0.2.24 — Goal Completion & Blocked Audit.
3
+ *
4
+ * Two-phase terminal-state audit. Model requests complete/blocked via
5
+ * update_goal tool; Coordinator runs audit after turn persistence.
6
+ */
7
+ import type { GoalCompletionAudit, GoalBlocker } from './types';
8
+ export interface CompletionAuditInput {
9
+ objective: string;
10
+ evidenceRefs: string[];
11
+ verificationSummary: string;
12
+ }
13
+ export declare function auditCompletion(input: CompletionAuditInput): GoalCompletionAudit;
14
+ export interface BlockedAuditInput {
15
+ blocker: GoalBlocker;
16
+ noProgressCount: number;
17
+ }
18
+ export declare function auditBlocked(input: BlockedAuditInput): {
19
+ allowed: boolean;
20
+ reason: string;
21
+ };
22
+ export declare function blockerFingerprint(category: string, resource: string, reason: string): string;
23
+ export declare function blockersMatch(a: GoalBlocker | undefined, fingerprint: string): boolean;
24
+ //# sourceMappingURL=completion-audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-audit.d.ts","sourceRoot":"","sources":["../../../src/runtime/goals/completion-audit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,mBAAmB,CAWhF;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG;IACtD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAcA;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE7F;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAGtF"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * v0.2.24 — Goal Completion & Blocked Audit.
4
+ *
5
+ * Two-phase terminal-state audit. Model requests complete/blocked via
6
+ * update_goal tool; Coordinator runs audit after turn persistence.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.auditCompletion = auditCompletion;
10
+ exports.auditBlocked = auditBlocked;
11
+ exports.blockerFingerprint = blockerFingerprint;
12
+ exports.blockersMatch = blockersMatch;
13
+ function auditCompletion(input) {
14
+ const now = Date.now();
15
+ const passed = input.evidenceRefs.length > 0 && input.verificationSummary.length > 0;
16
+ return {
17
+ requestedAt: now,
18
+ auditedAt: now,
19
+ passed,
20
+ verificationSummary: input.verificationSummary || 'No verification evidence provided.',
21
+ remainingRequirements: passed ? [] : ['Verification evidence required before completion.'],
22
+ evidenceRefs: input.evidenceRefs,
23
+ };
24
+ }
25
+ function auditBlocked(input) {
26
+ if (input.blocker.consecutiveTurns < 3) {
27
+ return {
28
+ allowed: false,
29
+ reason: `Blocker seen ${input.blocker.consecutiveTurns}/3 required turns.`,
30
+ };
31
+ }
32
+ if (input.noProgressCount < 3) {
33
+ return {
34
+ allowed: false,
35
+ reason: 'Progress was made in recent turns; blocking not justified.',
36
+ };
37
+ }
38
+ return { allowed: true, reason: `Blocker persisted for ${input.blocker.consecutiveTurns} consecutive turns with no progress.` };
39
+ }
40
+ function blockerFingerprint(category, resource, reason) {
41
+ return `${category}:${resource}:${reason}`;
42
+ }
43
+ function blockersMatch(a, fingerprint) {
44
+ if (!a)
45
+ return false;
46
+ return a.fingerprint === fingerprint;
47
+ }
48
+ //# sourceMappingURL=completion-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-audit.js","sourceRoot":"","sources":["../../../src/runtime/goals/completion-audit.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAUH,0CAWC;AAOD,oCAiBC;AAED,gDAEC;AAED,sCAGC;AA5CD,SAAgB,eAAe,CAAC,KAA2B;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;IACrF,OAAO;QACL,WAAW,EAAE,GAAG;QAChB,SAAS,EAAE,GAAG;QACd,MAAM;QACN,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,IAAI,oCAAoC;QACtF,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,mDAAmD,CAAC;QAC1F,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC;AACJ,CAAC;AAOD,SAAgB,YAAY,CAAC,KAAwB;IAInD,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,gBAAgB,KAAK,CAAC,OAAO,CAAC,gBAAgB,oBAAoB;SAC3E,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,4DAA4D;SACrE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,yBAAyB,KAAK,CAAC,OAAO,CAAC,gBAAgB,sCAAsC,EAAE,CAAC;AAClI,CAAC;AAED,SAAgB,kBAAkB,CAAC,QAAgB,EAAE,QAAgB,EAAE,MAAc;IACnF,OAAO,GAAG,QAAQ,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;AAC7C,CAAC;AAED,SAAgB,aAAa,CAAC,CAA0B,EAAE,WAAmB;IAC3E,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,OAAO,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC;AACvC,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * v0.2.24 — Goal Coordinator.
3
+ *
4
+ * Single-flight state machine that manages goal lifecycle: creation,
5
+ * pause/resume, auto-continuation, completion/blocked audit, and
6
+ * persistence. Owned by AgentRuntimeController — NOT a global singleton.
7
+ */
8
+ import { type SessionGoalV1, type RuntimeGoalSnapshot, type AgentTurnOutcome, type AgentTurnRequest } from './types';
9
+ export interface GoalCoordinatorState {
10
+ goal: SessionGoalV1 | null;
11
+ generation: number;
12
+ continuationDeferred: boolean;
13
+ }
14
+ export declare class GoalCoordinator {
15
+ private readonly projectPath;
16
+ private readonly sessionId;
17
+ private state;
18
+ constructor(projectPath: string, sessionId: string);
19
+ get goal(): SessionGoalV1 | null;
20
+ get generation(): number;
21
+ get isActive(): boolean;
22
+ get canContinue(): boolean;
23
+ snapshot(): RuntimeGoalSnapshot | null;
24
+ load(): boolean;
25
+ create(objective: string): {
26
+ ok: true;
27
+ } | {
28
+ ok: false;
29
+ error: string;
30
+ };
31
+ pause(): boolean;
32
+ resume(): boolean;
33
+ edit(objective: string): boolean;
34
+ replace(objective: string): boolean;
35
+ setBudget(tokenBudget: number | null): boolean;
36
+ clear(): boolean;
37
+ buildContinuationRequest(): AgentTurnRequest | null;
38
+ finalizeTurn(outcome: AgentTurnOutcome): void;
39
+ deferContinuation(): void;
40
+ private persist;
41
+ }
42
+ //# sourceMappingURL=coordinator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../../src/runtime/goals/coordinator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,mBAAmB,EAExB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EAItB,MAAM,SAAS,CAAC;AAUjB,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,qBAAa,eAAe;IAIxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJ5B,OAAO,CAAC,KAAK,CAAoF;gBAG9E,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM;IAOpC,IAAI,IAAI,IAAI,aAAa,GAAG,IAAI,CAA4B;IAC5D,IAAI,UAAU,IAAI,MAAM,CAAkC;IAC1D,IAAI,QAAQ,IAAI,OAAO,CAAiD;IACxE,IAAI,WAAW,IAAI,OAAO,CAIzB;IAED,QAAQ,IAAI,mBAAmB,GAAG,IAAI;IAqBtC,IAAI,IAAI,OAAO;IAWf,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAoBtE,KAAK,IAAI,OAAO;IAchB,MAAM,IAAI,OAAO;IAiBjB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAahC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAWnC,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IAY9C,KAAK,IAAI,OAAO;IAahB,wBAAwB,IAAI,gBAAgB,GAAG,IAAI;IAgBnD,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAoF7C,iBAAiB,IAAI,IAAI;IAkBzB,OAAO,CAAC,OAAO;CAIhB"}
@@ -0,0 +1,277 @@
1
+ "use strict";
2
+ /**
3
+ * v0.2.24 — Goal Coordinator.
4
+ *
5
+ * Single-flight state machine that manages goal lifecycle: creation,
6
+ * pause/resume, auto-continuation, completion/blocked audit, and
7
+ * persistence. Owned by AgentRuntimeController — NOT a global singleton.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.GoalCoordinator = void 0;
11
+ const types_1 = require("./types");
12
+ const goal_storage_1 = require("../../services/goal-storage");
13
+ const accounting_1 = require("./accounting");
14
+ const completion_audit_1 = require("./completion-audit");
15
+ class GoalCoordinator {
16
+ constructor(projectPath, sessionId) {
17
+ this.projectPath = projectPath;
18
+ this.sessionId = sessionId;
19
+ this.state = { goal: null, generation: 0, continuationDeferred: false };
20
+ }
21
+ // ==========================================================================
22
+ // Queries
23
+ // ==========================================================================
24
+ get goal() { return this.state.goal; }
25
+ get generation() { return this.state.generation; }
26
+ get isActive() { return this.state.goal?.status === 'active'; }
27
+ get canContinue() {
28
+ return this.isActive
29
+ && !this.state.continuationDeferred
30
+ && !(0, accounting_1.isBudgetExceeded)(this.state.goal.tokensUsed, this.state.goal.tokenBudget);
31
+ }
32
+ snapshot() {
33
+ const g = this.state.goal;
34
+ if (!g)
35
+ return null;
36
+ return {
37
+ goalId: g.goalId,
38
+ revision: g.revision,
39
+ objective: g.objective,
40
+ status: g.status,
41
+ tokenBudget: g.tokenBudget,
42
+ tokensUsed: g.tokensUsed,
43
+ timeUsedMs: g.timeUsedMs,
44
+ continuationCount: g.continuationCount,
45
+ updatedAt: g.updatedAt,
46
+ stopReason: g.stopReason?.message,
47
+ };
48
+ }
49
+ // ==========================================================================
50
+ // Lifecycle
51
+ // ==========================================================================
52
+ load() {
53
+ const result = (0, goal_storage_1.loadGoal)(this.projectPath, this.sessionId);
54
+ if (result.ok) {
55
+ this.state.goal = result.value;
56
+ this.state.generation = 0;
57
+ this.state.continuationDeferred = false;
58
+ return true;
59
+ }
60
+ return false;
61
+ }
62
+ create(objective) {
63
+ if (this.state.goal && !types_1.GOAL_TERMINAL_STATES.has(this.state.goal.status)) {
64
+ return { ok: false, error: 'An active goal already exists. Use /target replace to change it.' };
65
+ }
66
+ if (!objective.trim()) {
67
+ return { ok: false, error: 'Objective cannot be empty.' };
68
+ }
69
+ if (objective.length > types_1.GOAL_INVARIANTS.maxObjectiveChars) {
70
+ return { ok: false, error: `Objective too long (max ${types_1.GOAL_INVARIANTS.maxObjectiveChars} chars).` };
71
+ }
72
+ const result = (0, goal_storage_1.createGoal)(this.projectPath, this.sessionId, objective);
73
+ if (!result.ok)
74
+ return { ok: false, error: result.message };
75
+ this.state.goal = result.value;
76
+ this.state.generation += 1;
77
+ this.state.continuationDeferred = false;
78
+ return { ok: true };
79
+ }
80
+ pause() {
81
+ if (!this.state.goal || this.state.goal.status !== 'active')
82
+ return false;
83
+ this.state.goal = {
84
+ ...this.state.goal,
85
+ status: 'paused',
86
+ revision: this.state.goal.revision + 1,
87
+ updatedAt: Date.now(),
88
+ stopReason: { kind: 'user', message: 'Paused by user.', at: Date.now() },
89
+ };
90
+ this.persist();
91
+ this.state.continuationDeferred = true;
92
+ return true;
93
+ }
94
+ resume() {
95
+ if (!this.state.goal || !types_1.GOAL_USER_RECOVERABLE_STATES.has(this.state.goal.status))
96
+ return false;
97
+ this.state.goal = {
98
+ ...this.state.goal,
99
+ status: 'active',
100
+ revision: this.state.goal.revision + 1,
101
+ updatedAt: Date.now(),
102
+ activeSince: Date.now(),
103
+ stopReason: undefined,
104
+ blocker: undefined,
105
+ noProgressCount: 0,
106
+ };
107
+ this.persist();
108
+ this.state.continuationDeferred = false;
109
+ return true;
110
+ }
111
+ edit(objective) {
112
+ if (!this.state.goal)
113
+ return false;
114
+ if (!objective.trim())
115
+ return false;
116
+ this.state.goal = {
117
+ ...this.state.goal,
118
+ objective: objective.trim(),
119
+ revision: this.state.goal.revision + 1,
120
+ updatedAt: Date.now(),
121
+ };
122
+ this.persist();
123
+ return true;
124
+ }
125
+ replace(objective) {
126
+ if (!objective.trim())
127
+ return false;
128
+ // Create new goal, old generation invalidated.
129
+ const result = (0, goal_storage_1.createGoal)(this.projectPath, this.sessionId, objective);
130
+ if (!result.ok)
131
+ return false;
132
+ this.state.goal = result.value;
133
+ this.state.generation += 1;
134
+ this.state.continuationDeferred = false;
135
+ return true;
136
+ }
137
+ setBudget(tokenBudget) {
138
+ if (!this.state.goal)
139
+ return false;
140
+ this.state.goal = {
141
+ ...this.state.goal,
142
+ tokenBudget: tokenBudget ?? undefined,
143
+ revision: this.state.goal.revision + 1,
144
+ updatedAt: Date.now(),
145
+ };
146
+ this.persist();
147
+ return true;
148
+ }
149
+ clear() {
150
+ if (!this.state.goal)
151
+ return false;
152
+ (0, goal_storage_1.deleteGoal)(this.projectPath, this.sessionId);
153
+ this.state.goal = null;
154
+ this.state.generation += 1;
155
+ this.state.continuationDeferred = false;
156
+ return true;
157
+ }
158
+ // ==========================================================================
159
+ // Turn integration
160
+ // ==========================================================================
161
+ buildContinuationRequest() {
162
+ if (!this.canContinue)
163
+ return null;
164
+ const g = this.state.goal;
165
+ return {
166
+ inputKind: 'goal_continuation',
167
+ sessionId: this.sessionId,
168
+ persistAsUserMessage: false,
169
+ echoToTranscript: false,
170
+ goal: {
171
+ goalId: g.goalId,
172
+ revision: g.revision,
173
+ continuationIndex: g.continuationCount + 1,
174
+ },
175
+ };
176
+ }
177
+ finalizeTurn(outcome) {
178
+ const g = this.state.goal;
179
+ if (!g)
180
+ return;
181
+ if (outcome.goalId !== g.goalId || outcome.goalRevision !== g.revision)
182
+ return;
183
+ // Accumulate usage.
184
+ const acc = (0, accounting_1.accumulateTurn)({ tokensUsed: g.tokensUsed, timeUsedMs: g.timeUsedMs, continuationCount: g.continuationCount, noProgressCount: g.noProgressCount }, outcome);
185
+ const updated = {
186
+ ...g,
187
+ tokensUsed: acc.tokensUsed,
188
+ timeUsedMs: acc.timeUsedMs,
189
+ continuationCount: acc.continuationCount,
190
+ noProgressCount: acc.noProgressCount,
191
+ revision: g.revision + 1,
192
+ updatedAt: Date.now(),
193
+ lastTurn: {
194
+ turnId: outcome.turnId,
195
+ finishReason: outcome.finishReason,
196
+ endedAt: outcome.endedAt,
197
+ promptTokens: outcome.usage.promptTokens,
198
+ completionTokens: outcome.usage.completionTokens,
199
+ subagentTokens: outcome.usage.subagentTokens,
200
+ totalTokens: outcome.usage.totalTokens,
201
+ madeProgress: outcome.madeProgress,
202
+ },
203
+ };
204
+ // Process pending terminal request.
205
+ if (outcome.pendingTerminalRequest) {
206
+ if (outcome.pendingTerminalRequest.requestedStatus === 'complete') {
207
+ const audit = (0, completion_audit_1.auditCompletion)({
208
+ objective: updated.objective,
209
+ evidenceRefs: [],
210
+ verificationSummary: '',
211
+ });
212
+ updated.completionAudit = audit;
213
+ if (audit.passed) {
214
+ updated.status = 'complete';
215
+ updated.completedAt = Date.now();
216
+ }
217
+ }
218
+ else if (outcome.pendingTerminalRequest.requestedStatus === 'blocked') {
219
+ const blocker = outcome.blocker;
220
+ if (blocker) {
221
+ const fingerprint = (0, completion_audit_1.blockerFingerprint)(blocker.fingerprint, '', '');
222
+ const same = (0, completion_audit_1.blockersMatch)(updated.blocker, fingerprint);
223
+ const newBlocker = {
224
+ fingerprint,
225
+ firstSeenAt: same && updated.blocker ? updated.blocker.firstSeenAt : Date.now(),
226
+ lastSeenAt: Date.now(),
227
+ consecutiveTurns: same ? (updated.blocker?.consecutiveTurns ?? 0) + 1 : 1,
228
+ summary: blocker.summary,
229
+ };
230
+ updated.blocker = newBlocker;
231
+ const blockAudit = (0, completion_audit_1.auditBlocked)({ blocker: newBlocker, noProgressCount: updated.noProgressCount });
232
+ if (blockAudit.allowed) {
233
+ updated.status = 'blocked';
234
+ updated.stopReason = { kind: 'blocked', message: blockAudit.reason, at: Date.now() };
235
+ }
236
+ }
237
+ }
238
+ }
239
+ // Auto-pause on no-progress threshold.
240
+ if (updated.noProgressCount >= types_1.GOAL_INVARIANTS.maxConsecutiveNoProgressTurns && updated.status === 'active') {
241
+ updated.status = 'paused';
242
+ updated.stopReason = { kind: 'user', message: 'Auto-paused: no progress for 3 consecutive turns.', at: Date.now() };
243
+ this.state.continuationDeferred = true;
244
+ }
245
+ // Budget limit.
246
+ if ((0, accounting_1.isBudgetExceeded)(updated.tokensUsed, updated.tokenBudget) && updated.status === 'active') {
247
+ updated.status = 'budget_limited';
248
+ updated.stopReason = { kind: 'budget_limit', message: `Token budget reached: ${updated.tokensUsed}/${updated.tokenBudget}`, at: Date.now() };
249
+ }
250
+ this.state.goal = updated;
251
+ this.persist();
252
+ }
253
+ deferContinuation() {
254
+ if (!this.state.goal || this.state.goal.status !== 'active')
255
+ return;
256
+ this.state.continuationDeferred = true;
257
+ const g = this.state.goal;
258
+ this.state.goal = {
259
+ ...g,
260
+ status: 'paused',
261
+ revision: g.revision + 1,
262
+ updatedAt: Date.now(),
263
+ stopReason: { kind: 'user', message: 'Paused by interrupt.', at: Date.now() },
264
+ };
265
+ this.persist();
266
+ }
267
+ // ==========================================================================
268
+ // Persistence
269
+ // ==========================================================================
270
+ persist() {
271
+ if (!this.state.goal)
272
+ return;
273
+ (0, goal_storage_1.saveGoal)(this.projectPath, this.sessionId, this.state.goal);
274
+ }
275
+ }
276
+ exports.GoalCoordinator = GoalCoordinator;
277
+ //# sourceMappingURL=coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/runtime/goals/coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * v0.2.24 — Goal Prompt Fragment.
3
+ *
4
+ * Injects structured [Persistent Goal] context into the model prompt.
5
+ * Continuation instructions are ephemeral and never enter user transcript.
6
+ */
7
+ import type { SessionGoalV1 } from './types';
8
+ export interface GoalPromptFragment {
9
+ /** The assembled text to inject into the system prompt. */
10
+ text: string;
11
+ /** Estimated token count for this fragment. */
12
+ estimatedTokens: number;
13
+ }
14
+ export declare function buildGoalContextFragment(goal: SessionGoalV1 | null): GoalPromptFragment | null;
15
+ export declare function buildContinuationInstruction(): string;
16
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/runtime/goals/prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,GAAG,kBAAkB,GAAG,IAAI,CAwB9F;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAUrD"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ /**
3
+ * v0.2.24 — Goal Prompt Fragment.
4
+ *
5
+ * Injects structured [Persistent Goal] context into the model prompt.
6
+ * Continuation instructions are ephemeral and never enter user transcript.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.buildGoalContextFragment = buildGoalContextFragment;
10
+ exports.buildContinuationInstruction = buildContinuationInstruction;
11
+ function buildGoalContextFragment(goal) {
12
+ if (!goal || goal.status !== 'active')
13
+ return null;
14
+ const lines = [
15
+ '[Persistent Goal]',
16
+ `Goal ID: ${goal.goalId.slice(0, 8)}`,
17
+ `Status: ${goal.status}`,
18
+ `Objective: ${goal.objective}`,
19
+ `Progress: continuation ${goal.continuationCount}, tokens ${formatTokens(goal.tokensUsed)}${goal.tokenBudget ? ` / budget ${formatTokens(goal.tokenBudget)}` : ' / no explicit budget'}`,
20
+ '',
21
+ 'Rules:',
22
+ '- Preserve the complete objective across turns.',
23
+ '- Inspect current worktree and external state; they are authoritative.',
24
+ '- Make concrete progress. A plan is not a substitute for execution.',
25
+ '- Do not mark complete until every requirement is verified.',
26
+ '- Do not mark blocked unless the same blocker persisted for 3 consecutive goal turns.',
27
+ '- User corrections refine the work but do not replace the objective unless /target edit/replace occurs.',
28
+ ];
29
+ const text = lines.join('\n');
30
+ // Rough estimate: ~1.3 tokens per word for English text.
31
+ const estimatedTokens = Math.ceil(text.split(/\s+/).length * 1.3);
32
+ return { text, estimatedTokens };
33
+ }
34
+ function buildContinuationInstruction() {
35
+ return [
36
+ 'Continue pursuing the persistent goal.',
37
+ 'Re-check the current worktree and external state before acting.',
38
+ 'Review completed and remaining requirements against evidence.',
39
+ 'Make concrete progress in this turn.',
40
+ 'If fully verified, request goal completion.',
41
+ 'If the same blocker has persisted for three consecutive goal turns, request blocked status.',
42
+ 'Otherwise continue working and leave the goal active.',
43
+ ].join('\n');
44
+ }
45
+ function formatTokens(n) {
46
+ if (n >= 1000)
47
+ return `${(n / 1000).toFixed(1)}K`;
48
+ return String(n);
49
+ }
50
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/runtime/goals/prompt.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAWH,4DAwBC;AAED,oEAUC;AApCD,SAAgB,wBAAwB,CAAC,IAA0B;IACjE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAEnD,MAAM,KAAK,GAAG;QACZ,mBAAmB;QACnB,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QACrC,WAAW,IAAI,CAAC,MAAM,EAAE;QACxB,cAAc,IAAI,CAAC,SAAS,EAAE;QAC9B,0BAA0B,IAAI,CAAC,iBAAiB,YAAY,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,EAAE;QACxL,EAAE;QACF,QAAQ;QACR,iDAAiD;QACjD,wEAAwE;QACxE,qEAAqE;QACrE,6DAA6D;QAC7D,uFAAuF;QACvF,yGAAyG;KAC1G,CAAC;IAEF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,yDAAyD;IACzD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IAElE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;AACnC,CAAC;AAED,SAAgB,4BAA4B;IAC1C,OAAO;QACL,wCAAwC;QACxC,iEAAiE;QACjE,+DAA+D;QAC/D,sCAAsC;QACtC,6CAA6C;QAC7C,6FAA6F;QAC7F,uDAAuD;KACxD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAClD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * v0.2.24 — Goal Model Tools.
3
+ *
4
+ * get_goal, create_goal, update_goal tool definitions for the Agent.
5
+ * These tools allow the model to read and request changes to the
6
+ * persistent goal. Actual state changes go through GoalCoordinator.
7
+ */
8
+ import type { RuntimeGoalSnapshot } from './types';
9
+ import type { GoalCoordinator } from './coordinator';
10
+ export interface GoalToolBindings {
11
+ coordinator: GoalCoordinator;
12
+ }
13
+ export declare function buildGetGoalTool(): {
14
+ name: string;
15
+ description: string;
16
+ parameters: Record<string, unknown>;
17
+ };
18
+ export declare function executeGetGoal(bindings: GoalToolBindings): RuntimeGoalSnapshot | null;
19
+ export declare function buildCreateGoalTool(): {
20
+ name: string;
21
+ description: string;
22
+ parameters: Record<string, unknown>;
23
+ };
24
+ export declare function executeCreateGoal(bindings: GoalToolBindings, objective: string, tokenBudget?: number): {
25
+ ok: true;
26
+ goal: RuntimeGoalSnapshot;
27
+ } | {
28
+ ok: false;
29
+ error: string;
30
+ };
31
+ export declare function buildUpdateGoalTool(): {
32
+ name: string;
33
+ description: string;
34
+ parameters: Record<string, unknown>;
35
+ };
36
+ export declare function executeUpdateGoal(bindings: GoalToolBindings, status: 'complete' | 'blocked'): {
37
+ ok: true;
38
+ message: string;
39
+ } | {
40
+ ok: false;
41
+ error: string;
42
+ };
43
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/runtime/goals/tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,eAAe,CAAC;CAC9B;AAED,wBAAgB,gBAAgB,IAAI;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAUA;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,IAAI,CAErF;AAED,wBAAgB,mBAAmB,IAAI;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAmBA;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAUxE;AAED,wBAAgB,mBAAmB,IAAI;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAgBA;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,UAAU,GAAG,SAAS,GAC7B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAS9D"}