@a5c-ai/genty-runtime 5.1.1-staging.0007199a1cb2

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 (233) 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 +170 -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/rpc/index.d.ts +5 -0
  132. package/dist/rpc/index.d.ts.map +1 -0
  133. package/dist/rpc/index.js +7 -0
  134. package/dist/rpc/server.d.ts +13 -0
  135. package/dist/rpc/server.d.ts.map +1 -0
  136. package/dist/rpc/server.js +64 -0
  137. package/dist/rpc/server.test.d.ts +2 -0
  138. package/dist/rpc/server.test.d.ts.map +1 -0
  139. package/dist/rpc/server.test.js +35 -0
  140. package/dist/rpc/types.d.ts +23 -0
  141. package/dist/rpc/types.d.ts.map +1 -0
  142. package/dist/rpc/types.js +20 -0
  143. package/dist/session/context.d.ts +22 -0
  144. package/dist/session/context.d.ts.map +1 -0
  145. package/dist/session/context.js +113 -0
  146. package/dist/session/continuityState.d.ts +39 -0
  147. package/dist/session/continuityState.d.ts.map +1 -0
  148. package/dist/session/continuityState.js +164 -0
  149. package/dist/session/cost.d.ts +63 -0
  150. package/dist/session/cost.d.ts.map +1 -0
  151. package/dist/session/cost.js +194 -0
  152. package/dist/session/discovery.d.ts +24 -0
  153. package/dist/session/discovery.d.ts.map +1 -0
  154. package/dist/session/discovery.js +43 -0
  155. package/dist/session/export.d.ts +4 -0
  156. package/dist/session/export.d.ts.map +1 -0
  157. package/dist/session/export.js +56 -0
  158. package/dist/session/export.test.d.ts +2 -0
  159. package/dist/session/export.test.d.ts.map +1 -0
  160. package/dist/session/export.test.js +42 -0
  161. package/dist/session/history.d.ts +30 -0
  162. package/dist/session/history.d.ts.map +1 -0
  163. package/dist/session/history.js +143 -0
  164. package/dist/session/index.d.ts +20 -0
  165. package/dist/session/index.d.ts.map +1 -0
  166. package/dist/session/index.js +78 -0
  167. package/dist/session/memoryExtraction.d.ts +65 -0
  168. package/dist/session/memoryExtraction.d.ts.map +1 -0
  169. package/dist/session/memoryExtraction.js +201 -0
  170. package/dist/session/parse.d.ts +45 -0
  171. package/dist/session/parse.d.ts.map +1 -0
  172. package/dist/session/parse.js +170 -0
  173. package/dist/session/persistence.d.ts +46 -0
  174. package/dist/session/persistence.d.ts.map +1 -0
  175. package/dist/session/persistence.js +180 -0
  176. package/dist/session/rewind.d.ts +45 -0
  177. package/dist/session/rewind.d.ts.map +1 -0
  178. package/dist/session/rewind.js +68 -0
  179. package/dist/session/rewind.test.d.ts +2 -0
  180. package/dist/session/rewind.test.d.ts.map +1 -0
  181. package/dist/session/rewind.test.js +96 -0
  182. package/dist/session/tree.d.ts +29 -0
  183. package/dist/session/tree.d.ts.map +1 -0
  184. package/dist/session/tree.js +115 -0
  185. package/dist/session/tree.test.d.ts +2 -0
  186. package/dist/session/tree.test.d.ts.map +1 -0
  187. package/dist/session/tree.test.js +75 -0
  188. package/dist/session/types.d.ts +267 -0
  189. package/dist/session/types.d.ts.map +1 -0
  190. package/dist/session/types.js +45 -0
  191. package/dist/session/write.d.ts +61 -0
  192. package/dist/session/write.d.ts.map +1 -0
  193. package/dist/session/write.js +213 -0
  194. package/dist/shellInvocation.d.ts +6 -0
  195. package/dist/shellInvocation.d.ts.map +1 -0
  196. package/dist/shellInvocation.js +8 -0
  197. package/dist/shellInvocation.test.d.ts +2 -0
  198. package/dist/shellInvocation.test.d.ts.map +1 -0
  199. package/dist/shellInvocation.test.js +18 -0
  200. package/dist/storage/journal.d.ts +17 -0
  201. package/dist/storage/journal.d.ts.map +1 -0
  202. package/dist/storage/journal.js +165 -0
  203. package/dist/storage/runFiles.d.ts +10 -0
  204. package/dist/storage/runFiles.d.ts.map +1 -0
  205. package/dist/storage/runFiles.js +54 -0
  206. package/dist/telemetry/audit-log.d.ts +56 -0
  207. package/dist/telemetry/audit-log.d.ts.map +1 -0
  208. package/dist/telemetry/audit-log.js +59 -0
  209. package/dist/telemetry/exporters.d.ts +35 -0
  210. package/dist/telemetry/exporters.d.ts.map +1 -0
  211. package/dist/telemetry/exporters.js +141 -0
  212. package/dist/telemetry/index.d.ts +12 -0
  213. package/dist/telemetry/index.d.ts.map +1 -0
  214. package/dist/telemetry/index.js +25 -0
  215. package/dist/telemetry/provider.d.ts +57 -0
  216. package/dist/telemetry/provider.d.ts.map +1 -0
  217. package/dist/telemetry/provider.js +261 -0
  218. package/dist/telemetry/span-tree.d.ts +46 -0
  219. package/dist/telemetry/span-tree.d.ts.map +1 -0
  220. package/dist/telemetry/span-tree.js +93 -0
  221. package/dist/telemetry/traceContext.d.ts +10 -0
  222. package/dist/telemetry/traceContext.d.ts.map +1 -0
  223. package/dist/telemetry/traceContext.js +43 -0
  224. package/dist/telemetry/types.d.ts +109 -0
  225. package/dist/telemetry/types.d.ts.map +1 -0
  226. package/dist/telemetry/types.js +21 -0
  227. package/dist/types/sdk.d.ts +66 -0
  228. package/dist/types/sdk.d.ts.map +1 -0
  229. package/dist/types/sdk.js +9 -0
  230. package/dist/utils/ulid.d.ts +11 -0
  231. package/dist/utils/ulid.d.ts.map +1 -0
  232. package/dist/utils/ulid.js +62 -0
  233. package/package.json +137 -0
@@ -0,0 +1,41 @@
1
+ import type { TriggerEvent } from "./types";
2
+ export type DurableTriggerState = "pending" | "running" | "succeeded" | "failed" | "dead-letter";
3
+ export interface DurableTriggerQueueOptions {
4
+ maxAttempts?: number;
5
+ baseBackoffMs?: number;
6
+ now?: () => number;
7
+ }
8
+ export interface DurableTriggerRecord {
9
+ id: string;
10
+ trigger: TriggerEvent;
11
+ state: DurableTriggerState;
12
+ attempts: number;
13
+ enqueuedAt: string;
14
+ updatedAt: string;
15
+ nextAttemptAt?: string;
16
+ ackedAt?: string;
17
+ lastError?: string;
18
+ }
19
+ export declare class DurableTriggerQueue {
20
+ private readonly filePath;
21
+ private readonly maxAttempts;
22
+ private readonly baseBackoffMs;
23
+ private readonly now;
24
+ private events;
25
+ private writeChain;
26
+ private constructor();
27
+ static open(daemonDir: string, options?: DurableTriggerQueueOptions): Promise<DurableTriggerQueue>;
28
+ enqueue(trigger: TriggerEvent): Promise<DurableTriggerRecord>;
29
+ claimDue(limit?: number): Promise<DurableTriggerRecord[]>;
30
+ ack(id: string): Promise<void>;
31
+ fail(id: string, error: unknown): Promise<void>;
32
+ snapshot(): Promise<DurableTriggerRecord[]>;
33
+ counts(): {
34
+ active: number;
35
+ pending: number;
36
+ deadLetter: number;
37
+ };
38
+ private load;
39
+ private persist;
40
+ }
41
+ //# sourceMappingURL=durableQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durableQueue.d.ts","sourceRoot":"","sources":["../../src/daemon/durableQueue.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEjG,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,UAAU,CAAqB;IAEvC,OAAO;WAOM,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMlG,OAAO,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAe7D,QAAQ,CAAC,KAAK,SAA2B,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAmB3E,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9B,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/C,QAAQ,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAIjD,MAAM,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;YAQnD,IAAI;YAiBJ,OAAO;CAUtB"}
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DurableTriggerQueue = void 0;
37
+ const node_crypto_1 = require("node:crypto");
38
+ const node_fs_1 = require("node:fs");
39
+ const path = __importStar(require("node:path"));
40
+ const QUEUE_FILE = "trigger-queue.json";
41
+ class DurableTriggerQueue {
42
+ filePath;
43
+ maxAttempts;
44
+ baseBackoffMs;
45
+ now;
46
+ events = [];
47
+ writeChain = Promise.resolve();
48
+ constructor(daemonDir, options) {
49
+ this.filePath = path.join(daemonDir, QUEUE_FILE);
50
+ this.maxAttempts = options?.maxAttempts ?? 3;
51
+ this.baseBackoffMs = options?.baseBackoffMs ?? 1_000;
52
+ this.now = options?.now ?? Date.now;
53
+ }
54
+ static async open(daemonDir, options) {
55
+ const queue = new DurableTriggerQueue(daemonDir, options);
56
+ await queue.load();
57
+ return queue;
58
+ }
59
+ async enqueue(trigger) {
60
+ const timestamp = new Date(this.now()).toISOString();
61
+ const record = {
62
+ id: (0, node_crypto_1.randomUUID)(),
63
+ trigger: redactTrigger(trigger),
64
+ state: "pending",
65
+ attempts: 0,
66
+ enqueuedAt: timestamp,
67
+ updatedAt: timestamp,
68
+ };
69
+ this.events.push(record);
70
+ await this.persist();
71
+ return { ...record };
72
+ }
73
+ async claimDue(limit = Number.POSITIVE_INFINITY) {
74
+ const now = this.now;
75
+ const timestamp = new Date(now()).toISOString();
76
+ const claimed = [];
77
+ for (const event of this.events) {
78
+ if (claimed.length >= limit)
79
+ break;
80
+ if (event.state !== "pending" && event.state !== "failed")
81
+ continue;
82
+ if (event.nextAttemptAt && Date.parse(event.nextAttemptAt) > now())
83
+ continue;
84
+ event.state = "running";
85
+ event.attempts += 1;
86
+ event.updatedAt = timestamp;
87
+ claimed.push({ ...event, trigger: cloneTrigger(event.trigger) });
88
+ }
89
+ if (claimed.length > 0) {
90
+ await this.persist();
91
+ }
92
+ return claimed;
93
+ }
94
+ async ack(id) {
95
+ const event = this.events.find((item) => item.id === id);
96
+ if (!event)
97
+ return;
98
+ const timestamp = new Date(this.now()).toISOString();
99
+ event.state = "succeeded";
100
+ event.ackedAt = timestamp;
101
+ event.updatedAt = timestamp;
102
+ await this.persist();
103
+ }
104
+ async fail(id, error) {
105
+ const event = this.events.find((item) => item.id === id);
106
+ if (!event || event.state === "succeeded")
107
+ return;
108
+ const timestamp = new Date(this.now()).toISOString();
109
+ event.lastError = error instanceof Error ? error.message : String(error);
110
+ event.updatedAt = timestamp;
111
+ if (event.attempts >= this.maxAttempts) {
112
+ event.state = "dead-letter";
113
+ delete event.nextAttemptAt;
114
+ }
115
+ else {
116
+ event.state = "failed";
117
+ const delay = this.baseBackoffMs * Math.max(1, 2 ** Math.max(0, event.attempts - 1));
118
+ event.nextAttemptAt = new Date(this.now() + delay).toISOString();
119
+ }
120
+ await this.persist();
121
+ }
122
+ async snapshot() {
123
+ return this.events.map((event) => ({ ...event, trigger: cloneTrigger(event.trigger) }));
124
+ }
125
+ counts() {
126
+ return {
127
+ active: this.events.filter((event) => event.state === "running").length,
128
+ pending: this.events.filter((event) => event.state === "pending" || event.state === "failed").length,
129
+ deadLetter: this.events.filter((event) => event.state === "dead-letter").length,
130
+ };
131
+ }
132
+ async load() {
133
+ try {
134
+ const raw = await node_fs_1.promises.readFile(this.filePath, "utf-8");
135
+ const parsed = JSON.parse(raw);
136
+ this.events = (parsed.events ?? []).map((event) => ({
137
+ ...event,
138
+ state: event.state === "running" ? "pending" : event.state,
139
+ trigger: cloneTrigger(event.trigger),
140
+ }));
141
+ if (this.events.some((event) => event.state === "pending" && event.updatedAt)) {
142
+ await this.persist();
143
+ }
144
+ }
145
+ catch {
146
+ this.events = [];
147
+ }
148
+ }
149
+ async persist() {
150
+ const content = JSON.stringify({ version: 1, events: this.events }, null, 2);
151
+ this.writeChain = this.writeChain.then(async () => {
152
+ await node_fs_1.promises.mkdir(path.dirname(this.filePath), { recursive: true });
153
+ const tmpPath = `${this.filePath}.tmp-${process.pid}-${Date.now()}`;
154
+ await node_fs_1.promises.writeFile(tmpPath, content, "utf-8");
155
+ await node_fs_1.promises.rename(tmpPath, this.filePath);
156
+ });
157
+ await this.writeChain;
158
+ }
159
+ }
160
+ exports.DurableTriggerQueue = DurableTriggerQueue;
161
+ function cloneTrigger(trigger) {
162
+ return JSON.parse(JSON.stringify(trigger));
163
+ }
164
+ const SECRET_KEY_PATTERN = /(secret|token|api[-_]?key|authorization|password|credential|private[-_]?key)/i;
165
+ function redactTrigger(trigger) {
166
+ return redactValue(cloneTrigger(trigger), "");
167
+ }
168
+ function redactValue(value, key) {
169
+ if (SECRET_KEY_PATTERN.test(key)) {
170
+ return "[REDACTED]";
171
+ }
172
+ if (Array.isArray(value)) {
173
+ return value.map((item) => redactValue(item, ""));
174
+ }
175
+ if (value && typeof value === "object") {
176
+ const result = {};
177
+ for (const [childKey, childValue] of Object.entries(value)) {
178
+ result[childKey] = redactValue(childValue, childKey);
179
+ }
180
+ return result;
181
+ }
182
+ return value;
183
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * GAP-REMOTE-001: File Watcher — debounced fs.watch trigger.
3
+ *
4
+ * Watches directories for file changes matching glob patterns,
5
+ * firing trigger callbacks with configurable debounce.
6
+ */
7
+ import type { FileTriggerConfig, FileWatcherHandle, TriggerCallback } from "./types";
8
+ export declare function createFileWatcher(triggers: FileTriggerConfig[], onTrigger: TriggerCallback): FileWatcherHandle;
9
+ //# sourceMappingURL=fileWatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileWatcher.d.ts","sourceRoot":"","sources":["../../src/daemon/fileWatcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAoDrF,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,SAAS,EAAE,eAAe,GACzB,iBAAiB,CAgEnB"}
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ /**
3
+ * GAP-REMOTE-001: File Watcher — debounced fs.watch trigger.
4
+ *
5
+ * Watches directories for file changes matching glob patterns,
6
+ * firing trigger callbacks with configurable debounce.
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.createFileWatcher = createFileWatcher;
43
+ const fsSync = __importStar(require("node:fs"));
44
+ const path = __importStar(require("node:path"));
45
+ const DEFAULT_DEBOUNCE_MS = 500;
46
+ /**
47
+ * Extract the extension pattern from a glob (e.g., "**\/*.ts" -> ".ts").
48
+ * Returns null if no extension can be extracted.
49
+ */
50
+ function extractExtension(pattern) {
51
+ const normalized = pattern.replace(/\\/g, "/");
52
+ // Match patterns like **/*.ts, **/*.test.ts, *.js
53
+ const match = normalized.match(/\*(\.[a-zA-Z0-9.]+)$/);
54
+ return match ? match[1] : null;
55
+ }
56
+ /**
57
+ * Check if a filename matches the pattern's file extension filter.
58
+ * This is a simplified matcher that works with common glob patterns like:
59
+ * - path/to/**\/*.ts -> matches any .ts file under path/to/
60
+ * - path/to/**\/*.test.ts -> matches any .test.ts file under path/to/
61
+ */
62
+ function matchesExtension(filename, pattern) {
63
+ const ext = extractExtension(pattern);
64
+ if (!ext)
65
+ return true; // No extension filter = match all
66
+ return filename.endsWith(ext);
67
+ }
68
+ /**
69
+ * Extract the base directory from a glob pattern (everything before the first glob segment).
70
+ */
71
+ function getWatchDir(pattern) {
72
+ const normalized = pattern.replace(/\\/g, "/");
73
+ const parts = normalized.split("/");
74
+ const dirParts = [];
75
+ for (const part of parts) {
76
+ if (part.includes("*") || part.includes("?") || part.includes("{")) {
77
+ break;
78
+ }
79
+ dirParts.push(part);
80
+ }
81
+ return dirParts.join(path.sep) || ".";
82
+ }
83
+ function createFileWatcher(triggers, onTrigger) {
84
+ const entries = [];
85
+ let disposed = false;
86
+ for (const trigger of triggers) {
87
+ const watchDir = getWatchDir(trigger.pattern);
88
+ const debounceMs = trigger.debounceMs ?? DEFAULT_DEBOUNCE_MS;
89
+ const entry = {
90
+ trigger,
91
+ watcher: null,
92
+ debounceTimer: null,
93
+ lastPath: null,
94
+ };
95
+ try {
96
+ entry.watcher = fsSync.watch(watchDir, { recursive: true }, (_eventType, filename) => {
97
+ if (disposed || !filename)
98
+ return;
99
+ if (!matchesExtension(filename, trigger.pattern))
100
+ return;
101
+ entry.lastPath = path.resolve(watchDir, filename.toString());
102
+ // Debounce: clear previous timer and set a new one
103
+ if (entry.debounceTimer) {
104
+ clearTimeout(entry.debounceTimer);
105
+ }
106
+ entry.debounceTimer = setTimeout(() => {
107
+ if (disposed)
108
+ return;
109
+ void onTrigger({
110
+ type: "file",
111
+ processId: trigger.processId,
112
+ entrypoint: trigger.entrypoint,
113
+ inputs: entry.lastPath ? { path: entry.lastPath } : undefined,
114
+ });
115
+ }, debounceMs);
116
+ });
117
+ entry.watcher.on("error", () => {
118
+ if (entry.watcher) {
119
+ entry.watcher.close();
120
+ entry.watcher = null;
121
+ }
122
+ });
123
+ }
124
+ catch {
125
+ // Watch dir doesn't exist yet — skip
126
+ }
127
+ entries.push(entry);
128
+ }
129
+ return {
130
+ dispose() {
131
+ disposed = true;
132
+ for (const entry of entries) {
133
+ if (entry.debounceTimer) {
134
+ clearTimeout(entry.debounceTimer);
135
+ entry.debounceTimer = null;
136
+ }
137
+ if (entry.watcher) {
138
+ entry.watcher.close();
139
+ entry.watcher = null;
140
+ }
141
+ }
142
+ },
143
+ };
144
+ }
@@ -0,0 +1,15 @@
1
+ export { startDaemon, stopDaemon, getDaemonStatus, watchDaemon } from "./lifecycle";
2
+ export { loadDaemonConfig, writeDaemonConfig } from "./config";
3
+ export { createFileWatcher } from "./fileWatcher";
4
+ export { createWebhookListener } from "./webhookListener";
5
+ export { createTimerScheduler } from "./timerScheduler";
6
+ export { runDaemonLoop, readDaemonLoopStatus } from "./loop";
7
+ export { appendDaemonLog, readDaemonLog } from "./daemonLog";
8
+ export { DurableTriggerQueue } from "./durableQueue";
9
+ export type { DaemonConfig, DaemonStartOptions, DaemonStartOutput, DaemonStopOptions, DaemonStopOutput, DaemonStatusOptions, DaemonStatusOutput, DaemonWatchdogOptions, DaemonWatchdogOutput, DaemonMetadata, TriggerConfig, TriggerEvent, FileTriggerEvent, AutomationTriggerEvent, FileTriggerConfig, FileWatcherHandle, WebhookListenerOptions, WebhookListenerHandle, TriggerCallback, TriggerAdmissionConfig, TriggerAdmissionResult, TriggerAdmissionStatus, TriggerRateLimitConfig, } from "./types";
10
+ export type { TimerSchedulerHandle } from "./timerScheduler";
11
+ export type { DaemonLoopOptions, DaemonLoopStatus } from "./loop";
12
+ export type { DaemonLogEntry, DaemonLogLevel, DaemonLogPolicy } from "./daemonLog";
13
+ export type { DurableTriggerQueueOptions, DurableTriggerRecord, DurableTriggerState, } from "./durableQueue";
14
+ export type { ApiResult } from "../apiResult";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAClE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnF,YAAY,EACV,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DurableTriggerQueue = exports.readDaemonLog = exports.appendDaemonLog = exports.readDaemonLoopStatus = exports.runDaemonLoop = exports.createTimerScheduler = exports.createWebhookListener = exports.createFileWatcher = exports.writeDaemonConfig = exports.loadDaemonConfig = exports.watchDaemon = exports.getDaemonStatus = exports.stopDaemon = exports.startDaemon = void 0;
4
+ var lifecycle_1 = require("./lifecycle");
5
+ Object.defineProperty(exports, "startDaemon", { enumerable: true, get: function () { return lifecycle_1.startDaemon; } });
6
+ Object.defineProperty(exports, "stopDaemon", { enumerable: true, get: function () { return lifecycle_1.stopDaemon; } });
7
+ Object.defineProperty(exports, "getDaemonStatus", { enumerable: true, get: function () { return lifecycle_1.getDaemonStatus; } });
8
+ Object.defineProperty(exports, "watchDaemon", { enumerable: true, get: function () { return lifecycle_1.watchDaemon; } });
9
+ var config_1 = require("./config");
10
+ Object.defineProperty(exports, "loadDaemonConfig", { enumerable: true, get: function () { return config_1.loadDaemonConfig; } });
11
+ Object.defineProperty(exports, "writeDaemonConfig", { enumerable: true, get: function () { return config_1.writeDaemonConfig; } });
12
+ var fileWatcher_1 = require("./fileWatcher");
13
+ Object.defineProperty(exports, "createFileWatcher", { enumerable: true, get: function () { return fileWatcher_1.createFileWatcher; } });
14
+ var webhookListener_1 = require("./webhookListener");
15
+ Object.defineProperty(exports, "createWebhookListener", { enumerable: true, get: function () { return webhookListener_1.createWebhookListener; } });
16
+ var timerScheduler_1 = require("./timerScheduler");
17
+ Object.defineProperty(exports, "createTimerScheduler", { enumerable: true, get: function () { return timerScheduler_1.createTimerScheduler; } });
18
+ var loop_1 = require("./loop");
19
+ Object.defineProperty(exports, "runDaemonLoop", { enumerable: true, get: function () { return loop_1.runDaemonLoop; } });
20
+ Object.defineProperty(exports, "readDaemonLoopStatus", { enumerable: true, get: function () { return loop_1.readDaemonLoopStatus; } });
21
+ var daemonLog_1 = require("./daemonLog");
22
+ Object.defineProperty(exports, "appendDaemonLog", { enumerable: true, get: function () { return daemonLog_1.appendDaemonLog; } });
23
+ Object.defineProperty(exports, "readDaemonLog", { enumerable: true, get: function () { return daemonLog_1.readDaemonLog; } });
24
+ var durableQueue_1 = require("./durableQueue");
25
+ Object.defineProperty(exports, "DurableTriggerQueue", { enumerable: true, get: function () { return durableQueue_1.DurableTriggerQueue; } });
@@ -0,0 +1,13 @@
1
+ /**
2
+ * GAP-REMOTE-001: Daemon Lifecycle — start/stop/status management.
3
+ *
4
+ * In foreground mode, the daemon runs in the current process (for dev/debug).
5
+ * In background mode, it spawns a detached child process.
6
+ */
7
+ import type { ApiResult } from "../apiResult";
8
+ import type { DaemonStartOptions, DaemonStartOutput, DaemonStopOptions, DaemonStopOutput, DaemonStatusOptions, DaemonStatusOutput, DaemonWatchdogOptions, DaemonWatchdogOutput } from "./types";
9
+ export declare function startDaemon(options: DaemonStartOptions): Promise<ApiResult<DaemonStartOutput>>;
10
+ export declare function stopDaemon(options: DaemonStopOptions): Promise<ApiResult<DaemonStopOutput>>;
11
+ export declare function getDaemonStatus(options: DaemonStatusOptions): Promise<ApiResult<DaemonStatusOutput>>;
12
+ export declare function watchDaemon(options: DaemonWatchdogOptions): Promise<ApiResult<DaemonWatchdogOutput>>;
13
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/daemon/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAElB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,SAAS,CAAC;AAyDjB,wBAAsB,WAAW,CAC/B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAoEvC;AAID,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAwEtC;AAID,wBAAsB,eAAe,CACnC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAoCxC;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAoD1C"}