@a5c-ai/agent-runtime 5.0.1-staging.016f0b0e8119

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 (170) hide show
  1. package/README.md +23 -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 +14 -0
  6. package/dist/background/state.d.ts.map +1 -0
  7. package/dist/background/state.js +25 -0
  8. package/dist/backgroundProcessRegistry.d.ts +66 -0
  9. package/dist/backgroundProcessRegistry.d.ts.map +1 -0
  10. package/dist/backgroundProcessRegistry.js +202 -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 +209 -0
  35. package/dist/daemon/daemonLog.d.ts +13 -0
  36. package/dist/daemon/daemonLog.d.ts.map +1 -0
  37. package/dist/daemon/daemonLog.js +64 -0
  38. package/dist/daemon/fileWatcher.d.ts +9 -0
  39. package/dist/daemon/fileWatcher.d.ts.map +1 -0
  40. package/dist/daemon/fileWatcher.js +141 -0
  41. package/dist/daemon/index.d.ts +13 -0
  42. package/dist/daemon/index.d.ts.map +1 -0
  43. package/dist/daemon/index.js +22 -0
  44. package/dist/daemon/lifecycle.d.ts +12 -0
  45. package/dist/daemon/lifecycle.d.ts.map +1 -0
  46. package/dist/daemon/lifecycle.js +257 -0
  47. package/dist/daemon/loop.d.ts +21 -0
  48. package/dist/daemon/loop.d.ts.map +1 -0
  49. package/dist/daemon/loop.js +196 -0
  50. package/dist/daemon/timerScheduler.d.ts +13 -0
  51. package/dist/daemon/timerScheduler.d.ts.map +1 -0
  52. package/dist/daemon/timerScheduler.js +122 -0
  53. package/dist/daemon/types.d.ts +93 -0
  54. package/dist/daemon/types.d.ts.map +1 -0
  55. package/dist/daemon/types.js +25 -0
  56. package/dist/daemon/webhookListener.d.ts +6 -0
  57. package/dist/daemon/webhookListener.d.ts.map +1 -0
  58. package/dist/daemon/webhookListener.js +110 -0
  59. package/dist/execution/index.d.ts +8 -0
  60. package/dist/execution/index.d.ts.map +1 -0
  61. package/dist/execution/index.js +12 -0
  62. package/dist/execution/modes/docker.d.ts +21 -0
  63. package/dist/execution/modes/docker.d.ts.map +1 -0
  64. package/dist/execution/modes/docker.js +125 -0
  65. package/dist/execution/modes/index.d.ts +10 -0
  66. package/dist/execution/modes/index.d.ts.map +1 -0
  67. package/dist/execution/modes/index.js +14 -0
  68. package/dist/execution/modes/kubernetes.d.ts +29 -0
  69. package/dist/execution/modes/kubernetes.d.ts.map +1 -0
  70. package/dist/execution/modes/kubernetes.js +121 -0
  71. package/dist/execution/modes/local.d.ts +23 -0
  72. package/dist/execution/modes/local.d.ts.map +1 -0
  73. package/dist/execution/modes/local.js +102 -0
  74. package/dist/execution/modes/ssh.d.ts +23 -0
  75. package/dist/execution/modes/ssh.d.ts.map +1 -0
  76. package/dist/execution/modes/ssh.js +134 -0
  77. package/dist/execution/provider.d.ts +32 -0
  78. package/dist/execution/provider.d.ts.map +1 -0
  79. package/dist/execution/provider.js +90 -0
  80. package/dist/execution/types.d.ts +105 -0
  81. package/dist/execution/types.d.ts.map +1 -0
  82. package/dist/execution/types.js +9 -0
  83. package/dist/index.d.ts +11 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +42 -0
  86. package/dist/observability/health.d.ts +19 -0
  87. package/dist/observability/health.d.ts.map +1 -0
  88. package/dist/observability/health.js +129 -0
  89. package/dist/observability/index.d.ts +6 -0
  90. package/dist/observability/index.d.ts.map +1 -0
  91. package/dist/observability/index.js +20 -0
  92. package/dist/observability/runStatus.d.ts +44 -0
  93. package/dist/observability/runStatus.d.ts.map +1 -0
  94. package/dist/observability/runStatus.js +169 -0
  95. package/dist/observability/timeline.d.ts +11 -0
  96. package/dist/observability/timeline.d.ts.map +1 -0
  97. package/dist/observability/timeline.js +176 -0
  98. package/dist/observability/types.d.ts +62 -0
  99. package/dist/observability/types.d.ts.map +1 -0
  100. package/dist/observability/types.js +8 -0
  101. package/dist/observability/webhooks.d.ts +68 -0
  102. package/dist/observability/webhooks.d.ts.map +1 -0
  103. package/dist/observability/webhooks.js +132 -0
  104. package/dist/resources/budget-tracker.d.ts +56 -0
  105. package/dist/resources/budget-tracker.d.ts.map +1 -0
  106. package/dist/resources/budget-tracker.js +131 -0
  107. package/dist/resources/concurrency-guard.d.ts +55 -0
  108. package/dist/resources/concurrency-guard.d.ts.map +1 -0
  109. package/dist/resources/concurrency-guard.js +132 -0
  110. package/dist/resources/index.d.ts +12 -0
  111. package/dist/resources/index.d.ts.map +1 -0
  112. package/dist/resources/index.js +20 -0
  113. package/dist/resources/manager.d.ts +49 -0
  114. package/dist/resources/manager.d.ts.map +1 -0
  115. package/dist/resources/manager.js +111 -0
  116. package/dist/resources/timeout-cascade.d.ts +56 -0
  117. package/dist/resources/timeout-cascade.d.ts.map +1 -0
  118. package/dist/resources/timeout-cascade.js +145 -0
  119. package/dist/resources/types.d.ts +108 -0
  120. package/dist/resources/types.d.ts.map +1 -0
  121. package/dist/resources/types.js +9 -0
  122. package/dist/session/context.d.ts +22 -0
  123. package/dist/session/context.d.ts.map +1 -0
  124. package/dist/session/context.js +113 -0
  125. package/dist/session/continuityState.d.ts +39 -0
  126. package/dist/session/continuityState.d.ts.map +1 -0
  127. package/dist/session/continuityState.js +164 -0
  128. package/dist/session/cost.d.ts +63 -0
  129. package/dist/session/cost.d.ts.map +1 -0
  130. package/dist/session/cost.js +194 -0
  131. package/dist/session/discovery.d.ts +22 -0
  132. package/dist/session/discovery.d.ts.map +1 -0
  133. package/dist/session/discovery.js +35 -0
  134. package/dist/session/history.d.ts +30 -0
  135. package/dist/session/history.d.ts.map +1 -0
  136. package/dist/session/history.js +143 -0
  137. package/dist/session/index.d.ts +20 -0
  138. package/dist/session/index.d.ts.map +1 -0
  139. package/dist/session/index.js +78 -0
  140. package/dist/session/memoryExtraction.d.ts +65 -0
  141. package/dist/session/memoryExtraction.d.ts.map +1 -0
  142. package/dist/session/memoryExtraction.js +201 -0
  143. package/dist/session/parse.d.ts +45 -0
  144. package/dist/session/parse.d.ts.map +1 -0
  145. package/dist/session/parse.js +170 -0
  146. package/dist/session/persistence.d.ts +46 -0
  147. package/dist/session/persistence.d.ts.map +1 -0
  148. package/dist/session/persistence.js +180 -0
  149. package/dist/session/types.d.ts +267 -0
  150. package/dist/session/types.d.ts.map +1 -0
  151. package/dist/session/types.js +45 -0
  152. package/dist/session/write.d.ts +61 -0
  153. package/dist/session/write.d.ts.map +1 -0
  154. package/dist/session/write.js +213 -0
  155. package/dist/telemetry/audit-log.d.ts +56 -0
  156. package/dist/telemetry/audit-log.d.ts.map +1 -0
  157. package/dist/telemetry/audit-log.js +59 -0
  158. package/dist/telemetry/index.d.ts +9 -0
  159. package/dist/telemetry/index.d.ts.map +1 -0
  160. package/dist/telemetry/index.js +15 -0
  161. package/dist/telemetry/provider.d.ts +39 -0
  162. package/dist/telemetry/provider.d.ts.map +1 -0
  163. package/dist/telemetry/provider.js +91 -0
  164. package/dist/telemetry/span-tree.d.ts +46 -0
  165. package/dist/telemetry/span-tree.d.ts.map +1 -0
  166. package/dist/telemetry/span-tree.js +93 -0
  167. package/dist/telemetry/types.d.ts +85 -0
  168. package/dist/telemetry/types.d.ts.map +1 -0
  169. package/dist/telemetry/types.js +21 -0
  170. package/package.json +90 -0
package/README.md ADDED
@@ -0,0 +1,23 @@
1
+ # @a5c-ai/agent-runtime
2
+
3
+ Agent runtime layer (L5) for the Babysitter monorepo.
4
+
5
+ Provides daemon lifecycle, session management, resource management, and telemetry infrastructure.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @a5c-ai/agent-runtime
11
+ ```
12
+
13
+ ## Build
14
+
15
+ ```bash
16
+ npm run build
17
+ ```
18
+
19
+ ## Test
20
+
21
+ ```bash
22
+ npm run test
23
+ ```
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Lightweight result envelope used by daemon lifecycle and config modules.
3
+ *
4
+ * Duplicated from agent-platform's api/utils to avoid a circular
5
+ * dependency between agent-runtime and agent-platform.
6
+ */
7
+ export type ApiResult<T> = {
8
+ ok: true;
9
+ data: T;
10
+ } | {
11
+ ok: false;
12
+ error: {
13
+ code: string;
14
+ message: string;
15
+ };
16
+ };
17
+ export declare function ok<T>(data: T): ApiResult<T>;
18
+ export declare function fail<T>(code: string, message: string): ApiResult<T>;
19
+ //# sourceMappingURL=apiResult.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiResult.d.ts","sourceRoot":"","sources":["../src/apiResult.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,SAAS,CAAC,CAAC,IACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GACrB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAE5D,wBAAgB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAE3C;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAEnE"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ /**
3
+ * Lightweight result envelope used by daemon lifecycle and config modules.
4
+ *
5
+ * Duplicated from agent-platform's api/utils to avoid a circular
6
+ * dependency between agent-runtime and agent-platform.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ok = ok;
10
+ exports.fail = fail;
11
+ function ok(data) {
12
+ return { ok: true, data };
13
+ }
14
+ function fail(code, message) {
15
+ return { ok: false, error: { code, message } };
16
+ }
@@ -0,0 +1,14 @@
1
+ import { BackgroundProcessRegistry } from "../backgroundProcessRegistry";
2
+ /**
3
+ * Minimal interface matching the fields from `AgentCoreToolOptions` (agent-core)
4
+ * that state.ts actually consumes. Defined locally to avoid a circular
5
+ * dependency between agent-runtime and agent-core.
6
+ */
7
+ interface BackgroundRegistryOwner {
8
+ backgroundRegistry?: BackgroundProcessRegistry;
9
+ maxBackgroundProcesses?: number;
10
+ }
11
+ export declare function getBackgroundRegistry(options: BackgroundRegistryOwner): BackgroundProcessRegistry;
12
+ export declare function disposeBackgroundRegistry(options: BackgroundRegistryOwner): void;
13
+ export {};
14
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/background/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAEzE;;;;GAIG;AACH,UAAU,uBAAuB;IAC/B,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;IAC/C,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,uBAAuB,GAAG,yBAAyB,CAWjG;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAOhF"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getBackgroundRegistry = getBackgroundRegistry;
4
+ exports.disposeBackgroundRegistry = disposeBackgroundRegistry;
5
+ const backgroundProcessRegistry_1 = require("../backgroundProcessRegistry");
6
+ const scopedRegistries = new WeakMap();
7
+ function getBackgroundRegistry(options) {
8
+ if (options.backgroundRegistry) {
9
+ return options.backgroundRegistry;
10
+ }
11
+ let registry = scopedRegistries.get(options);
12
+ if (!registry) {
13
+ registry = new backgroundProcessRegistry_1.BackgroundProcessRegistry({ maxConcurrent: options.maxBackgroundProcesses });
14
+ scopedRegistries.set(options, registry);
15
+ }
16
+ return registry;
17
+ }
18
+ function disposeBackgroundRegistry(options) {
19
+ const registry = scopedRegistries.get(options) ?? options.backgroundRegistry;
20
+ if (!registry) {
21
+ return;
22
+ }
23
+ registry.dispose();
24
+ scopedRegistries.delete(options);
25
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Background process lifecycle management for the bash agentic tool (GAP-TOOLS-036).
3
+ *
4
+ * Tracks child processes spawned with `run_in_background: true`, collects
5
+ * stdout/stderr, fires completion callbacks, and enforces a concurrency limit.
6
+ */
7
+ import * as childProcess from "node:child_process";
8
+ /** Snapshot of a tracked background process. */
9
+ export interface BackgroundTaskRecord {
10
+ backgroundTaskId: string;
11
+ pid: number;
12
+ command: string;
13
+ description?: string;
14
+ startedAt: string;
15
+ status: "running" | "completed" | "exited" | "cancelled" | "killed";
16
+ exitCode: number | null;
17
+ stdout: string;
18
+ stderr: string;
19
+ durationMs: number | null;
20
+ }
21
+ /** Payload delivered to `onComplete` callbacks. */
22
+ export interface BackgroundCompletionEvent {
23
+ backgroundTaskId: string;
24
+ pid: number;
25
+ command: string;
26
+ description?: string;
27
+ status: "completed" | "exited";
28
+ exitCode: number;
29
+ stdout: string;
30
+ stderr: string;
31
+ durationMs: number;
32
+ }
33
+ /** Options for spawning a background process. */
34
+ export interface SpawnOptions {
35
+ command: string;
36
+ cwd: string;
37
+ env?: Record<string, string>;
38
+ description?: string;
39
+ onComplete?: (event: BackgroundCompletionEvent) => void;
40
+ }
41
+ export declare class BackgroundProcessRegistry {
42
+ private readonly processes;
43
+ private readonly maxConcurrent;
44
+ private readonly spawnFn;
45
+ constructor(options?: {
46
+ maxConcurrent?: number;
47
+ spawnFn?: typeof childProcess.spawn;
48
+ });
49
+ /**
50
+ * Spawn a command in the background and begin tracking it.
51
+ * Returns a snapshot of the initial record.
52
+ */
53
+ spawn(opts: SpawnOptions): BackgroundTaskRecord;
54
+ /** Get a snapshot of a tracked process by ID, or undefined. */
55
+ get(backgroundTaskId: string): BackgroundTaskRecord | undefined;
56
+ /** List snapshots of all tracked processes. */
57
+ list(): BackgroundTaskRecord[];
58
+ /** Cancel (SIGTERM) a running process. Returns true if found and killed. */
59
+ cancel(backgroundTaskId: string): boolean;
60
+ /** Kill all running processes. */
61
+ killAll(): void;
62
+ /** Kill all processes and clear tracking state. */
63
+ dispose(): void;
64
+ private snapshot;
65
+ }
66
+ //# sourceMappingURL=backgroundProcessRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backgroundProcessRegistry.d.ts","sourceRoot":"","sources":["../src/backgroundProcessRegistry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AAOnD,gDAAgD;AAChD,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IACpE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,mDAAmD;AACnD,MAAM,WAAW,yBAAyB;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;CACzD;AA4BD,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAC/D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;gBAExC,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,YAAY,CAAC,KAAK,CAAA;KAAE;IAKrF;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,oBAAoB;IAuF/C,+DAA+D;IAC/D,GAAG,CAAC,gBAAgB,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAM/D,+CAA+C;IAC/C,IAAI,IAAI,oBAAoB,EAAE;IAI9B,4EAA4E;IAC5E,MAAM,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO;IAczC,kCAAkC;IAClC,OAAO,IAAI,IAAI;IAcf,mDAAmD;IACnD,OAAO,IAAI,IAAI;IASf,OAAO,CAAC,QAAQ;CAcjB"}
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ /**
3
+ * Background process lifecycle management for the bash agentic tool (GAP-TOOLS-036).
4
+ *
5
+ * Tracks child processes spawned with `run_in_background: true`, collects
6
+ * stdout/stderr, fires completion callbacks, and enforces a concurrency limit.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.BackgroundProcessRegistry = void 0;
43
+ const childProcess = __importStar(require("node:child_process"));
44
+ const babysitter_sdk_1 = require("@a5c-ai/babysitter-sdk");
45
+ // ---------------------------------------------------------------------------
46
+ // Registry
47
+ // ---------------------------------------------------------------------------
48
+ const DEFAULT_MAX_CONCURRENT = 16;
49
+ class BackgroundProcessRegistry {
50
+ processes = new Map();
51
+ maxConcurrent;
52
+ spawnFn;
53
+ constructor(options) {
54
+ this.maxConcurrent = options?.maxConcurrent ?? DEFAULT_MAX_CONCURRENT;
55
+ this.spawnFn = options?.spawnFn ?? childProcess.spawn;
56
+ }
57
+ /**
58
+ * Spawn a command in the background and begin tracking it.
59
+ * Returns a snapshot of the initial record.
60
+ */
61
+ spawn(opts) {
62
+ const runningCount = [...this.processes.values()].filter((p) => p.status === "running").length;
63
+ if (runningCount >= this.maxConcurrent) {
64
+ throw new Error(`Max concurrent background processes limit reached (${this.maxConcurrent}). ` +
65
+ `Cancel or wait for existing processes before spawning new ones.`);
66
+ }
67
+ const backgroundTaskId = (0, babysitter_sdk_1.nextUlid)();
68
+ const startMs = Date.now();
69
+ const shell = process.platform === "win32" ? "cmd.exe" : "/bin/bash";
70
+ const shellArgs = process.platform === "win32"
71
+ ? ["/c", opts.command]
72
+ : ["-c", opts.command];
73
+ const child = this.spawnFn(shell, shellArgs, {
74
+ cwd: opts.cwd,
75
+ env: { ...process.env, ...opts.env },
76
+ shell: false,
77
+ windowsHide: true,
78
+ stdio: ["ignore", "pipe", "pipe"],
79
+ });
80
+ const tracked = {
81
+ backgroundTaskId,
82
+ pid: child.pid ?? -1,
83
+ command: opts.command,
84
+ description: opts.description,
85
+ startedAt: new Date(startMs).toISOString(),
86
+ startMs,
87
+ status: "running",
88
+ exitCode: null,
89
+ stdoutChunks: [],
90
+ stderrChunks: [],
91
+ durationMs: null,
92
+ child,
93
+ onComplete: opts.onComplete,
94
+ };
95
+ child.stdout?.on("data", (chunk) => {
96
+ tracked.stdoutChunks.push(chunk);
97
+ });
98
+ child.stderr?.on("data", (chunk) => {
99
+ tracked.stderrChunks.push(chunk);
100
+ });
101
+ child.on("close", (code) => {
102
+ if (tracked.status === "running") {
103
+ tracked.status = code === 0 ? "completed" : "exited";
104
+ }
105
+ tracked.exitCode = code ?? 1;
106
+ tracked.durationMs = Date.now() - tracked.startMs;
107
+ if (tracked.onComplete) {
108
+ try {
109
+ tracked.onComplete({
110
+ backgroundTaskId: tracked.backgroundTaskId,
111
+ pid: tracked.pid,
112
+ command: tracked.command,
113
+ description: tracked.description,
114
+ status: tracked.status,
115
+ exitCode: tracked.exitCode,
116
+ stdout: Buffer.concat(tracked.stdoutChunks).toString("utf8"),
117
+ stderr: Buffer.concat(tracked.stderrChunks).toString("utf8"),
118
+ durationMs: tracked.durationMs,
119
+ });
120
+ }
121
+ catch {
122
+ // Fire-and-forget — callback errors must not crash.
123
+ }
124
+ }
125
+ });
126
+ child.on("error", () => {
127
+ if (tracked.status === "running") {
128
+ tracked.status = "exited";
129
+ }
130
+ tracked.exitCode = 1;
131
+ tracked.durationMs = Date.now() - tracked.startMs;
132
+ });
133
+ this.processes.set(backgroundTaskId, tracked);
134
+ return this.snapshot(tracked);
135
+ }
136
+ /** Get a snapshot of a tracked process by ID, or undefined. */
137
+ get(backgroundTaskId) {
138
+ const tracked = this.processes.get(backgroundTaskId);
139
+ if (!tracked)
140
+ return undefined;
141
+ return this.snapshot(tracked);
142
+ }
143
+ /** List snapshots of all tracked processes. */
144
+ list() {
145
+ return [...this.processes.values()].map((t) => this.snapshot(t));
146
+ }
147
+ /** Cancel (SIGTERM) a running process. Returns true if found and killed. */
148
+ cancel(backgroundTaskId) {
149
+ const tracked = this.processes.get(backgroundTaskId);
150
+ if (!tracked)
151
+ return false;
152
+ if (tracked.status !== "running")
153
+ return true;
154
+ tracked.status = "cancelled";
155
+ tracked.durationMs = Date.now() - tracked.startMs;
156
+ try {
157
+ tracked.child.kill("SIGTERM");
158
+ }
159
+ catch {
160
+ // Already dead — fine.
161
+ }
162
+ return true;
163
+ }
164
+ /** Kill all running processes. */
165
+ killAll() {
166
+ for (const tracked of this.processes.values()) {
167
+ if (tracked.status === "running") {
168
+ tracked.status = "killed";
169
+ tracked.durationMs = Date.now() - tracked.startMs;
170
+ try {
171
+ tracked.child.kill("SIGTERM");
172
+ }
173
+ catch {
174
+ // Already dead.
175
+ }
176
+ }
177
+ }
178
+ }
179
+ /** Kill all processes and clear tracking state. */
180
+ dispose() {
181
+ this.killAll();
182
+ this.processes.clear();
183
+ }
184
+ // -------------------------------------------------------------------------
185
+ // Internals
186
+ // -------------------------------------------------------------------------
187
+ snapshot(t) {
188
+ return {
189
+ backgroundTaskId: t.backgroundTaskId,
190
+ pid: t.pid,
191
+ command: t.command,
192
+ description: t.description,
193
+ startedAt: t.startedAt,
194
+ status: t.status,
195
+ exitCode: t.exitCode,
196
+ stdout: Buffer.concat(t.stdoutChunks).toString("utf8"),
197
+ stderr: Buffer.concat(t.stderrChunks).toString("utf8"),
198
+ durationMs: t.durationMs,
199
+ };
200
+ }
201
+ }
202
+ exports.BackgroundProcessRegistry = BackgroundProcessRegistry;
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Claude Code JSONL session file parser for cost data collection.
3
+ *
4
+ * Parses Claude Code session JSONL files (main session and subagent files)
5
+ * to extract token usage data and compute costs. Each assistant message with
6
+ * a `usage` block becomes a {@link CostEventData} entry.
7
+ *
8
+ * JSONL format (one JSON object per line):
9
+ * ```json
10
+ * {
11
+ * "type": "assistant",
12
+ * "message": {
13
+ * "model": "claude-opus-4-6",
14
+ * "usage": {
15
+ * "input_tokens": 3,
16
+ * "cache_creation_input_tokens": 26928,
17
+ * "cache_read_input_tokens": 0,
18
+ * "cache_creation": { "ephemeral_5m_input_tokens": 0, "ephemeral_1h_input_tokens": 26928 },
19
+ * "output_tokens": 28,
20
+ * "service_tier": "standard"
21
+ * }
22
+ * },
23
+ * "timestamp": "2026-04-05T..."
24
+ * }
25
+ * ```
26
+ */
27
+ import type { CostEventData, ModelCostStats } from "./types";
28
+ /**
29
+ * Parse a single Claude Code session JSONL file into cost events.
30
+ *
31
+ * Reads the file, splits by newline, and for each line that represents an
32
+ * assistant message with usage data, extracts token counts and computes
33
+ * the USD cost using the extended pricing model.
34
+ *
35
+ * @param sessionJsonlPath - Absolute path to the `.jsonl` file.
36
+ * @returns Array of cost events extracted from assistant messages.
37
+ */
38
+ export declare function parseClaudeCodeSession(sessionJsonlPath: string): Promise<CostEventData[]>;
39
+ /**
40
+ * Parse a Claude Code session JSONL file and all associated subagent files.
41
+ *
42
+ * Subagent files live at `<sessionDir>/subagents/agent-*.jsonl` where
43
+ * `<sessionDir>` is derived by stripping the `.jsonl` extension from the
44
+ * main session file path.
45
+ *
46
+ * @param sessionJsonlPath - Absolute path to the main session `.jsonl` file.
47
+ * @returns Merged array of cost events from the main session and all subagents.
48
+ */
49
+ export declare function parseClaudeCodeSessionWithSubagents(sessionJsonlPath: string): Promise<CostEventData[]>;
50
+ /** Aggregated usage summary returned by {@link aggregateUsageData}. */
51
+ export interface AggregatedUsage {
52
+ /** Total number of cost events. */
53
+ eventCount: number;
54
+ /** Total base input tokens across all events. */
55
+ totalInputTokens: number;
56
+ /** Total output tokens across all events. */
57
+ totalOutputTokens: number;
58
+ /** Total cache-creation tokens (top-level) across all events. */
59
+ totalCacheCreationTokens: number;
60
+ /** Total cache-read tokens across all events. */
61
+ totalCacheReadTokens: number;
62
+ /** Total 5-minute cache-creation tokens. */
63
+ totalCacheCreation5mTokens: number;
64
+ /** Total 1-hour cache-creation tokens. */
65
+ totalCacheCreation1hTokens: number;
66
+ /** Total computed cost in USD. */
67
+ totalCostUsd: number;
68
+ /** Per-model breakdown of usage statistics. */
69
+ byModel: Record<string, ModelCostStats>;
70
+ }
71
+ /**
72
+ * Aggregate usage data across an array of cost events.
73
+ *
74
+ * Sums token counts and costs, producing both overall totals and a
75
+ * per-model breakdown.
76
+ *
77
+ * @param events - Array of cost events (e.g. from {@link parseClaudeCodeSessionWithSubagents}).
78
+ * @returns Aggregated usage summary with per-model breakdown.
79
+ */
80
+ export declare function aggregateUsageData(events: CostEventData[]): AggregatedUsage;
81
+ //# sourceMappingURL=claudeCodeParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claudeCodeParser.d.ts","sourceRoot":"","sources":["../../src/cost/claudeCodeParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAqC7D;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,aAAa,EAAE,CAAC,CA+D1B;AAMD;;;;;;;;;GASG;AACH,wBAAsB,mCAAmC,CACvD,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,aAAa,EAAE,CAAC,CA+B1B;AAMD,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,gBAAgB,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,wBAAwB,EAAE,MAAM,CAAC;IACjC,iDAAiD;IACjD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,4CAA4C;IAC5C,0BAA0B,EAAE,MAAM,CAAC;IACnC,0CAA0C;IAC1C,0BAA0B,EAAE,MAAM,CAAC;IACnC,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACzC;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,eAAe,CAqD3E"}