@a5c-ai/genty-runtime 5.1.1-staging.5e92128884d3

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 (191) hide show
  1. package/README.md +69 -0
  2. package/dist/apiResult.d.ts +19 -0
  3. package/dist/apiResult.d.ts.map +1 -0
  4. package/dist/apiResult.js +16 -0
  5. package/dist/background/state.d.ts +20 -0
  6. package/dist/background/state.d.ts.map +1 -0
  7. package/dist/background/state.js +52 -0
  8. package/dist/backgroundProcessRegistry.d.ts +124 -0
  9. package/dist/backgroundProcessRegistry.d.ts.map +1 -0
  10. package/dist/backgroundProcessRegistry.js +427 -0
  11. package/dist/cost/claudeCodeParser.d.ts +81 -0
  12. package/dist/cost/claudeCodeParser.d.ts.map +1 -0
  13. package/dist/cost/claudeCodeParser.js +232 -0
  14. package/dist/cost/collector.d.ts +42 -0
  15. package/dist/cost/collector.d.ts.map +1 -0
  16. package/dist/cost/collector.js +105 -0
  17. package/dist/cost/effectCost.d.ts +23 -0
  18. package/dist/cost/effectCost.d.ts.map +1 -0
  19. package/dist/cost/effectCost.js +26 -0
  20. package/dist/cost/index.d.ts +19 -0
  21. package/dist/cost/index.d.ts.map +1 -0
  22. package/dist/cost/index.js +39 -0
  23. package/dist/cost/journal.d.ts +40 -0
  24. package/dist/cost/journal.d.ts.map +1 -0
  25. package/dist/cost/journal.js +137 -0
  26. package/dist/cost/types.d.ts +164 -0
  27. package/dist/cost/types.d.ts.map +1 -0
  28. package/dist/cost/types.js +228 -0
  29. package/dist/daemon/automationExecutor.d.ts +16 -0
  30. package/dist/daemon/automationExecutor.d.ts.map +1 -0
  31. package/dist/daemon/automationExecutor.js +222 -0
  32. package/dist/daemon/config.d.ts +8 -0
  33. package/dist/daemon/config.d.ts.map +1 -0
  34. package/dist/daemon/config.js +245 -0
  35. package/dist/daemon/daemonLog.d.ts +30 -0
  36. package/dist/daemon/daemonLog.d.ts.map +1 -0
  37. package/dist/daemon/daemonLog.js +140 -0
  38. package/dist/daemon/durableQueue.d.ts +41 -0
  39. package/dist/daemon/durableQueue.d.ts.map +1 -0
  40. package/dist/daemon/durableQueue.js +183 -0
  41. package/dist/daemon/fileWatcher.d.ts +9 -0
  42. package/dist/daemon/fileWatcher.d.ts.map +1 -0
  43. package/dist/daemon/fileWatcher.js +144 -0
  44. package/dist/daemon/index.d.ts +15 -0
  45. package/dist/daemon/index.d.ts.map +1 -0
  46. package/dist/daemon/index.js +25 -0
  47. package/dist/daemon/lifecycle.d.ts +13 -0
  48. package/dist/daemon/lifecycle.d.ts.map +1 -0
  49. package/dist/daemon/lifecycle.js +320 -0
  50. package/dist/daemon/loop.d.ts +27 -0
  51. package/dist/daemon/loop.d.ts.map +1 -0
  52. package/dist/daemon/loop.js +387 -0
  53. package/dist/daemon/timerScheduler.d.ts +13 -0
  54. package/dist/daemon/timerScheduler.d.ts.map +1 -0
  55. package/dist/daemon/timerScheduler.js +212 -0
  56. package/dist/daemon/types.d.ts +122 -0
  57. package/dist/daemon/types.d.ts.map +1 -0
  58. package/dist/daemon/types.js +25 -0
  59. package/dist/daemon/webhookListener.d.ts +6 -0
  60. package/dist/daemon/webhookListener.d.ts.map +1 -0
  61. package/dist/daemon/webhookListener.js +132 -0
  62. package/dist/execution/index.d.ts +10 -0
  63. package/dist/execution/index.d.ts.map +1 -0
  64. package/dist/execution/index.js +20 -0
  65. package/dist/execution/modes/docker.d.ts +26 -0
  66. package/dist/execution/modes/docker.d.ts.map +1 -0
  67. package/dist/execution/modes/docker.js +183 -0
  68. package/dist/execution/modes/index.d.ts +10 -0
  69. package/dist/execution/modes/index.d.ts.map +1 -0
  70. package/dist/execution/modes/index.js +14 -0
  71. package/dist/execution/modes/kubernetes.d.ts +46 -0
  72. package/dist/execution/modes/kubernetes.d.ts.map +1 -0
  73. package/dist/execution/modes/kubernetes.js +334 -0
  74. package/dist/execution/modes/local.d.ts +23 -0
  75. package/dist/execution/modes/local.d.ts.map +1 -0
  76. package/dist/execution/modes/local.js +117 -0
  77. package/dist/execution/modes/ssh.d.ts +23 -0
  78. package/dist/execution/modes/ssh.d.ts.map +1 -0
  79. package/dist/execution/modes/ssh.js +144 -0
  80. package/dist/execution/policy.d.ts +15 -0
  81. package/dist/execution/policy.d.ts.map +1 -0
  82. package/dist/execution/policy.js +121 -0
  83. package/dist/execution/provider.d.ts +32 -0
  84. package/dist/execution/provider.d.ts.map +1 -0
  85. package/dist/execution/provider.js +90 -0
  86. package/dist/execution/types.d.ts +189 -0
  87. package/dist/execution/types.d.ts.map +1 -0
  88. package/dist/execution/types.js +9 -0
  89. package/dist/index.d.ts +12 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +44 -0
  92. package/dist/observability/diagnostics.d.ts +25 -0
  93. package/dist/observability/diagnostics.d.ts.map +1 -0
  94. package/dist/observability/diagnostics.js +98 -0
  95. package/dist/observability/health.d.ts +19 -0
  96. package/dist/observability/health.d.ts.map +1 -0
  97. package/dist/observability/health.js +145 -0
  98. package/dist/observability/index.d.ts +7 -0
  99. package/dist/observability/index.d.ts.map +1 -0
  100. package/dist/observability/index.js +25 -0
  101. package/dist/observability/runStatus.d.ts +44 -0
  102. package/dist/observability/runStatus.d.ts.map +1 -0
  103. package/dist/observability/runStatus.js +169 -0
  104. package/dist/observability/timeline.d.ts +11 -0
  105. package/dist/observability/timeline.d.ts.map +1 -0
  106. package/dist/observability/timeline.js +176 -0
  107. package/dist/observability/types.d.ts +65 -0
  108. package/dist/observability/types.d.ts.map +1 -0
  109. package/dist/observability/types.js +8 -0
  110. package/dist/observability/webhooks.d.ts +68 -0
  111. package/dist/observability/webhooks.d.ts.map +1 -0
  112. package/dist/observability/webhooks.js +132 -0
  113. package/dist/resources/budget-tracker.d.ts +56 -0
  114. package/dist/resources/budget-tracker.d.ts.map +1 -0
  115. package/dist/resources/budget-tracker.js +131 -0
  116. package/dist/resources/concurrency-guard.d.ts +55 -0
  117. package/dist/resources/concurrency-guard.d.ts.map +1 -0
  118. package/dist/resources/concurrency-guard.js +132 -0
  119. package/dist/resources/index.d.ts +12 -0
  120. package/dist/resources/index.d.ts.map +1 -0
  121. package/dist/resources/index.js +20 -0
  122. package/dist/resources/manager.d.ts +52 -0
  123. package/dist/resources/manager.d.ts.map +1 -0
  124. package/dist/resources/manager.js +150 -0
  125. package/dist/resources/timeout-cascade.d.ts +56 -0
  126. package/dist/resources/timeout-cascade.d.ts.map +1 -0
  127. package/dist/resources/timeout-cascade.js +145 -0
  128. package/dist/resources/types.d.ts +130 -0
  129. package/dist/resources/types.d.ts.map +1 -0
  130. package/dist/resources/types.js +9 -0
  131. package/dist/session/context.d.ts +22 -0
  132. package/dist/session/context.d.ts.map +1 -0
  133. package/dist/session/context.js +113 -0
  134. package/dist/session/continuityState.d.ts +39 -0
  135. package/dist/session/continuityState.d.ts.map +1 -0
  136. package/dist/session/continuityState.js +164 -0
  137. package/dist/session/cost.d.ts +63 -0
  138. package/dist/session/cost.d.ts.map +1 -0
  139. package/dist/session/cost.js +194 -0
  140. package/dist/session/discovery.d.ts +22 -0
  141. package/dist/session/discovery.d.ts.map +1 -0
  142. package/dist/session/discovery.js +35 -0
  143. package/dist/session/history.d.ts +30 -0
  144. package/dist/session/history.d.ts.map +1 -0
  145. package/dist/session/history.js +143 -0
  146. package/dist/session/index.d.ts +20 -0
  147. package/dist/session/index.d.ts.map +1 -0
  148. package/dist/session/index.js +78 -0
  149. package/dist/session/memoryExtraction.d.ts +65 -0
  150. package/dist/session/memoryExtraction.d.ts.map +1 -0
  151. package/dist/session/memoryExtraction.js +201 -0
  152. package/dist/session/parse.d.ts +45 -0
  153. package/dist/session/parse.d.ts.map +1 -0
  154. package/dist/session/parse.js +170 -0
  155. package/dist/session/persistence.d.ts +46 -0
  156. package/dist/session/persistence.d.ts.map +1 -0
  157. package/dist/session/persistence.js +180 -0
  158. package/dist/session/types.d.ts +267 -0
  159. package/dist/session/types.d.ts.map +1 -0
  160. package/dist/session/types.js +45 -0
  161. package/dist/session/write.d.ts +61 -0
  162. package/dist/session/write.d.ts.map +1 -0
  163. package/dist/session/write.js +213 -0
  164. package/dist/shellInvocation.d.ts +6 -0
  165. package/dist/shellInvocation.d.ts.map +1 -0
  166. package/dist/shellInvocation.js +8 -0
  167. package/dist/shellInvocation.test.d.ts +2 -0
  168. package/dist/shellInvocation.test.d.ts.map +1 -0
  169. package/dist/shellInvocation.test.js +18 -0
  170. package/dist/telemetry/audit-log.d.ts +56 -0
  171. package/dist/telemetry/audit-log.d.ts.map +1 -0
  172. package/dist/telemetry/audit-log.js +59 -0
  173. package/dist/telemetry/exporters.d.ts +35 -0
  174. package/dist/telemetry/exporters.d.ts.map +1 -0
  175. package/dist/telemetry/exporters.js +141 -0
  176. package/dist/telemetry/index.d.ts +12 -0
  177. package/dist/telemetry/index.d.ts.map +1 -0
  178. package/dist/telemetry/index.js +25 -0
  179. package/dist/telemetry/provider.d.ts +57 -0
  180. package/dist/telemetry/provider.d.ts.map +1 -0
  181. package/dist/telemetry/provider.js +261 -0
  182. package/dist/telemetry/span-tree.d.ts +46 -0
  183. package/dist/telemetry/span-tree.d.ts.map +1 -0
  184. package/dist/telemetry/span-tree.js +93 -0
  185. package/dist/telemetry/traceContext.d.ts +10 -0
  186. package/dist/telemetry/traceContext.d.ts.map +1 -0
  187. package/dist/telemetry/traceContext.js +43 -0
  188. package/dist/telemetry/types.d.ts +109 -0
  189. package/dist/telemetry/types.d.ts.map +1 -0
  190. package/dist/telemetry/types.js +21 -0
  191. package/package.json +98 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,eAAe,GAChB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACtE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG9E,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ /**
3
+ * Resources module — budget, concurrency, and timeout management.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ResourceManagerImpl = exports.TimeoutCascade = exports.ConcurrencyLimitError = exports.ConcurrencyGuard = exports.BudgetExceededError = exports.BudgetTracker = void 0;
7
+ // Budget tracking
8
+ var budget_tracker_1 = require("./budget-tracker");
9
+ Object.defineProperty(exports, "BudgetTracker", { enumerable: true, get: function () { return budget_tracker_1.BudgetTracker; } });
10
+ Object.defineProperty(exports, "BudgetExceededError", { enumerable: true, get: function () { return budget_tracker_1.BudgetExceededError; } });
11
+ // Concurrency
12
+ var concurrency_guard_1 = require("./concurrency-guard");
13
+ Object.defineProperty(exports, "ConcurrencyGuard", { enumerable: true, get: function () { return concurrency_guard_1.ConcurrencyGuard; } });
14
+ Object.defineProperty(exports, "ConcurrencyLimitError", { enumerable: true, get: function () { return concurrency_guard_1.ConcurrencyLimitError; } });
15
+ // Timeout cascade
16
+ var timeout_cascade_1 = require("./timeout-cascade");
17
+ Object.defineProperty(exports, "TimeoutCascade", { enumerable: true, get: function () { return timeout_cascade_1.TimeoutCascade; } });
18
+ // Unified manager
19
+ var manager_1 = require("./manager");
20
+ Object.defineProperty(exports, "ResourceManagerImpl", { enumerable: true, get: function () { return manager_1.ResourceManagerImpl; } });
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Unified resource manager that composes budget trackers, a concurrency
3
+ * guard, and a timeout cascade into the `ResourceManager` interface.
4
+ */
5
+ import type { BudgetKind, CostBudget, ResourceManager, ResourceAdmissionDecision, ResourceAdmissionRequest, ResourceSnapshot, ResourceWarningCallback, TokenBudget } from "./types";
6
+ import type { ExecutionPolicy, ResourceAdmission } from "../execution";
7
+ import { ConcurrencyGuard } from "./concurrency-guard";
8
+ import { TimeoutCascade } from "./timeout-cascade";
9
+ /** Options for constructing a `ResourceManagerImpl`. */
10
+ export interface ResourceManagerOptions {
11
+ /** Token budget limit. */
12
+ tokenLimit: number;
13
+ /** Cost budget limit. */
14
+ costLimit: number;
15
+ /** ISO 4217 currency code for cost budget. Defaults to "USD". */
16
+ costCurrency?: string;
17
+ /** Warning threshold percentage (0–100) for both budgets. */
18
+ warningThresholdPercent?: number;
19
+ /** Concurrency limits. */
20
+ concurrency?: {
21
+ maxParallelEffects?: number;
22
+ maxParallelRuns?: number;
23
+ maxParallelSessions?: number;
24
+ };
25
+ }
26
+ export declare class ResourceManagerImpl implements ResourceManager {
27
+ private readonly _tokenBudget;
28
+ private readonly _costBudget;
29
+ private readonly _costCurrency;
30
+ private readonly _warningThresholdPercent;
31
+ /** Concurrency guard for parallel effects. */
32
+ readonly effects: ConcurrencyGuard;
33
+ /** Concurrency guard for parallel runs. */
34
+ readonly runs: ConcurrencyGuard;
35
+ /** Concurrency guard for parallel sessions. */
36
+ readonly sessions: ConcurrencyGuard;
37
+ /** Timeout cascade for run / iteration / effect timeouts. */
38
+ readonly timeouts: TimeoutCascade;
39
+ private readonly _warningCallbacks;
40
+ constructor(options: ResourceManagerOptions);
41
+ checkBudget(kind: BudgetKind): TokenBudget | CostBudget;
42
+ consume(kind: BudgetKind, amount: number): void;
43
+ admit(request: ResourceAdmissionRequest): ResourceAdmissionDecision;
44
+ release(kind: BudgetKind, amount: number): void;
45
+ getSnapshot(): ResourceSnapshot;
46
+ onWarning(callback: ResourceWarningCallback): void;
47
+ admitExecutionPolicy(policy: ExecutionPolicy): ResourceAdmission;
48
+ private _trackerFor;
49
+ private _snapshot;
50
+ private _fireWarning;
51
+ }
52
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/resources/manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,UAAU,EAEV,UAAU,EACV,eAAe,EACf,yBAAyB,EACzB,wBAAwB,EACxB,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACZ,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMnD,wDAAwD;AACxD,MAAM,WAAW,sBAAsB;IACrC,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,0BAA0B;IAC1B,WAAW,CAAC,EAAE;QACZ,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH;AAMD,qBAAa,mBAAoB,YAAW,eAAe;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAS;IAElD,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,+CAA+C;IAC/C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAElC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiC;gBAEvD,OAAO,EAAE,sBAAsB;IAwB3C,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,UAAU;IAIvD,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/C,KAAK,CAAC,OAAO,EAAE,wBAAwB,GAAG,yBAAyB;IAqCnE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/C,WAAW,IAAI,gBAAgB;IAa/B,SAAS,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI;IAIlD,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,iBAAiB;IAMhE,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,YAAY;CAerB"}
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ /**
3
+ * Unified resource manager that composes budget trackers, a concurrency
4
+ * guard, and a timeout cascade into the `ResourceManager` interface.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ResourceManagerImpl = void 0;
8
+ const execution_1 = require("../execution");
9
+ const budget_tracker_1 = require("./budget-tracker");
10
+ const concurrency_guard_1 = require("./concurrency-guard");
11
+ const timeout_cascade_1 = require("./timeout-cascade");
12
+ // ---------------------------------------------------------------------------
13
+ // ResourceManagerImpl
14
+ // ---------------------------------------------------------------------------
15
+ class ResourceManagerImpl {
16
+ _tokenBudget;
17
+ _costBudget;
18
+ _costCurrency;
19
+ _warningThresholdPercent;
20
+ /** Concurrency guard for parallel effects. */
21
+ effects;
22
+ /** Concurrency guard for parallel runs. */
23
+ runs;
24
+ /** Concurrency guard for parallel sessions. */
25
+ sessions;
26
+ /** Timeout cascade for run / iteration / effect timeouts. */
27
+ timeouts;
28
+ _warningCallbacks = [];
29
+ constructor(options) {
30
+ this._tokenBudget = new budget_tracker_1.BudgetTracker(options.tokenLimit);
31
+ this._costBudget = new budget_tracker_1.BudgetTracker(options.costLimit);
32
+ this._costCurrency = options.costCurrency ?? "USD";
33
+ this._warningThresholdPercent = options.warningThresholdPercent ?? 80;
34
+ const cc = options.concurrency ?? {};
35
+ this.effects = new concurrency_guard_1.ConcurrencyGuard(cc.maxParallelEffects ?? 8);
36
+ this.runs = new concurrency_guard_1.ConcurrencyGuard(cc.maxParallelRuns ?? 4);
37
+ this.sessions = new concurrency_guard_1.ConcurrencyGuard(cc.maxParallelSessions ?? 4);
38
+ this.timeouts = new timeout_cascade_1.TimeoutCascade();
39
+ // Wire up threshold warnings.
40
+ this._tokenBudget.onThreshold(this._warningThresholdPercent, () => {
41
+ this._fireWarning("tokens");
42
+ });
43
+ this._costBudget.onThreshold(this._warningThresholdPercent, () => {
44
+ this._fireWarning("cost");
45
+ });
46
+ }
47
+ // -- ResourceManager interface --------------------------------------------
48
+ checkBudget(kind) {
49
+ return this._snapshot(kind);
50
+ }
51
+ consume(kind, amount) {
52
+ this._trackerFor(kind).consume(amount);
53
+ }
54
+ admit(request) {
55
+ const tokens = request.tokens ?? 0;
56
+ const cost = request.cost ?? 0;
57
+ if (tokens < 0 || cost < 0) {
58
+ return {
59
+ allowed: false,
60
+ reason: "Resource admission amounts must be non-negative",
61
+ snapshot: this.getSnapshot(),
62
+ };
63
+ }
64
+ const tokenBudget = this._tokenBudget.check();
65
+ if (tokens > tokenBudget.remaining) {
66
+ return {
67
+ allowed: false,
68
+ reason: `tokens budget exceeded: requested ${tokens}, remaining ${tokenBudget.remaining}`,
69
+ snapshot: this.getSnapshot(),
70
+ };
71
+ }
72
+ const costBudget = this._costBudget.check();
73
+ if (cost > costBudget.remaining) {
74
+ return {
75
+ allowed: false,
76
+ reason: `cost budget exceeded: requested ${cost}, remaining ${costBudget.remaining}`,
77
+ snapshot: this.getSnapshot(),
78
+ };
79
+ }
80
+ if (tokens > 0)
81
+ this._tokenBudget.consume(tokens);
82
+ if (cost > 0)
83
+ this._costBudget.consume(cost);
84
+ return {
85
+ allowed: true,
86
+ snapshot: this.getSnapshot(),
87
+ };
88
+ }
89
+ release(kind, amount) {
90
+ this._trackerFor(kind).release(amount);
91
+ }
92
+ getSnapshot() {
93
+ return {
94
+ tokens: this._snapshot("tokens"),
95
+ cost: this._snapshot("cost"),
96
+ concurrency: {
97
+ maxParallelEffects: this.effects.active,
98
+ maxParallelRuns: this.runs.active,
99
+ maxParallelSessions: this.sessions.active,
100
+ },
101
+ timestamp: new Date().toISOString(),
102
+ };
103
+ }
104
+ onWarning(callback) {
105
+ this._warningCallbacks.push(callback);
106
+ }
107
+ admitExecutionPolicy(policy) {
108
+ return (0, execution_1.admitExecutionPolicy)(policy);
109
+ }
110
+ // -- Helpers --------------------------------------------------------------
111
+ _trackerFor(kind) {
112
+ return kind === "tokens" ? this._tokenBudget : this._costBudget;
113
+ }
114
+ _snapshot(kind) {
115
+ const tracker = this._trackerFor(kind);
116
+ if (kind === "tokens") {
117
+ const snap = {
118
+ limit: tracker.limit,
119
+ used: tracker.used,
120
+ remaining: tracker.remaining,
121
+ warningThreshold: this._warningThresholdPercent / 100,
122
+ };
123
+ return snap;
124
+ }
125
+ const snap = {
126
+ limit: tracker.limit,
127
+ used: tracker.used,
128
+ remaining: tracker.remaining,
129
+ currency: this._costCurrency,
130
+ };
131
+ return snap;
132
+ }
133
+ _fireWarning(kind) {
134
+ const budget = this._snapshot(kind);
135
+ const warning = {
136
+ kind,
137
+ budget,
138
+ timestamp: new Date().toISOString(),
139
+ };
140
+ for (const cb of this._warningCallbacks) {
141
+ try {
142
+ cb(warning);
143
+ }
144
+ catch {
145
+ // Swallow subscriber errors to avoid breaking the manager.
146
+ }
147
+ }
148
+ }
149
+ }
150
+ exports.ResourceManagerImpl = ResourceManagerImpl;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Nested timeout management with cascading abort signals.
3
+ *
4
+ * Manages timeouts at three levels: run -> iteration -> effect.
5
+ * When a parent timeout fires (or is cleared), all children are
6
+ * automatically aborted.
7
+ */
8
+ /** Handle returned by each `create*Timeout` method. */
9
+ export interface TimeoutHandle {
10
+ /** AbortSignal that fires when the timeout elapses or is cancelled. */
11
+ readonly signal: AbortSignal;
12
+ /** Manually clear the timeout and abort any children. */
13
+ clear(): void;
14
+ }
15
+ export declare class TimeoutCascade {
16
+ private _run;
17
+ private _iteration;
18
+ /**
19
+ * Create a run-level timeout.
20
+ *
21
+ * Clears any existing run (and its children) before creating a new one.
22
+ */
23
+ createRunTimeout(ms: number): TimeoutHandle;
24
+ /**
25
+ * Create an iteration-level timeout nested under the current run.
26
+ *
27
+ * Clears any existing iteration (and its effect children) first.
28
+ *
29
+ * @throws {Error} if no run timeout is active.
30
+ */
31
+ createIterationTimeout(ms: number): TimeoutHandle;
32
+ /**
33
+ * Create an effect-level timeout nested under the current iteration.
34
+ *
35
+ * @throws {Error} if no iteration timeout is active.
36
+ */
37
+ createEffectTimeout(ms: number): TimeoutHandle;
38
+ /**
39
+ * Tear down all active timeouts (run, iteration, and effects).
40
+ */
41
+ clearAll(): void;
42
+ /**
43
+ * Create a new `TimeoutNode`, register it as a child of `parent` (if any),
44
+ * and set up parent-abort cascading.
45
+ */
46
+ private _createNode;
47
+ /** Abort a node and all of its children recursively. */
48
+ private _abortNode;
49
+ /** Clear a node: abort it and all descendants. */
50
+ private _clearNode;
51
+ /** Remove a child from a parent's children array. */
52
+ private _removeChild;
53
+ /** Create a public `TimeoutHandle` for a node. */
54
+ private _handleFor;
55
+ }
56
+ //# sourceMappingURL=timeout-cascade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout-cascade.d.ts","sourceRoot":"","sources":["../../src/resources/timeout-cascade.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,yDAAyD;IACzD,KAAK,IAAI,IAAI,CAAC;CACf;AAgBD,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,UAAU,CAA0B;IAI5C;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa;IAY3C;;;;;;OAMG;IACH,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa;IAiBjD;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa;IAW9C;;OAEG;IACH,QAAQ,IAAI,IAAI;IAUhB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAwCnB,wDAAwD;IACxD,OAAO,CAAC,UAAU;IAclB,kDAAkD;IAClD,OAAO,CAAC,UAAU;IAIlB,qDAAqD;IACrD,OAAO,CAAC,YAAY;IAOpB,kDAAkD;IAClD,OAAO,CAAC,UAAU;CAQnB"}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ /**
3
+ * Nested timeout management with cascading abort signals.
4
+ *
5
+ * Manages timeouts at three levels: run -> iteration -> effect.
6
+ * When a parent timeout fires (or is cleared), all children are
7
+ * automatically aborted.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.TimeoutCascade = void 0;
11
+ // ---------------------------------------------------------------------------
12
+ // TimeoutCascade
13
+ // ---------------------------------------------------------------------------
14
+ class TimeoutCascade {
15
+ _run;
16
+ _iteration;
17
+ // -- Factory methods ------------------------------------------------------
18
+ /**
19
+ * Create a run-level timeout.
20
+ *
21
+ * Clears any existing run (and its children) before creating a new one.
22
+ */
23
+ createRunTimeout(ms) {
24
+ // Tear down any previous run hierarchy.
25
+ if (this._run) {
26
+ this._clearNode(this._run);
27
+ }
28
+ this._run = this._createNode(ms, undefined);
29
+ this._iteration = undefined; // Children belong to previous run.
30
+ return this._handleFor(this._run);
31
+ }
32
+ /**
33
+ * Create an iteration-level timeout nested under the current run.
34
+ *
35
+ * Clears any existing iteration (and its effect children) first.
36
+ *
37
+ * @throws {Error} if no run timeout is active.
38
+ */
39
+ createIterationTimeout(ms) {
40
+ if (!this._run) {
41
+ throw new Error("Cannot create iteration timeout: no run timeout is active");
42
+ }
43
+ // Tear down previous iteration.
44
+ if (this._iteration) {
45
+ this._removeChild(this._run, this._iteration);
46
+ this._clearNode(this._iteration);
47
+ }
48
+ this._iteration = this._createNode(ms, this._run);
49
+ return this._handleFor(this._iteration);
50
+ }
51
+ /**
52
+ * Create an effect-level timeout nested under the current iteration.
53
+ *
54
+ * @throws {Error} if no iteration timeout is active.
55
+ */
56
+ createEffectTimeout(ms) {
57
+ if (!this._iteration) {
58
+ throw new Error("Cannot create effect timeout: no iteration timeout is active");
59
+ }
60
+ const node = this._createNode(ms, this._iteration);
61
+ return this._handleFor(node);
62
+ }
63
+ /**
64
+ * Tear down all active timeouts (run, iteration, and effects).
65
+ */
66
+ clearAll() {
67
+ if (this._run) {
68
+ this._clearNode(this._run);
69
+ this._run = undefined;
70
+ this._iteration = undefined;
71
+ }
72
+ }
73
+ // -- Internals ------------------------------------------------------------
74
+ /**
75
+ * Create a new `TimeoutNode`, register it as a child of `parent` (if any),
76
+ * and set up parent-abort cascading.
77
+ */
78
+ _createNode(ms, parent) {
79
+ const controller = new AbortController();
80
+ const node = {
81
+ controller,
82
+ timer: undefined,
83
+ children: [],
84
+ };
85
+ // Schedule the timeout.
86
+ node.timer = setTimeout(() => {
87
+ node.timer = undefined;
88
+ this._abortNode(node);
89
+ }, ms);
90
+ // If the parent is already aborted, abort immediately.
91
+ if (parent) {
92
+ if (parent.controller.signal.aborted) {
93
+ clearTimeout(node.timer);
94
+ node.timer = undefined;
95
+ controller.abort(parent.controller.signal.reason);
96
+ }
97
+ else {
98
+ parent.children.push(node);
99
+ // Listen for parent abort to cascade.
100
+ const onParentAbort = () => {
101
+ this._abortNode(node);
102
+ };
103
+ parent.controller.signal.addEventListener("abort", onParentAbort, {
104
+ once: true,
105
+ });
106
+ }
107
+ }
108
+ return node;
109
+ }
110
+ /** Abort a node and all of its children recursively. */
111
+ _abortNode(node) {
112
+ if (node.timer !== undefined) {
113
+ clearTimeout(node.timer);
114
+ node.timer = undefined;
115
+ }
116
+ if (!node.controller.signal.aborted) {
117
+ node.controller.abort(new Error("Timeout elapsed"));
118
+ }
119
+ for (const child of node.children) {
120
+ this._abortNode(child);
121
+ }
122
+ node.children.length = 0;
123
+ }
124
+ /** Clear a node: abort it and all descendants. */
125
+ _clearNode(node) {
126
+ this._abortNode(node);
127
+ }
128
+ /** Remove a child from a parent's children array. */
129
+ _removeChild(parent, child) {
130
+ const idx = parent.children.indexOf(child);
131
+ if (idx !== -1) {
132
+ parent.children.splice(idx, 1);
133
+ }
134
+ }
135
+ /** Create a public `TimeoutHandle` for a node. */
136
+ _handleFor(node) {
137
+ return {
138
+ signal: node.controller.signal,
139
+ clear: () => {
140
+ this._clearNode(node);
141
+ },
142
+ };
143
+ }
144
+ }
145
+ exports.TimeoutCascade = TimeoutCascade;
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Resource management interfaces for Babysitter Agent Runtime.
3
+ *
4
+ * Covers budget tracking (tokens, cost), concurrency limits, timeouts,
5
+ * and a unified resource manager. Interface-only stubs; implementations
6
+ * will follow in issue #217.
7
+ */
8
+ /** Token consumption budget for a run or session. */
9
+ export interface TokenBudget {
10
+ /** Maximum allowed tokens. */
11
+ readonly limit: number;
12
+ /** Tokens consumed so far. */
13
+ readonly used: number;
14
+ /** Tokens remaining (`limit - used`). */
15
+ readonly remaining: number;
16
+ /** Optional threshold (0-1) at which a warning callback fires. */
17
+ readonly warningThreshold?: number;
18
+ }
19
+ /** Monetary cost budget for a run or session. */
20
+ export interface CostBudget {
21
+ /** Maximum allowed cost. */
22
+ readonly limit: number;
23
+ /** Cost consumed so far. */
24
+ readonly used: number;
25
+ /** Cost remaining (`limit - used`). */
26
+ readonly remaining: number;
27
+ /** ISO 4217 currency code; defaults to "USD". */
28
+ readonly currency?: string;
29
+ }
30
+ /** Hard caps on parallel work within a single orchestration scope. */
31
+ export interface ConcurrencyLimits {
32
+ /** Maximum effects that may execute in parallel. */
33
+ readonly maxParallelEffects: number;
34
+ /** Maximum babysitter runs that may execute in parallel. */
35
+ readonly maxParallelRuns: number;
36
+ /** Maximum Claude Code sessions that may execute in parallel. */
37
+ readonly maxParallelSessions: number;
38
+ }
39
+ /** Timeout configuration at various granularity levels. */
40
+ export interface TimeoutConfig {
41
+ /** Maximum wall-clock duration for a single effect (ms). */
42
+ readonly perEffect?: number;
43
+ /** Maximum wall-clock duration for a single iteration (ms). */
44
+ readonly perIteration?: number;
45
+ /** Maximum wall-clock duration for an entire run (ms). */
46
+ readonly perRun?: number;
47
+ /** Policy applied when a timeout fires (e.g. "cancel", "warn", "escalate"). */
48
+ readonly escalationPolicy?: string;
49
+ }
50
+ /** Point-in-time snapshot of all tracked resource dimensions. */
51
+ export interface ResourceSnapshot {
52
+ /** Current token budget state. */
53
+ readonly tokens: TokenBudget;
54
+ /** Current cost budget state. */
55
+ readonly cost: CostBudget;
56
+ /** Current concurrency utilisation (used counts, not limits). */
57
+ readonly concurrency: ConcurrencyLimits;
58
+ /** ISO-8601 timestamp when this snapshot was captured. */
59
+ readonly timestamp: string;
60
+ }
61
+ /** Discriminator for the type of budget being queried or mutated. */
62
+ export type BudgetKind = "tokens" | "cost";
63
+ /** Payload delivered to resource-warning subscribers. */
64
+ export interface ResourceWarning {
65
+ /** Which budget triggered the warning. */
66
+ readonly kind: BudgetKind;
67
+ /** The budget state at the time of the warning. */
68
+ readonly budget: TokenBudget | CostBudget;
69
+ /** ISO-8601 timestamp of the warning. */
70
+ readonly timestamp: string;
71
+ }
72
+ /** Callback signature for resource warning notifications. */
73
+ export type ResourceWarningCallback = (warning: ResourceWarning) => void;
74
+ export interface ResourceAdmissionRequest {
75
+ readonly tokens?: number;
76
+ readonly cost?: number;
77
+ }
78
+ export interface ResourceAdmissionDecision {
79
+ readonly allowed: boolean;
80
+ readonly reason?: string;
81
+ readonly snapshot: ResourceSnapshot;
82
+ }
83
+ /** Unified resource manager for budget enforcement and reporting. */
84
+ export interface ResourceManager {
85
+ /**
86
+ * Check the current budget state for a given kind.
87
+ *
88
+ * @param kind - "tokens" or "cost".
89
+ * @returns The corresponding budget snapshot.
90
+ */
91
+ checkBudget(kind: BudgetKind): TokenBudget | CostBudget;
92
+ /**
93
+ * Record consumption against a budget.
94
+ *
95
+ * @param kind - Which budget to charge.
96
+ * @param amount - Units to consume.
97
+ */
98
+ consume(kind: BudgetKind, amount: number): void;
99
+ /**
100
+ * Atomically check and reserve resources before dispatching new work.
101
+ *
102
+ * A denied decision must not mutate budget state.
103
+ */
104
+ admit(request: ResourceAdmissionRequest): ResourceAdmissionDecision;
105
+ /**
106
+ * Release previously consumed units back into a budget (e.g. on rollback).
107
+ *
108
+ * @param kind - Which budget to credit.
109
+ * @param amount - Units to release.
110
+ */
111
+ release(kind: BudgetKind, amount: number): void;
112
+ /**
113
+ * Capture a point-in-time snapshot of all resource dimensions.
114
+ */
115
+ getSnapshot(): ResourceSnapshot;
116
+ /**
117
+ * Register a callback that fires when any budget crosses its warning threshold.
118
+ *
119
+ * @param callback - Function invoked with the warning payload.
120
+ */
121
+ onWarning(callback: ResourceWarningCallback): void;
122
+ /**
123
+ * Admit OS execution limits into the resource layer.
124
+ *
125
+ * This records the policy seam for executors. ResourceManager does not apply
126
+ * kernel limits directly; concrete executors translate accepted limits.
127
+ */
128
+ admitExecutionPolicy(policy: import("../execution").ExecutionPolicy): import("../execution").ResourceAdmission;
129
+ }
130
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/resources/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * Resource management interfaces for Babysitter Agent Runtime.
4
+ *
5
+ * Covers budget tracking (tokens, cost), concurrency limits, timeouts,
6
+ * and a unified resource manager. Interface-only stubs; implementations
7
+ * will follow in issue #217.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Session context persistence for cross-run knowledge sharing (GAP-SESSION-001).
3
+ * Stores accumulated notes and shared knowledge as a JSON file alongside the session state file.
4
+ */
5
+ import type { SessionContext } from './types';
6
+ /**
7
+ * Get the file path for a session's context JSON file.
8
+ */
9
+ export declare function getSessionContextPath(stateDir: string, sessionId: string): string;
10
+ /**
11
+ * Read session context from disk.
12
+ * Returns empty context if the file does not exist.
13
+ * Logs a warning and returns empty context if the file is corrupt.
14
+ */
15
+ export declare function getSessionContext(stateDir: string, sessionId: string): Promise<SessionContext>;
16
+ /**
17
+ * Update session context by merging new data with existing context.
18
+ * Notes are appended; sharedKnowledge keys are merged (newer values win).
19
+ * Uses atomic temp-file + rename pattern to prevent partial writes.
20
+ */
21
+ export declare function updateSessionContext(stateDir: string, sessionId: string, updates: Partial<SessionContext>): Promise<SessionContext>;
22
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/session/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjF;AAQD;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA4BpG;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,OAAO,CAAC,cAAc,CAAC,CAoBzB"}