@mclawnet/scheduler 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/__tests__/executor-oneshot.test.d.ts +2 -0
  2. package/dist/__tests__/executor-oneshot.test.d.ts.map +1 -0
  3. package/dist/__tests__/executor-oneshot.test.js +141 -0
  4. package/dist/__tests__/executor-oneshot.test.js.map +1 -0
  5. package/dist/__tests__/executor-swarm.test.d.ts +2 -0
  6. package/dist/__tests__/executor-swarm.test.d.ts.map +1 -0
  7. package/dist/__tests__/executor-swarm.test.js +142 -0
  8. package/dist/__tests__/executor-swarm.test.js.map +1 -0
  9. package/dist/__tests__/json-schedule-repository-prompt-cap.test.d.ts +2 -0
  10. package/dist/__tests__/json-schedule-repository-prompt-cap.test.d.ts.map +1 -0
  11. package/dist/__tests__/json-schedule-repository-prompt-cap.test.js +64 -0
  12. package/dist/__tests__/json-schedule-repository-prompt-cap.test.js.map +1 -0
  13. package/dist/__tests__/json-schedule-repository.test.d.ts +2 -0
  14. package/dist/__tests__/json-schedule-repository.test.d.ts.map +1 -0
  15. package/dist/__tests__/json-schedule-repository.test.js +178 -0
  16. package/dist/__tests__/json-schedule-repository.test.js.map +1 -0
  17. package/dist/__tests__/paths.test.d.ts +2 -0
  18. package/dist/__tests__/paths.test.d.ts.map +1 -0
  19. package/dist/__tests__/paths.test.js +19 -0
  20. package/dist/__tests__/paths.test.js.map +1 -0
  21. package/dist/__tests__/scheduler-maxrun-cap.test.d.ts +2 -0
  22. package/dist/__tests__/scheduler-maxrun-cap.test.d.ts.map +1 -0
  23. package/dist/__tests__/scheduler-maxrun-cap.test.js +109 -0
  24. package/dist/__tests__/scheduler-maxrun-cap.test.js.map +1 -0
  25. package/dist/__tests__/scheduler-service-events-typed.test.d.ts +2 -0
  26. package/dist/__tests__/scheduler-service-events-typed.test.d.ts.map +1 -0
  27. package/dist/__tests__/scheduler-service-events-typed.test.js +27 -0
  28. package/dist/__tests__/scheduler-service-events-typed.test.js.map +1 -0
  29. package/dist/__tests__/scheduler-service-register.test.d.ts +2 -0
  30. package/dist/__tests__/scheduler-service-register.test.d.ts.map +1 -0
  31. package/dist/__tests__/scheduler-service-register.test.js +54 -0
  32. package/dist/__tests__/scheduler-service-register.test.js.map +1 -0
  33. package/dist/__tests__/scheduler-service-tick-23.test.d.ts +2 -0
  34. package/dist/__tests__/scheduler-service-tick-23.test.d.ts.map +1 -0
  35. package/dist/__tests__/scheduler-service-tick-23.test.js +72 -0
  36. package/dist/__tests__/scheduler-service-tick-23.test.js.map +1 -0
  37. package/dist/__tests__/scheduler-service-tick-24.test.d.ts +2 -0
  38. package/dist/__tests__/scheduler-service-tick-24.test.d.ts.map +1 -0
  39. package/dist/__tests__/scheduler-service-tick-24.test.js +80 -0
  40. package/dist/__tests__/scheduler-service-tick-24.test.js.map +1 -0
  41. package/dist/__tests__/scheduler-service-tick-25.test.d.ts +2 -0
  42. package/dist/__tests__/scheduler-service-tick-25.test.d.ts.map +1 -0
  43. package/dist/__tests__/scheduler-service-tick-25.test.js +111 -0
  44. package/dist/__tests__/scheduler-service-tick-25.test.js.map +1 -0
  45. package/dist/__tests__/scheduler-service-tick-26.test.d.ts +2 -0
  46. package/dist/__tests__/scheduler-service-tick-26.test.d.ts.map +1 -0
  47. package/dist/__tests__/scheduler-service-tick-26.test.js +97 -0
  48. package/dist/__tests__/scheduler-service-tick-26.test.js.map +1 -0
  49. package/dist/__tests__/scheduler-service-tick-27.test.d.ts +2 -0
  50. package/dist/__tests__/scheduler-service-tick-27.test.d.ts.map +1 -0
  51. package/dist/__tests__/scheduler-service-tick-27.test.js +69 -0
  52. package/dist/__tests__/scheduler-service-tick-27.test.js.map +1 -0
  53. package/dist/__tests__/scheduler-service-tick-coalesce.test.d.ts +2 -0
  54. package/dist/__tests__/scheduler-service-tick-coalesce.test.d.ts.map +1 -0
  55. package/dist/__tests__/scheduler-service-tick-coalesce.test.js +119 -0
  56. package/dist/__tests__/scheduler-service-tick-coalesce.test.js.map +1 -0
  57. package/dist/__tests__/scheduler-service-trigger-gating.test.d.ts +2 -0
  58. package/dist/__tests__/scheduler-service-trigger-gating.test.d.ts.map +1 -0
  59. package/dist/__tests__/scheduler-service-trigger-gating.test.js +55 -0
  60. package/dist/__tests__/scheduler-service-trigger-gating.test.js.map +1 -0
  61. package/dist/__tests__/tick-helpers.d.ts +17 -0
  62. package/dist/__tests__/tick-helpers.d.ts.map +1 -0
  63. package/dist/__tests__/tick-helpers.js +97 -0
  64. package/dist/__tests__/tick-helpers.js.map +1 -0
  65. package/dist/executor.d.ts +20 -0
  66. package/dist/executor.d.ts.map +1 -0
  67. package/dist/executor.js +2 -0
  68. package/dist/executor.js.map +1 -0
  69. package/dist/executors/oneshot.d.ts +22 -0
  70. package/dist/executors/oneshot.d.ts.map +1 -0
  71. package/dist/executors/oneshot.js +55 -0
  72. package/dist/executors/oneshot.js.map +1 -0
  73. package/dist/executors/swarm.d.ts +26 -0
  74. package/dist/executors/swarm.d.ts.map +1 -0
  75. package/dist/executors/swarm.js +40 -0
  76. package/dist/executors/swarm.js.map +1 -0
  77. package/dist/index.d.ts +11 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +8 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/json-schedule-repository.d.ts +39 -0
  82. package/dist/json-schedule-repository.d.ts.map +1 -0
  83. package/dist/json-schedule-repository.js +374 -0
  84. package/dist/json-schedule-repository.js.map +1 -0
  85. package/dist/paths.d.ts +7 -0
  86. package/dist/paths.d.ts.map +1 -0
  87. package/dist/paths.js +22 -0
  88. package/dist/paths.js.map +1 -0
  89. package/dist/scheduler-service.d.ts +71 -0
  90. package/dist/scheduler-service.d.ts.map +1 -0
  91. package/dist/scheduler-service.js +395 -0
  92. package/dist/scheduler-service.js.map +1 -0
  93. package/dist/types.d.ts +92 -0
  94. package/dist/types.d.ts.map +1 -0
  95. package/dist/types.js +8 -0
  96. package/dist/types.js.map +1 -0
  97. package/package.json +36 -0
@@ -0,0 +1,55 @@
1
+ /**
2
+ * OneShot executor: invokes `claude -p` (or any compatible spawnFn) with the
3
+ * scheduled prompt and returns the resulting exit code + summary text. The
4
+ * spawnFn abstraction keeps this module decoupled from a real child_process
5
+ * implementation so it can be unit-tested in isolation and swapped at the
6
+ * runtime layer (Phase 6).
7
+ */
8
+ export function createOneShotExecutor(spawnFn) {
9
+ return {
10
+ mode: "oneshot",
11
+ async execute(ctx) {
12
+ const cfg = ctx.schedule.launchConfig;
13
+ const args = [
14
+ "-p",
15
+ cfg.prompt,
16
+ "--output-format",
17
+ "stream-json",
18
+ "--verbose",
19
+ "--max-turns",
20
+ String(cfg.oneshot?.maxTurns ?? 10),
21
+ "--no-session-persistence",
22
+ ];
23
+ if (cfg.oneshot?.skipPermissions) {
24
+ args.push("--dangerously-skip-permissions");
25
+ }
26
+ if (cfg.oneshot?.model) {
27
+ args.push("--model", cfg.oneshot.model);
28
+ }
29
+ if (cfg.oneshot?.allowedTools && cfg.oneshot.allowedTools.length > 0) {
30
+ args.push("--allowed-tools", cfg.oneshot.allowedTools.join(","));
31
+ }
32
+ try {
33
+ const r = await spawnFn(args, {
34
+ cwd: ctx.schedule.workDir,
35
+ env: process.env,
36
+ signal: ctx.signal,
37
+ });
38
+ ctx.onStdout(r.stdout);
39
+ ctx.onStderr(r.stderr);
40
+ return {
41
+ exitCode: r.exitCode,
42
+ summary: r.lastAssistantText,
43
+ error: r.exitCode !== 0 ? `process exited ${r.exitCode}` : undefined,
44
+ };
45
+ }
46
+ catch (e) {
47
+ return {
48
+ exitCode: -1,
49
+ error: e instanceof Error ? e.message : String(e),
50
+ };
51
+ }
52
+ },
53
+ };
54
+ }
55
+ //# sourceMappingURL=oneshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneshot.js","sourceRoot":"","sources":["../../src/executors/oneshot.ts"],"names":[],"mappings":"AAcA;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;QACL,IAAI,EAAE,SAAS;QACf,KAAK,CAAC,OAAO,CAAC,GAAG;YACf,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;YACtC,MAAM,IAAI,GAAa;gBACrB,IAAI;gBACJ,GAAG,CAAC,MAAM;gBACV,iBAAiB;gBACjB,aAAa;gBACb,WAAW;gBACX,aAAa;gBACb,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;gBACnC,0BAA0B;aAC3B,CAAC;YACF,IAAI,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC;gBACjC,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,GAAG,CAAC,OAAO,EAAE,YAAY,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACnE,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE;oBAC5B,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO;oBACzB,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,MAAM,EAAE,GAAG,CAAC,MAAM;iBACnB,CAAC,CAAC;gBACH,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACvB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACvB,OAAO;oBACL,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,OAAO,EAAE,CAAC,CAAC,iBAAiB;oBAC5B,KAAK,EAAE,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;iBACrE,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO;oBACL,QAAQ,EAAE,CAAC,CAAC;oBACZ,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;iBAClD,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ScheduleExecutor } from "../executor.js";
2
+ export interface SwarmStarter {
3
+ (input: {
4
+ workDir: string;
5
+ templateName?: string;
6
+ roles?: string[];
7
+ task?: string;
8
+ prompt: string;
9
+ signal: AbortSignal;
10
+ }): Promise<{
11
+ swarmId: string;
12
+ sessionId: string;
13
+ summary?: string;
14
+ exitCode: number;
15
+ stderr?: string;
16
+ }>;
17
+ }
18
+ /**
19
+ * Swarm executor: delegates to a swarmStarter that owns the actual swarm
20
+ * conversation lifecycle (queen + workers). Phase 6 wires this to the swarm
21
+ * runtime; the executor itself only adapts the schedule's launchConfig + run
22
+ * context to the starter's input shape and lifts the result back into an
23
+ * ExecutorResult with swarmId/sessionId for run-history correlation.
24
+ */
25
+ export declare function createSwarmExecutor(swarmStarter: SwarmStarter): ScheduleExecutor;
26
+ //# sourceMappingURL=swarm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../src/executors/swarm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,CAAC,KAAK,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,WAAW,CAAC;KACrB,GAAG,OAAO,CAAC;QACV,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,YAAY,GAAG,gBAAgB,CA6BhF"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Swarm executor: delegates to a swarmStarter that owns the actual swarm
3
+ * conversation lifecycle (queen + workers). Phase 6 wires this to the swarm
4
+ * runtime; the executor itself only adapts the schedule's launchConfig + run
5
+ * context to the starter's input shape and lifts the result back into an
6
+ * ExecutorResult with swarmId/sessionId for run-history correlation.
7
+ */
8
+ export function createSwarmExecutor(swarmStarter) {
9
+ return {
10
+ mode: "swarm",
11
+ async execute(ctx) {
12
+ const cfg = ctx.schedule.launchConfig;
13
+ try {
14
+ const r = await swarmStarter({
15
+ workDir: ctx.schedule.workDir,
16
+ templateName: cfg.swarm?.templateName,
17
+ roles: cfg.swarm?.roles,
18
+ task: cfg.task,
19
+ prompt: cfg.prompt,
20
+ signal: ctx.signal,
21
+ });
22
+ if (r.stderr)
23
+ ctx.onStderr(r.stderr);
24
+ return {
25
+ exitCode: r.exitCode,
26
+ summary: r.summary,
27
+ swarmId: r.swarmId,
28
+ sessionId: r.sessionId,
29
+ };
30
+ }
31
+ catch (e) {
32
+ return {
33
+ exitCode: -1,
34
+ error: e instanceof Error ? e.message : String(e),
35
+ };
36
+ }
37
+ },
38
+ };
39
+ }
40
+ //# sourceMappingURL=swarm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swarm.js","sourceRoot":"","sources":["../../src/executors/swarm.ts"],"names":[],"mappings":"AAmBA;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAA0B;IAC5D,OAAO;QACL,IAAI,EAAE,OAAO;QACb,KAAK,CAAC,OAAO,CAAC,GAAG;YACf,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,MAAM,YAAY,CAAC;oBAC3B,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO;oBAC7B,YAAY,EAAE,GAAG,CAAC,KAAK,EAAE,YAAY;oBACrC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK;oBACvB,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,MAAM,EAAE,GAAG,CAAC,MAAM;iBACnB,CAAC,CAAC;gBACH,IAAI,CAAC,CAAC,MAAM;oBAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACrC,OAAO;oBACL,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,SAAS,EAAE,CAAC,CAAC,SAAS;iBACvB,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO;oBACL,QAAQ,EAAE,CAAC,CAAC;oBACZ,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;iBAClD,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export * from "./types.js";
2
+ export * from "./executor.js";
3
+ export * from "./paths.js";
4
+ export * from "./scheduler-service.js";
5
+ export { JsonScheduleRepository } from "./json-schedule-repository.js";
6
+ export type { JsonScheduleRepositoryOptions } from "./json-schedule-repository.js";
7
+ export { createOneShotExecutor } from "./executors/oneshot.js";
8
+ export type { SpawnFn } from "./executors/oneshot.js";
9
+ export { createSwarmExecutor } from "./executors/swarm.js";
10
+ export type { SwarmStarter } from "./executors/swarm.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,YAAY,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,YAAY,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export * from "./types.js";
2
+ export * from "./executor.js";
3
+ export * from "./paths.js";
4
+ export * from "./scheduler-service.js";
5
+ export { JsonScheduleRepository } from "./json-schedule-repository.js";
6
+ export { createOneShotExecutor } from "./executors/oneshot.js";
7
+ export { createSwarmExecutor } from "./executors/swarm.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { Schedule, ScheduleRun, CreateScheduleInput, UpdateSchedulePatch, InternalSchedulePatch } from "./types.js";
2
+ export interface JsonScheduleRepositoryOptions {
3
+ home?: string;
4
+ }
5
+ export declare class JsonScheduleRepository {
6
+ private readonly opts;
7
+ constructor(opts?: JsonScheduleRepositoryOptions);
8
+ private get home();
9
+ private ensureIndexFileExists;
10
+ private readIndex;
11
+ private writeIndex;
12
+ private upsertIndexEntry;
13
+ private removeIndexEntry;
14
+ private writeScheduleFile;
15
+ private readScheduleSync;
16
+ private persist;
17
+ create(input: CreateScheduleInput): Promise<Schedule>;
18
+ getById(id: string): Promise<Schedule | null>;
19
+ listAll(): Promise<Schedule[]>;
20
+ private projectsRoot;
21
+ listByCwd(workDir: string): Promise<Schedule[]>;
22
+ update(id: string, patch: UpdateSchedulePatch | InternalSchedulePatch): Promise<Schedule>;
23
+ delete(id: string): Promise<void>;
24
+ private readRunsFile;
25
+ private writeRunsFile;
26
+ appendRun(run: ScheduleRun): Promise<void>;
27
+ listRuns(scheduleId: string): Promise<ScheduleRun[]>;
28
+ updateRun(scheduleId: string, runId: string, patch: Partial<ScheduleRun>): Promise<ScheduleRun | null>;
29
+ recoverInterruptedRuns(): Promise<void>;
30
+ writeRunLogs(scheduleId: string, runId: string, logs: {
31
+ stdout?: string;
32
+ stderr?: string;
33
+ }): Promise<void>;
34
+ readRunLogs(scheduleId: string, runId: string): Promise<{
35
+ stdout: string;
36
+ stderr: string;
37
+ }>;
38
+ }
39
+ //# sourceMappingURL=json-schedule-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schedule-repository.d.ts","sourceRoot":"","sources":["../src/json-schedule-repository.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,qBAAqB,EAGvF,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,6BAA6B;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA0ED,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,GAAE,6BAAkC;IAErE,OAAO,KAAK,IAAI,GAEf;IAED,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,OAAO;IAKT,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC;IA2BrD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAwB7C,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IA4BpC,OAAO,CAAC,YAAY;IAMd,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAkB/C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,qBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwCzF,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBvC,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;IAIf,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB1C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAQpD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAetG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBvC,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GACzC,OAAO,CAAC,IAAI,CAAC;IAaV,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CASlG"}
@@ -0,0 +1,374 @@
1
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, renameSync, writeFileSync, } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { ulid } from "ulid";
4
+ import { encodeCwd, projectRoot, withLock } from "@mclawnet/task";
5
+ import { schedulesDir, scheduleFile, scheduleIndexFile, scheduleRunsFile, scheduleLogFile, scheduleLogsDir, } from "./paths.js";
6
+ import { DEFAULT_MAX_CONSECUTIVE_FAILURES, MAX_RUNS_PER_SCHEDULE, MAX_STDOUT_BYTES, MAX_STDERR_BYTES, MAX_PROMPT_BYTES, HARD_MAX_RUN_MS, } from "./types.js";
7
+ function atomicWrite(path, contents) {
8
+ mkdirSync(dirname(path), { recursive: true });
9
+ const tmp = `${path}.tmp`;
10
+ writeFileSync(tmp, contents);
11
+ renameSync(tmp, path);
12
+ }
13
+ function atomicWriteBytes(path, contents) {
14
+ mkdirSync(dirname(path), { recursive: true });
15
+ const tmp = `${path}.tmp`;
16
+ writeFileSync(tmp, contents);
17
+ renameSync(tmp, path);
18
+ }
19
+ function truncateUtf8Tail(s, maxBytes) {
20
+ const buf = Buffer.from(s, "utf8");
21
+ if (buf.byteLength <= maxBytes)
22
+ return buf;
23
+ let start = buf.byteLength - maxBytes;
24
+ // Advance past any UTF-8 continuation bytes (10xxxxxx) so we don't split a
25
+ // multi-byte sequence at the head; otherwise the decoder would insert U+FFFD
26
+ // and the round-trip size could exceed the budget.
27
+ while (start < buf.byteLength && (buf[start] & 0xc0) === 0x80) {
28
+ start += 1;
29
+ }
30
+ return buf.subarray(start);
31
+ }
32
+ function readJsonOrNull(path) {
33
+ if (!existsSync(path))
34
+ return null;
35
+ try {
36
+ return JSON.parse(readFileSync(path, "utf-8"));
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ /**
43
+ * Reject prompts whose UTF-8 byte size exceeds MAX_PROMPT_BYTES. The prompt
44
+ * is forwarded over WS and ultimately handed to `claude -p <prompt>` as a
45
+ * process argv; uncapped strings would risk OOM, large disk writes, and
46
+ * `spawn E2BIG` (macOS ARG_MAX ~1MB).
47
+ */
48
+ function assertPromptSize(prompt) {
49
+ if (prompt === undefined)
50
+ return;
51
+ if (Buffer.byteLength(prompt, "utf8") > MAX_PROMPT_BYTES) {
52
+ throw new Error("PROMPT_TOO_LARGE");
53
+ }
54
+ }
55
+ /**
56
+ * Reject maxRunMs above the hard 24h ceiling so a single misconfigured row
57
+ * cannot keep a child process alive for months.
58
+ */
59
+ function assertMaxRunMs(maxRunMs) {
60
+ if (maxRunMs === undefined)
61
+ return;
62
+ if (maxRunMs > HARD_MAX_RUN_MS) {
63
+ throw new Error("MAX_RUN_MS_TOO_LARGE");
64
+ }
65
+ }
66
+ export class JsonScheduleRepository {
67
+ opts;
68
+ constructor(opts = {}) {
69
+ this.opts = opts;
70
+ }
71
+ get home() {
72
+ return this.opts.home;
73
+ }
74
+ ensureIndexFileExists(workDir) {
75
+ const path = scheduleIndexFile(workDir, this.home);
76
+ if (!existsSync(path)) {
77
+ atomicWrite(path, JSON.stringify({ version: 1, schedules: {} }, null, 2));
78
+ }
79
+ }
80
+ readIndex(workDir) {
81
+ const path = scheduleIndexFile(workDir, this.home);
82
+ return readJsonOrNull(path) ?? { version: 1, schedules: {} };
83
+ }
84
+ writeIndex(workDir, idx) {
85
+ atomicWrite(scheduleIndexFile(workDir, this.home), JSON.stringify(idx, null, 2));
86
+ }
87
+ upsertIndexEntry(s) {
88
+ const idx = this.readIndex(s.workDir);
89
+ idx.schedules[s.id] = { id: s.id, workDir: s.workDir, label: s.label, status: s.status };
90
+ this.writeIndex(s.workDir, idx);
91
+ }
92
+ removeIndexEntry(workDir, id) {
93
+ const idx = this.readIndex(workDir);
94
+ if (idx.schedules[id]) {
95
+ delete idx.schedules[id];
96
+ this.writeIndex(workDir, idx);
97
+ }
98
+ }
99
+ writeScheduleFile(s) {
100
+ atomicWrite(scheduleFile(s.workDir, s.id, this.home), JSON.stringify(s, null, 2));
101
+ }
102
+ readScheduleSync(workDir, id) {
103
+ return readJsonOrNull(scheduleFile(workDir, id, this.home));
104
+ }
105
+ persist(s) {
106
+ this.writeScheduleFile(s);
107
+ this.upsertIndexEntry(s);
108
+ }
109
+ async create(input) {
110
+ assertPromptSize(input.launchConfig.prompt);
111
+ assertMaxRunMs(input.launchConfig.maxRunMs);
112
+ this.ensureIndexFileExists(input.workDir);
113
+ return withLock(scheduleIndexFile(input.workDir, this.home), async () => {
114
+ const now = new Date().toISOString();
115
+ const s = {
116
+ id: ulid(),
117
+ agentId: input.agentId,
118
+ workDir: input.workDir,
119
+ encodedCwd: encodeCwd(input.workDir),
120
+ label: input.label,
121
+ mode: input.mode,
122
+ cronExpression: input.cronExpression,
123
+ timezone: input.timezone,
124
+ status: "active",
125
+ consecutiveFailures: 0,
126
+ maxConsecutiveFailures: input.maxConsecutiveFailures ?? DEFAULT_MAX_CONSECUTIVE_FAILURES,
127
+ createdAt: now,
128
+ updatedAt: now,
129
+ launchConfig: input.launchConfig,
130
+ };
131
+ this.persist(s);
132
+ return s;
133
+ });
134
+ }
135
+ async getById(id) {
136
+ // Fast path: walk the small per-project index.json files (one per cwd) and
137
+ // dereference the single matching schedule. Avoids the O(N) directory scan
138
+ // that listAll() performs across every schedule file in every project.
139
+ const projectsRoot = this.projectsRoot();
140
+ if (!existsSync(projectsRoot))
141
+ return null;
142
+ let projectDirs = [];
143
+ try {
144
+ projectDirs = readdirSync(projectsRoot);
145
+ }
146
+ catch {
147
+ return null;
148
+ }
149
+ for (const pd of projectDirs) {
150
+ const idxPath = join(projectsRoot, pd, "schedules", "index.json");
151
+ const idx = readJsonOrNull(idxPath);
152
+ if (!idx)
153
+ continue;
154
+ const entry = idx.schedules[id];
155
+ if (!entry || !entry.workDir)
156
+ continue;
157
+ const s = this.readScheduleSync(entry.workDir, id);
158
+ if (s)
159
+ return s;
160
+ }
161
+ return null;
162
+ }
163
+ async listAll() {
164
+ const projectsRoot = this.projectsRoot();
165
+ if (!existsSync(projectsRoot))
166
+ return [];
167
+ const out = [];
168
+ let projectDirs = [];
169
+ try {
170
+ projectDirs = readdirSync(projectsRoot);
171
+ }
172
+ catch {
173
+ return [];
174
+ }
175
+ for (const pd of projectDirs) {
176
+ const sdir = join(projectsRoot, pd, "schedules");
177
+ if (!existsSync(sdir))
178
+ continue;
179
+ let entries = [];
180
+ try {
181
+ entries = readdirSync(sdir);
182
+ }
183
+ catch {
184
+ continue;
185
+ }
186
+ for (const name of entries) {
187
+ if (!name.endsWith(".json") || name === "index.json")
188
+ continue;
189
+ const s = readJsonOrNull(join(sdir, name));
190
+ if (s)
191
+ out.push(s);
192
+ }
193
+ }
194
+ return out;
195
+ }
196
+ projectsRoot() {
197
+ // Build ~/.clawnet/projects without depending on a real workDir.
198
+ // projectRoot encodes a workDir into the leaf; dirname strips it.
199
+ return dirname(projectRoot("/placeholder", this.home));
200
+ }
201
+ async listByCwd(workDir) {
202
+ const dir = schedulesDir(workDir, this.home);
203
+ if (!existsSync(dir))
204
+ return [];
205
+ let entries = [];
206
+ try {
207
+ entries = readdirSync(dir);
208
+ }
209
+ catch {
210
+ return [];
211
+ }
212
+ const out = [];
213
+ for (const name of entries) {
214
+ if (!name.endsWith(".json") || name === "index.json")
215
+ continue;
216
+ const s = readJsonOrNull(join(dir, name));
217
+ if (s)
218
+ out.push(s);
219
+ }
220
+ return out;
221
+ }
222
+ async update(id, patch) {
223
+ assertPromptSize(patch.launchConfig?.prompt);
224
+ assertMaxRunMs(patch.launchConfig?.maxRunMs);
225
+ const located = await this.getById(id);
226
+ if (!located)
227
+ throw new Error(`Schedule not found: ${id}`);
228
+ const workDir = located.workDir;
229
+ this.ensureIndexFileExists(workDir);
230
+ return withLock(scheduleIndexFile(workDir, this.home), async () => {
231
+ const cur = this.readScheduleSync(workDir, id);
232
+ if (!cur)
233
+ throw new Error(`Schedule not found: ${id}`);
234
+ const merged = {
235
+ ...cur,
236
+ ...patch,
237
+ id: cur.id,
238
+ agentId: cur.agentId,
239
+ workDir: cur.workDir,
240
+ encodedCwd: cur.encodedCwd,
241
+ createdAt: cur.createdAt,
242
+ updatedAt: new Date().toISOString(),
243
+ launchConfig: patch.launchConfig
244
+ ? { ...cur.launchConfig, ...patch.launchConfig }
245
+ : cur.launchConfig,
246
+ };
247
+ // Honour explicit `undefined` on optional bookkeeping fields so callers
248
+ // can clear them (e.g. nextRunAt when a schedule gets paused). Object
249
+ // spread keeps the key with value `undefined`, but Schedule's optional
250
+ // fields are not represented as "key present with undefined" anywhere
251
+ // else, so strip them to keep the on-disk JSON tidy and the in-memory
252
+ // shape predictable.
253
+ if ("lastRunAt" in patch && patch.lastRunAt === undefined) {
254
+ delete merged.lastRunAt;
255
+ }
256
+ if ("nextRunAt" in patch && patch.nextRunAt === undefined) {
257
+ delete merged.nextRunAt;
258
+ }
259
+ this.persist(merged);
260
+ return merged;
261
+ });
262
+ }
263
+ async delete(id) {
264
+ const located = await this.getById(id);
265
+ if (!located)
266
+ return;
267
+ const workDir = located.workDir;
268
+ this.ensureIndexFileExists(workDir);
269
+ await withLock(scheduleIndexFile(workDir, this.home), async () => {
270
+ const cur = this.readScheduleSync(workDir, id);
271
+ if (!cur)
272
+ return;
273
+ const sf = scheduleFile(workDir, id, this.home);
274
+ rmSync(sf, { force: true });
275
+ const runs = scheduleRunsFile(workDir, id, this.home);
276
+ rmSync(runs, { force: true });
277
+ const logs = scheduleLogsDir(workDir, id, this.home);
278
+ rmSync(logs, { recursive: true, force: true });
279
+ this.removeIndexEntry(workDir, id);
280
+ });
281
+ }
282
+ // ───────────────────────── runs ─────────────────────────
283
+ readRunsFile(workDir, scheduleId) {
284
+ const path = scheduleRunsFile(workDir, scheduleId, this.home);
285
+ return readJsonOrNull(path) ?? [];
286
+ }
287
+ writeRunsFile(workDir, scheduleId, runs) {
288
+ atomicWrite(scheduleRunsFile(workDir, scheduleId, this.home), JSON.stringify(runs, null, 2));
289
+ }
290
+ async appendRun(run) {
291
+ const owner = await this.getById(run.scheduleId);
292
+ if (!owner)
293
+ throw new Error(`Schedule not found: ${run.scheduleId}`);
294
+ this.ensureIndexFileExists(owner.workDir);
295
+ await withLock(scheduleIndexFile(owner.workDir, this.home), async () => {
296
+ const existing = this.readRunsFile(owner.workDir, run.scheduleId);
297
+ // Newest-first: prepend.
298
+ const next = [run, ...existing];
299
+ // Drop oldest beyond cap.
300
+ if (next.length > MAX_RUNS_PER_SCHEDULE) {
301
+ next.length = MAX_RUNS_PER_SCHEDULE;
302
+ }
303
+ this.writeRunsFile(owner.workDir, run.scheduleId, next);
304
+ });
305
+ }
306
+ async listRuns(scheduleId) {
307
+ const owner = await this.getById(scheduleId);
308
+ if (!owner)
309
+ return [];
310
+ const runs = this.readRunsFile(owner.workDir, scheduleId);
311
+ const sorted = [...runs].sort((a, b) => (a.startedAt < b.startedAt ? 1 : a.startedAt > b.startedAt ? -1 : 0));
312
+ return sorted.slice(0, MAX_RUNS_PER_SCHEDULE);
313
+ }
314
+ async updateRun(scheduleId, runId, patch) {
315
+ const owner = await this.getById(scheduleId);
316
+ if (!owner)
317
+ return null;
318
+ this.ensureIndexFileExists(owner.workDir);
319
+ return withLock(scheduleIndexFile(owner.workDir, this.home), async () => {
320
+ const runs = this.readRunsFile(owner.workDir, scheduleId);
321
+ const idx = runs.findIndex(r => r.id === runId);
322
+ if (idx === -1)
323
+ return null;
324
+ const merged = { ...runs[idx], ...patch, id: runs[idx].id, scheduleId: runs[idx].scheduleId };
325
+ runs[idx] = merged;
326
+ this.writeRunsFile(owner.workDir, scheduleId, runs);
327
+ return merged;
328
+ });
329
+ }
330
+ async recoverInterruptedRuns() {
331
+ const all = await this.listAll();
332
+ for (const s of all) {
333
+ this.ensureIndexFileExists(s.workDir);
334
+ await withLock(scheduleIndexFile(s.workDir, this.home), async () => {
335
+ const runs = this.readRunsFile(s.workDir, s.id);
336
+ let mutated = false;
337
+ for (let i = 0; i < runs.length; i++) {
338
+ if (runs[i].status === "pending" || runs[i].status === "running") {
339
+ runs[i] = { ...runs[i], status: "failed_interrupted" };
340
+ mutated = true;
341
+ }
342
+ }
343
+ if (mutated) {
344
+ this.writeRunsFile(s.workDir, s.id, runs);
345
+ }
346
+ });
347
+ }
348
+ }
349
+ // ───────────────────────── logs ─────────────────────────
350
+ async writeRunLogs(scheduleId, runId, logs) {
351
+ const owner = await this.getById(scheduleId);
352
+ if (!owner)
353
+ throw new Error(`Schedule not found: ${scheduleId}`);
354
+ if (logs.stdout && logs.stdout.length > 0) {
355
+ const path = scheduleLogFile(owner.workDir, scheduleId, runId, "stdout", this.home);
356
+ atomicWriteBytes(path, truncateUtf8Tail(logs.stdout, MAX_STDOUT_BYTES));
357
+ }
358
+ if (logs.stderr && logs.stderr.length > 0) {
359
+ const path = scheduleLogFile(owner.workDir, scheduleId, runId, "stderr", this.home);
360
+ atomicWriteBytes(path, truncateUtf8Tail(logs.stderr, MAX_STDERR_BYTES));
361
+ }
362
+ }
363
+ async readRunLogs(scheduleId, runId) {
364
+ const owner = await this.getById(scheduleId);
365
+ if (!owner)
366
+ return { stdout: "", stderr: "" };
367
+ const stdoutPath = scheduleLogFile(owner.workDir, scheduleId, runId, "stdout", this.home);
368
+ const stderrPath = scheduleLogFile(owner.workDir, scheduleId, runId, "stderr", this.home);
369
+ const stdout = existsSync(stdoutPath) ? readFileSync(stdoutPath, "utf-8") : "";
370
+ const stderr = existsSync(stderrPath) ? readFileSync(stderrPath, "utf-8") : "";
371
+ return { stdout, stderr };
372
+ }
373
+ }
374
+ //# sourceMappingURL=json-schedule-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schedule-repository.js","sourceRoot":"","sources":["../src/json-schedule-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function schedulesDir(workDir: string, home?: string): string;
2
+ export declare function scheduleFile(workDir: string, id: string, home?: string): string;
3
+ export declare function scheduleIndexFile(workDir: string, home?: string): string;
4
+ export declare function scheduleRunsFile(workDir: string, id: string, home?: string): string;
5
+ export declare function scheduleLogsDir(workDir: string, id: string, home?: string): string;
6
+ export declare function scheduleLogFile(workDir: string, id: string, runId: string, kind: "stdout" | "stderr", home?: string): string;
7
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAGA,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnE;AACD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/E;AACD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAExE;AACD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnF;AACD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAElF;AACD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAC1C,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,GACvC,MAAM,CAGR"}
package/dist/paths.js ADDED
@@ -0,0 +1,22 @@
1
+ import { join } from "node:path";
2
+ import { projectRoot } from "@mclawnet/task";
3
+ export function schedulesDir(workDir, home) {
4
+ return join(projectRoot(workDir, home), "schedules");
5
+ }
6
+ export function scheduleFile(workDir, id, home) {
7
+ return join(schedulesDir(workDir, home), `${id}.json`);
8
+ }
9
+ export function scheduleIndexFile(workDir, home) {
10
+ return join(schedulesDir(workDir, home), "index.json");
11
+ }
12
+ export function scheduleRunsFile(workDir, id, home) {
13
+ return join(schedulesDir(workDir, home), "runs", `${id}.json`);
14
+ }
15
+ export function scheduleLogsDir(workDir, id, home) {
16
+ return join(schedulesDir(workDir, home), "logs", id);
17
+ }
18
+ export function scheduleLogFile(workDir, id, runId, kind, home) {
19
+ const ext = kind === "stdout" ? "log" : "err";
20
+ return join(scheduleLogsDir(workDir, id, home), `${runId}.${ext}`);
21
+ }
22
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,IAAa;IACzD,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC;AACvD,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,EAAU,EAAE,IAAa;IACrE,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AACzD,CAAC;AACD,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAa;IAC9D,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;AACzD,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,EAAU,EAAE,IAAa;IACzE,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AACjE,CAAC;AACD,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,EAAU,EAAE,IAAa;IACxE,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC;AACD,MAAM,UAAU,eAAe,CAC7B,OAAe,EAAE,EAAU,EAAE,KAAa,EAC1C,IAAyB,EAAE,IAAa;IAExC,MAAM,GAAG,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9C,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;AACrE,CAAC"}