agy-worker-mcp 0.3.1

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 (227) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/LICENSE +21 -0
  3. package/README.md +309 -0
  4. package/commands/agy-ceiling.md +31 -0
  5. package/dist/broker/blockers.d.ts +86 -0
  6. package/dist/broker/blockers.d.ts.map +1 -0
  7. package/dist/broker/blockers.js +390 -0
  8. package/dist/broker/blockers.js.map +1 -0
  9. package/dist/broker/outcome.d.ts +85 -0
  10. package/dist/broker/outcome.d.ts.map +1 -0
  11. package/dist/broker/outcome.js +147 -0
  12. package/dist/broker/outcome.js.map +1 -0
  13. package/dist/broker/reconcile.d.ts +74 -0
  14. package/dist/broker/reconcile.d.ts.map +1 -0
  15. package/dist/broker/reconcile.js +415 -0
  16. package/dist/broker/reconcile.js.map +1 -0
  17. package/dist/broker/result.d.ts +88 -0
  18. package/dist/broker/result.d.ts.map +1 -0
  19. package/dist/broker/result.js +234 -0
  20. package/dist/broker/result.js.map +1 -0
  21. package/dist/broker/verify.d.ts +52 -0
  22. package/dist/broker/verify.d.ts.map +1 -0
  23. package/dist/broker/verify.js +174 -0
  24. package/dist/broker/verify.js.map +1 -0
  25. package/dist/contract/errors.d.ts +119 -0
  26. package/dist/contract/errors.d.ts.map +1 -0
  27. package/dist/contract/errors.js +99 -0
  28. package/dist/contract/errors.js.map +1 -0
  29. package/dist/contract/index.d.ts +10 -0
  30. package/dist/contract/index.d.ts.map +1 -0
  31. package/dist/contract/index.js +10 -0
  32. package/dist/contract/index.js.map +1 -0
  33. package/dist/contract/paths.d.ts +139 -0
  34. package/dist/contract/paths.d.ts.map +1 -0
  35. package/dist/contract/paths.js +359 -0
  36. package/dist/contract/paths.js.map +1 -0
  37. package/dist/contract/schema.sql +64 -0
  38. package/dist/contract/types.d.ts +1113 -0
  39. package/dist/contract/types.d.ts.map +1 -0
  40. package/dist/contract/types.js +114 -0
  41. package/dist/contract/types.js.map +1 -0
  42. package/dist/events/cursor.d.ts +65 -0
  43. package/dist/events/cursor.d.ts.map +1 -0
  44. package/dist/events/cursor.js +286 -0
  45. package/dist/events/cursor.js.map +1 -0
  46. package/dist/events/detect.d.ts +58 -0
  47. package/dist/events/detect.d.ts.map +1 -0
  48. package/dist/events/detect.js +183 -0
  49. package/dist/events/detect.js.map +1 -0
  50. package/dist/events/normalize.d.ts +30 -0
  51. package/dist/events/normalize.d.ts.map +1 -0
  52. package/dist/events/normalize.js +158 -0
  53. package/dist/events/normalize.js.map +1 -0
  54. package/dist/events/parse.d.ts +41 -0
  55. package/dist/events/parse.d.ts.map +1 -0
  56. package/dist/events/parse.js +89 -0
  57. package/dist/events/parse.js.map +1 -0
  58. package/dist/gate/bind.d.ts +28 -0
  59. package/dist/gate/bind.d.ts.map +1 -0
  60. package/dist/gate/bind.js +154 -0
  61. package/dist/gate/bind.js.map +1 -0
  62. package/dist/gate/gate.d.ts +139 -0
  63. package/dist/gate/gate.d.ts.map +1 -0
  64. package/dist/gate/gate.js +488 -0
  65. package/dist/gate/gate.js.map +1 -0
  66. package/dist/gate/hooks-file.d.ts +55 -0
  67. package/dist/gate/hooks-file.d.ts.map +1 -0
  68. package/dist/gate/hooks-file.js +104 -0
  69. package/dist/gate/hooks-file.js.map +1 -0
  70. package/dist/gate.d.ts +3 -0
  71. package/dist/gate.d.ts.map +1 -0
  72. package/dist/gate.js +20 -0
  73. package/dist/gate.js.map +1 -0
  74. package/dist/policy/ceiling-review.d.ts +22 -0
  75. package/dist/policy/ceiling-review.d.ts.map +1 -0
  76. package/dist/policy/ceiling-review.js +170 -0
  77. package/dist/policy/ceiling-review.js.map +1 -0
  78. package/dist/policy/ceiling.d.ts +128 -0
  79. package/dist/policy/ceiling.d.ts.map +1 -0
  80. package/dist/policy/ceiling.js +273 -0
  81. package/dist/policy/ceiling.js.map +1 -0
  82. package/dist/policy/containment.d.ts +100 -0
  83. package/dist/policy/containment.d.ts.map +1 -0
  84. package/dist/policy/containment.js +1071 -0
  85. package/dist/policy/containment.js.map +1 -0
  86. package/dist/policy/hard-deny.d.ts +28 -0
  87. package/dist/policy/hard-deny.d.ts.map +1 -0
  88. package/dist/policy/hard-deny.js +78 -0
  89. package/dist/policy/hard-deny.js.map +1 -0
  90. package/dist/policy/profiles.d.ts +82 -0
  91. package/dist/policy/profiles.d.ts.map +1 -0
  92. package/dist/policy/profiles.js +317 -0
  93. package/dist/policy/profiles.js.map +1 -0
  94. package/dist/policy/rules.d.ts +138 -0
  95. package/dist/policy/rules.d.ts.map +1 -0
  96. package/dist/policy/rules.js +1180 -0
  97. package/dist/policy/rules.js.map +1 -0
  98. package/dist/policy/seatbelt.d.ts +32 -0
  99. package/dist/policy/seatbelt.d.ts.map +1 -0
  100. package/dist/policy/seatbelt.js +59 -0
  101. package/dist/policy/seatbelt.js.map +1 -0
  102. package/dist/policy/tools.d.ts +36 -0
  103. package/dist/policy/tools.d.ts.map +1 -0
  104. package/dist/policy/tools.js +94 -0
  105. package/dist/policy/tools.js.map +1 -0
  106. package/dist/runner/gate-watchdog.d.ts +93 -0
  107. package/dist/runner/gate-watchdog.d.ts.map +1 -0
  108. package/dist/runner/gate-watchdog.js +153 -0
  109. package/dist/runner/gate-watchdog.js.map +1 -0
  110. package/dist/runner/idle.d.ts +51 -0
  111. package/dist/runner/idle.d.ts.map +1 -0
  112. package/dist/runner/idle.js +81 -0
  113. package/dist/runner/idle.js.map +1 -0
  114. package/dist/runner/inbox.d.ts +56 -0
  115. package/dist/runner/inbox.d.ts.map +1 -0
  116. package/dist/runner/inbox.js +134 -0
  117. package/dist/runner/inbox.js.map +1 -0
  118. package/dist/runner/reap.d.ts +65 -0
  119. package/dist/runner/reap.d.ts.map +1 -0
  120. package/dist/runner/reap.js +168 -0
  121. package/dist/runner/reap.js.map +1 -0
  122. package/dist/runner/runner.d.ts +51 -0
  123. package/dist/runner/runner.d.ts.map +1 -0
  124. package/dist/runner/runner.js +289 -0
  125. package/dist/runner/runner.js.map +1 -0
  126. package/dist/runner/spawn.d.ts +98 -0
  127. package/dist/runner/spawn.d.ts.map +1 -0
  128. package/dist/runner/spawn.js +230 -0
  129. package/dist/runner/spawn.js.map +1 -0
  130. package/dist/runner/verify.d.ts +24 -0
  131. package/dist/runner/verify.d.ts.map +1 -0
  132. package/dist/runner/verify.js +108 -0
  133. package/dist/runner/verify.js.map +1 -0
  134. package/dist/runner.d.ts +3 -0
  135. package/dist/runner.d.ts.map +1 -0
  136. package/dist/runner.js +15 -0
  137. package/dist/runner.js.map +1 -0
  138. package/dist/server/context.d.ts +41 -0
  139. package/dist/server/context.d.ts.map +1 -0
  140. package/dist/server/context.js +59 -0
  141. package/dist/server/context.js.map +1 -0
  142. package/dist/server/instructions.d.ts +13 -0
  143. package/dist/server/instructions.d.ts.map +1 -0
  144. package/dist/server/instructions.js +121 -0
  145. package/dist/server/instructions.js.map +1 -0
  146. package/dist/server/server.d.ts +20 -0
  147. package/dist/server/server.d.ts.map +1 -0
  148. package/dist/server/server.js +55 -0
  149. package/dist/server/server.js.map +1 -0
  150. package/dist/server/tools/cancel.d.ts +24 -0
  151. package/dist/server/tools/cancel.d.ts.map +1 -0
  152. package/dist/server/tools/cancel.js +59 -0
  153. package/dist/server/tools/cancel.js.map +1 -0
  154. package/dist/server/tools/capabilities.d.ts +36 -0
  155. package/dist/server/tools/capabilities.d.ts.map +1 -0
  156. package/dist/server/tools/capabilities.js +116 -0
  157. package/dist/server/tools/capabilities.js.map +1 -0
  158. package/dist/server/tools/ceiling.d.ts +31 -0
  159. package/dist/server/tools/ceiling.d.ts.map +1 -0
  160. package/dist/server/tools/ceiling.js +121 -0
  161. package/dist/server/tools/ceiling.js.map +1 -0
  162. package/dist/server/tools/index.d.ts +38 -0
  163. package/dist/server/tools/index.d.ts.map +1 -0
  164. package/dist/server/tools/index.js +115 -0
  165. package/dist/server/tools/index.js.map +1 -0
  166. package/dist/server/tools/listJobs.d.ts +30 -0
  167. package/dist/server/tools/listJobs.d.ts.map +1 -0
  168. package/dist/server/tools/listJobs.js +37 -0
  169. package/dist/server/tools/listJobs.js.map +1 -0
  170. package/dist/server/tools/logs.d.ts +31 -0
  171. package/dist/server/tools/logs.d.ts.map +1 -0
  172. package/dist/server/tools/logs.js +96 -0
  173. package/dist/server/tools/logs.js.map +1 -0
  174. package/dist/server/tools/result.d.ts +32 -0
  175. package/dist/server/tools/result.d.ts.map +1 -0
  176. package/dist/server/tools/result.js +95 -0
  177. package/dist/server/tools/result.js.map +1 -0
  178. package/dist/server/tools/send.d.ts +37 -0
  179. package/dist/server/tools/send.d.ts.map +1 -0
  180. package/dist/server/tools/send.js +71 -0
  181. package/dist/server/tools/send.js.map +1 -0
  182. package/dist/server/tools/sessions.d.ts +28 -0
  183. package/dist/server/tools/sessions.d.ts.map +1 -0
  184. package/dist/server/tools/sessions.js +54 -0
  185. package/dist/server/tools/sessions.js.map +1 -0
  186. package/dist/server/tools/start.d.ts +107 -0
  187. package/dist/server/tools/start.d.ts.map +1 -0
  188. package/dist/server/tools/start.js +482 -0
  189. package/dist/server/tools/start.js.map +1 -0
  190. package/dist/server/tools/wait.d.ts +29 -0
  191. package/dist/server/tools/wait.d.ts.map +1 -0
  192. package/dist/server/tools/wait.js +120 -0
  193. package/dist/server/tools/wait.js.map +1 -0
  194. package/dist/server.d.ts +3 -0
  195. package/dist/server.d.ts.map +1 -0
  196. package/dist/server.js +17 -0
  197. package/dist/server.js.map +1 -0
  198. package/dist/setup/install.d.ts +52 -0
  199. package/dist/setup/install.d.ts.map +1 -0
  200. package/dist/setup/install.js +108 -0
  201. package/dist/setup/install.js.map +1 -0
  202. package/dist/setup.d.ts +3 -0
  203. package/dist/setup.d.ts.map +1 -0
  204. package/dist/setup.js +24 -0
  205. package/dist/setup.js.map +1 -0
  206. package/dist/store/db.d.ts +49 -0
  207. package/dist/store/db.d.ts.map +1 -0
  208. package/dist/store/db.js +101 -0
  209. package/dist/store/db.js.map +1 -0
  210. package/dist/store/jobs.d.ts +45 -0
  211. package/dist/store/jobs.d.ts.map +1 -0
  212. package/dist/store/jobs.js +150 -0
  213. package/dist/store/jobs.js.map +1 -0
  214. package/dist/store/locks.d.ts +60 -0
  215. package/dist/store/locks.d.ts.map +1 -0
  216. package/dist/store/locks.js +172 -0
  217. package/dist/store/locks.js.map +1 -0
  218. package/dist/store/sessions.d.ts +37 -0
  219. package/dist/store/sessions.d.ts.map +1 -0
  220. package/dist/store/sessions.js +117 -0
  221. package/dist/store/sessions.js.map +1 -0
  222. package/dist/trace/digest.d.ts +77 -0
  223. package/dist/trace/digest.d.ts.map +1 -0
  224. package/dist/trace/digest.js +481 -0
  225. package/dist/trace/digest.js.map +1 -0
  226. package/package.json +68 -0
  227. package/skills/agy-ceiling/SKILL.md +72 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/server/tools/wait.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
package/dist/server.js ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Entry point registered as `agy-worker-mcp`. Compiles to `dist/server.js`,
4
+ * which is the path both Codex and Claude Code launch.
5
+ */
6
+ import { main } from './server/server.js';
7
+ // Backstop for any promise (e.g. a `reconcile()` call an editor missed) that
8
+ // rejects without being awaited: without this, Node's default behavior is to
9
+ // crash the whole stdio server on the next microtask turn (finding 3/16).
10
+ process.on('unhandledRejection', (reason) => {
11
+ process.stderr.write(`agy-worker-mcp: unhandled rejection: ${reason instanceof Error ? reason.stack ?? reason.message : String(reason)}\n`);
12
+ });
13
+ main().catch((e) => {
14
+ process.stderr.write(`agy-worker-mcp: ${e instanceof Error ? e.stack ?? e.message : String(e)}\n`);
15
+ process.exit(1);
16
+ });
17
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAEzC,6EAA6E;AAC7E,6EAA6E;AAC7E,0EAA0E;AAC1E,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAe,EAAE,EAAE;IACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wCAAwC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CACtH,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;IAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAClG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * What `agy-worker-setup` copies and where. Pure planning + one copy step, so
3
+ * a test can run it against temp directories.
4
+ */
5
+ export interface SetupOptions {
6
+ /** `project` → `<cwd>/.claude`, `user` → `~/.claude`, or an explicit `.claude` directory. */
7
+ scope: 'project' | 'user';
8
+ /** Working directory for `project` scope. */
9
+ cwd: string;
10
+ /** Print the plan, copy nothing. */
11
+ dryRun: boolean;
12
+ /** Overwrite files that already exist (default: skip and say so). */
13
+ force: boolean;
14
+ /** Explicit destination `.claude` directory; overrides scope. */
15
+ dest?: string;
16
+ /** Where the package's `skills/` and `commands/` live; defaults to the installed package root. */
17
+ source?: string;
18
+ }
19
+ export interface SetupItem {
20
+ kind: 'skill' | 'command';
21
+ name: string;
22
+ from: string;
23
+ to: string;
24
+ action: 'copied' | 'skipped_exists' | 'overwritten' | 'missing_source' | 'planned';
25
+ }
26
+ export interface SetupReport {
27
+ ok: boolean;
28
+ dest: string;
29
+ items: SetupItem[];
30
+ text: string;
31
+ }
32
+ /** The pieces shipped with the package. Add here when a new skill or command lands. */
33
+ export declare const SETUP_ITEMS: ReadonlyArray<{
34
+ kind: 'skill' | 'command';
35
+ name: string;
36
+ rel: string;
37
+ destRel: string;
38
+ }>;
39
+ export declare function destinationDir(opts: Pick<SetupOptions, 'scope' | 'cwd' | 'dest'>): string;
40
+ export declare function install(opts: SetupOptions): SetupReport;
41
+ export type ParsedSetupArgs = {
42
+ kind: 'help';
43
+ } | {
44
+ kind: 'error';
45
+ message: string;
46
+ } | {
47
+ kind: 'run';
48
+ options: SetupOptions;
49
+ };
50
+ export declare function parseSetupArgs(argv: string[], cwd?: string): ParsedSetupArgs;
51
+ export declare function usage(): string;
52
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/setup/install.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,6FAA6F;IAC7F,KAAK,EAAE,SAAS,GAAG,MAAM,CAAA;IACzB,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAA;IACX,oCAAoC;IACpC,MAAM,EAAE,OAAO,CAAA;IACf,qEAAqE;IACrE,KAAK,EAAE,OAAO,CAAA;IACd,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kGAAkG;IAClG,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,GAAG,SAAS,CAAA;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,QAAQ,GAAG,gBAAgB,GAAG,aAAa,GAAG,gBAAgB,GAAG,SAAS,CAAA;CACnF;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,uFAAuF;AACvF,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAGhH,CAAA;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAGzF;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,CAwCvD;AAWD,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAA;AAE1C,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,GAAE,MAAsB,GAAG,eAAe,CAuB3F;AAED,wBAAgB,KAAK,IAAI,MAAM,CAS9B"}
@@ -0,0 +1,108 @@
1
+ import { cpSync, existsSync, mkdirSync, readFileSync, statSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join, resolve } from 'node:path';
4
+ import { packageRoot } from '../contract/paths.js';
5
+ /** The pieces shipped with the package. Add here when a new skill or command lands. */
6
+ export const SETUP_ITEMS = [
7
+ { kind: 'skill', name: 'agy-ceiling', rel: 'skills/agy-ceiling', destRel: 'skills/agy-ceiling' },
8
+ { kind: 'command', name: 'agy-ceiling', rel: 'commands/agy-ceiling.md', destRel: 'commands/agy-ceiling.md' },
9
+ ];
10
+ export function destinationDir(opts) {
11
+ if (opts.dest)
12
+ return resolve(opts.dest);
13
+ return opts.scope === 'user' ? join(homedir(), '.claude') : join(resolve(opts.cwd), '.claude');
14
+ }
15
+ export function install(opts) {
16
+ const source = opts.source ?? packageRoot();
17
+ const dest = destinationDir(opts);
18
+ const items = [];
19
+ let ok = true;
20
+ for (const item of SETUP_ITEMS) {
21
+ const from = join(source, item.rel);
22
+ const to = join(dest, item.destRel);
23
+ if (!existsSync(from)) {
24
+ items.push({ kind: item.kind, name: item.name, from, to, action: 'missing_source' });
25
+ ok = false;
26
+ continue;
27
+ }
28
+ const exists = existsSync(to);
29
+ if (opts.dryRun) {
30
+ items.push({ kind: item.kind, name: item.name, from, to, action: 'planned' });
31
+ continue;
32
+ }
33
+ if (exists && !opts.force) {
34
+ items.push({ kind: item.kind, name: item.name, from, to, action: 'skipped_exists' });
35
+ continue;
36
+ }
37
+ mkdirSync(join(to, '..'), { recursive: true });
38
+ cpSync(from, to, { recursive: statSync(from).isDirectory(), force: true });
39
+ items.push({ kind: item.kind, name: item.name, from, to, action: exists ? 'overwritten' : 'copied' });
40
+ }
41
+ const version = readVersion(source);
42
+ const lines = [
43
+ `agy-worker-mcp ${version} — Claude Code pieces → ${dest}${opts.dryRun ? ' (dry run)' : ''}`,
44
+ ...items.map((i) => ` ${i.action.padEnd(15)} ${i.kind.padEnd(7)} ${i.name.padEnd(12)} ${i.to}`),
45
+ '',
46
+ 'Register the MCP server (once per project, or --scope user):',
47
+ ' claude mcp add agy --scope project -- agy-worker-mcp',
48
+ '',
49
+ 'Then in Claude Code: /agy-ceiling (draft this project\'s permission ceiling; written only after you approve)',
50
+ '',
51
+ ];
52
+ return { ok, dest, items, text: lines.join('\n') };
53
+ }
54
+ function readVersion(source) {
55
+ try {
56
+ const pkg = JSON.parse(readFileSync(join(source, 'package.json'), 'utf8'));
57
+ return pkg.version ?? '?';
58
+ }
59
+ catch {
60
+ return '?';
61
+ }
62
+ }
63
+ export function parseSetupArgs(argv, cwd = process.cwd()) {
64
+ const options = { scope: 'project', cwd, dryRun: false, force: false };
65
+ for (let i = 0; i < argv.length; i++) {
66
+ const a = argv[i];
67
+ if (a === '-h' || a === '--help')
68
+ return { kind: 'help' };
69
+ if (a === '--dry-run')
70
+ options.dryRun = true;
71
+ else if (a === '--force')
72
+ options.force = true;
73
+ else if (a === '--scope') {
74
+ const v = argv[++i];
75
+ if (v !== 'project' && v !== 'user')
76
+ return { kind: 'error', message: `--scope must be project or user (got ${v ?? 'nothing'})` };
77
+ options.scope = v;
78
+ }
79
+ else if (a.startsWith('--scope=')) {
80
+ const v = a.slice('--scope='.length);
81
+ if (v !== 'project' && v !== 'user')
82
+ return { kind: 'error', message: `--scope must be project or user (got ${v})` };
83
+ options.scope = v;
84
+ }
85
+ else if (a === '--dest') {
86
+ const v = argv[++i];
87
+ if (!v)
88
+ return { kind: 'error', message: '--dest needs a directory' };
89
+ options.dest = v;
90
+ }
91
+ else if (a.startsWith('--dest='))
92
+ options.dest = a.slice('--dest='.length);
93
+ else
94
+ return { kind: 'error', message: `unknown argument: ${a}` };
95
+ }
96
+ return { kind: 'run', options };
97
+ }
98
+ export function usage() {
99
+ return [
100
+ 'usage: agy-worker-setup [--scope project|user] [--dest <.claude dir>] [--dry-run] [--force]',
101
+ '',
102
+ 'Copies the agy-ceiling skill and the /agy-ceiling slash command into a .claude directory',
103
+ '(project: ./.claude, user: ~/.claude). Existing files are left alone unless --force.',
104
+ 'Prints the `claude mcp add` line; it does not run it.',
105
+ '',
106
+ ].join('\n');
107
+ }
108
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/setup/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":""}
package/dist/setup.js ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `agy-worker-setup` — put the package's Claude Code pieces where Claude Code
4
+ * looks for them. The MCP server registers with `claude mcp add`; the skill
5
+ * (`skills/agy-ceiling`) and the slash command (`commands/agy-ceiling.md`)
6
+ * have to be copied into `.claude/` by hand — npm has no hook for that, and a
7
+ * `postinstall` that wrote into the user's home would be exactly the kind of
8
+ * unrequested write this project refuses to make. So it is a command you run
9
+ * once, and it prints what it did.
10
+ */
11
+ import { install, parseSetupArgs, usage } from './setup/install.js';
12
+ const parsed = parseSetupArgs(process.argv.slice(2));
13
+ if (parsed.kind === 'help') {
14
+ process.stdout.write(usage());
15
+ process.exit(0);
16
+ }
17
+ if (parsed.kind === 'error') {
18
+ process.stderr.write(`${parsed.message}\n\n${usage()}`);
19
+ process.exit(2);
20
+ }
21
+ const report = install(parsed.options);
22
+ process.stdout.write(report.text);
23
+ process.exit(report.ok ? 0 : 1);
24
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AACH,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAEnE,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AACpD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;IAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AACD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,OAAO,KAAK,EAAE,EAAE,CAAC,CAAA;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AACjC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA"}
@@ -0,0 +1,49 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ import { type ProjectPaths } from '../contract/paths.js';
3
+ /**
4
+ * An open per-project database plus the paths it belongs to.
5
+ *
6
+ * Synchronous on purpose: with `DatabaseSync` no `await` can
7
+ * interleave between `BEGIN IMMEDIATE` and `COMMIT`, so the lock critical section
8
+ * cannot be preempted by another task in the same process.
9
+ */
10
+ export interface Store {
11
+ db: DatabaseSync;
12
+ paths: ProjectPaths;
13
+ /** Canonical project root. */
14
+ root: string;
15
+ close(): void;
16
+ }
17
+ export interface OpenStoreOptions {
18
+ /** Directory to start project discovery from. Defaults to `process.cwd()`. */
19
+ cwd?: string;
20
+ /** Skip `ensureProjectDirs`. Only useful for read-only probes. */
21
+ readOnly?: boolean;
22
+ }
23
+ /**
24
+ * Open (creating if needed) the project database.
25
+ *
26
+ * Must, in this order: resolve the project root, create the project directory,
27
+ * open `index.db`, apply `PRAGMA journal_mode = WAL` and
28
+ * `PRAGMA busy_timeout = 5000` on *this connection* (pragmas are per-connection,
29
+ * so running `schema.sql` alone is not enough), then {@link migrate}.
30
+ */
31
+ export declare function openStore(opts?: OpenStoreOptions): Store;
32
+ /**
33
+ * Apply `schema.sql` and bring `meta.schema_version` up to
34
+ * {@link import('../contract/types.js').SCHEMA_VERSION}. Idempotent and safe when
35
+ * several server processes race to open the same file.
36
+ */
37
+ export declare function migrate(db: DatabaseSync, root: string): void;
38
+ export declare function getMeta(db: DatabaseSync, key: string): string | null;
39
+ export declare function setMeta(db: DatabaseSync, key: string, value: string): void;
40
+ /**
41
+ * Run `fn` inside a single `BEGIN IMMEDIATE` … `COMMIT`, rolling back on throw.
42
+ *
43
+ * `fn` is synchronous by signature and must stay that way — returning a promise
44
+ * from it would reopen exactly the interleaving this design rules out.
45
+ */
46
+ export declare function transaction<T>(db: DatabaseSync, fn: () => T): T;
47
+ /** Wall clock in ms. Centralized so tests can freeze it. */
48
+ export declare function now(): number;
49
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/store/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG1C,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAA;AAE7B;;;;;;GAMG;AACH,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,YAAY,CAAA;IAChB,KAAK,EAAE,YAAY,CAAA;IACnB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,IAAI,IAAI,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,gBAAgB,GAAG,KAAK,CAoCxD;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAe5D;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKpE;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAI1E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAe/D;AAED,4DAA4D;AAC5D,wBAAgB,GAAG,IAAI,MAAM,CAE5B"}
@@ -0,0 +1,101 @@
1
+ import { DatabaseSync } from 'node:sqlite';
2
+ import { SCHEMA_VERSION } from '../contract/types.js';
3
+ import { ensureProjectDirs, loadSchemaSql, projectPaths, resolveProjectRoot, } from '../contract/paths.js';
4
+ /**
5
+ * Open (creating if needed) the project database.
6
+ *
7
+ * Must, in this order: resolve the project root, create the project directory,
8
+ * open `index.db`, apply `PRAGMA journal_mode = WAL` and
9
+ * `PRAGMA busy_timeout = 5000` on *this connection* (pragmas are per-connection,
10
+ * so running `schema.sql` alone is not enough), then {@link migrate}.
11
+ */
12
+ export function openStore(opts) {
13
+ const { root } = resolveProjectRoot(opts?.cwd);
14
+ const paths = projectPaths(root);
15
+ const readOnly = opts?.readOnly ?? false;
16
+ if (!readOnly) {
17
+ ensureProjectDirs(paths);
18
+ }
19
+ // `readOnly` used to only skip `ensureProjectDirs` while still opening a
20
+ // read-write connection and running `migrate()` — every gate hook
21
+ // invocation (one per tool call, including a user's own unrelated
22
+ // interactive agy session) was therefore taking the SQLite write lock and
23
+ // re-running the whole `schema.sql` (finding 19). A genuinely read-only
24
+ // connection cannot migrate, so skip that too; the gate does not need to.
25
+ const db = new DatabaseSync(paths.db, { readOnly, open: true });
26
+ // Pragmas are per-connection: schema.sql also sets them, but a fresh
27
+ // connection reopening an existing file must set them again here.
28
+ // `busy_timeout` is kept short for a read-only (gate) connection so a
29
+ // concurrent writer never eats into the hook's ~15s budget — a timeout here
30
+ // must fall through to PASSTHROUGH, not hang.
31
+ db.exec(`PRAGMA busy_timeout = ${readOnly ? 2000 : 5000}`);
32
+ if (!readOnly) {
33
+ db.exec('PRAGMA journal_mode = WAL');
34
+ db.exec('PRAGMA foreign_keys = ON');
35
+ db.exec('PRAGMA synchronous = NORMAL');
36
+ migrate(db, root);
37
+ }
38
+ return {
39
+ db,
40
+ paths,
41
+ root,
42
+ close() {
43
+ db.close();
44
+ },
45
+ };
46
+ }
47
+ /**
48
+ * Apply `schema.sql` and bring `meta.schema_version` up to
49
+ * {@link import('../contract/types.js').SCHEMA_VERSION}. Idempotent and safe when
50
+ * several server processes race to open the same file.
51
+ */
52
+ export function migrate(db, root) {
53
+ const sql = loadSchemaSql();
54
+ db.exec(sql);
55
+ const existing = getMeta(db, 'schema_version');
56
+ if (existing === null) {
57
+ setMeta(db, 'schema_version', String(SCHEMA_VERSION));
58
+ }
59
+ // No prior versions to migrate from yet (SCHEMA_VERSION === 1). Future bumps
60
+ // add branches here, keyed off the value actually stored.
61
+ const existingRoot = getMeta(db, 'project_root');
62
+ if (existingRoot === null) {
63
+ setMeta(db, 'project_root', root);
64
+ }
65
+ }
66
+ export function getMeta(db, key) {
67
+ const row = db.prepare('SELECT value FROM meta WHERE key = ?').get(key);
68
+ return row ? row.value : null;
69
+ }
70
+ export function setMeta(db, key, value) {
71
+ db.prepare('INSERT INTO meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value').run(key, value);
72
+ }
73
+ /**
74
+ * Run `fn` inside a single `BEGIN IMMEDIATE` … `COMMIT`, rolling back on throw.
75
+ *
76
+ * `fn` is synchronous by signature and must stay that way — returning a promise
77
+ * from it would reopen exactly the interleaving this design rules out.
78
+ */
79
+ export function transaction(db, fn) {
80
+ db.exec('BEGIN IMMEDIATE');
81
+ try {
82
+ const result = fn();
83
+ db.exec('COMMIT');
84
+ return result;
85
+ }
86
+ catch (err) {
87
+ try {
88
+ db.exec('ROLLBACK');
89
+ }
90
+ catch {
91
+ // If ROLLBACK itself fails the connection is in a bad state; the
92
+ // original error is what the caller needs to see.
93
+ }
94
+ throw err;
95
+ }
96
+ }
97
+ /** Wall clock in ms. Centralized so tests can freeze it. */
98
+ export function now() {
99
+ return Date.now();
100
+ }
101
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/store/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,kBAAkB,GAEnB,MAAM,sBAAsB,CAAA;AAwB7B;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,IAAuB;IAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,KAAK,CAAA;IACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAC1B,CAAC;IAED,yEAAyE;IACzE,kEAAkE;IAClE,kEAAkE;IAClE,0EAA0E;IAC1E,wEAAwE;IACxE,0EAA0E;IAC1E,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/D,qEAAqE;IACrE,kEAAkE;IAClE,sEAAsE;IACtE,4EAA4E;IAC5E,8CAA8C;IAC9C,EAAE,CAAC,IAAI,CAAC,yBAAyB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;QACpC,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QACnC,EAAE,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;QACtC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IACnB,CAAC;IAED,OAAO;QACL,EAAE;QACF,KAAK;QACL,IAAI;QACJ,KAAK;YACH,EAAE,CAAC,KAAK,EAAE,CAAA;QACZ,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,EAAgB,EAAE,IAAY;IACpD,MAAM,GAAG,GAAG,aAAa,EAAE,CAAA;IAC3B,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEZ,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAA;IAC9C,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,CAAC,EAAE,EAAE,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAA;IACvD,CAAC;IACD,6EAA6E;IAC7E,0DAA0D;IAE1D,MAAM,YAAY,GAAG,OAAO,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;IAChD,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,CAAA;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAgB,EAAE,GAAW;IACnD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,GAAG,CAEzD,CAAA;IACb,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAgB,EAAE,GAAW,EAAE,KAAa;IAClE,EAAE,CAAC,OAAO,CACR,mGAAmG,CACpG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAI,EAAgB,EAAE,EAAW;IAC1D,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAC1B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,EAAE,CAAA;QACnB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACjB,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC;YACH,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;YACjE,kDAAkD;QACpD,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,GAAG;IACjB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAA;AACnB,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { JobRow, Lifecycle, Outcome, OnDenial, Profile, SessionMode } from '../contract/types.js';
2
+ import type { Store } from './db.js';
3
+ /** Lifecycles that count against the concurrency ceiling and hold locks. */
4
+ export declare const LIVE_LIFECYCLES: readonly Lifecycle[];
5
+ export interface NewJob {
6
+ jobId: string;
7
+ sessionId: string | null;
8
+ cwd: string;
9
+ profile: Profile;
10
+ writeMode: boolean;
11
+ sessionMode: SessionMode;
12
+ onDenial: OnDenial;
13
+ deadlineAt: number | null;
14
+ requestedBy?: string | null;
15
+ parentTaskId?: string | null;
16
+ }
17
+ export interface JobFilter {
18
+ lifecycle?: Lifecycle | Lifecycle[];
19
+ outcome?: Outcome | Outcome[];
20
+ sessionId?: string;
21
+ cwd?: string;
22
+ /** Only jobs created at or after this epoch ms. */
23
+ since?: number;
24
+ limit?: number;
25
+ }
26
+ /** Inserts with `lifecycle = 'queued'` and `created_at = now()`. */
27
+ export declare function createJob(store: Store, input: NewJob): JobRow;
28
+ /** @throws {import('../contract/errors.js').JobNotFoundError} with recent ids attached. */
29
+ export declare function getJob(store: Store, jobId: string): JobRow;
30
+ export declare function tryGetJob(store: Store, jobId: string): JobRow | null;
31
+ /**
32
+ * Patch columns and return the row as it now stands.
33
+ *
34
+ * `job_id` and `created_at` are not patchable. Callers inside a transaction must
35
+ * pass that transaction's store; this never opens one of its own.
36
+ */
37
+ export declare function updateJob(store: Store, jobId: string, patch: Partial<Omit<JobRow, 'job_id' | 'created_at'>>): JobRow;
38
+ export declare function listJobs(store: Store, filter?: JobFilter): JobRow[];
39
+ /** Jobs in {@link LIVE_LIFECYCLES}. The gate's binding candidates come from here. */
40
+ export declare function listLiveJobs(store: Store): JobRow[];
41
+ /** Ids of the most recent jobs, used to make `JobNotFoundError` self-correcting. */
42
+ export declare function recentJobIds(store: Store, limit?: number): string[];
43
+ /** Count of jobs in {@link LIVE_LIFECYCLES}. Checked against the ceiling. */
44
+ export declare function countLiveJobs(store: Store): number;
45
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/store/jobs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,MAAM,EACN,SAAS,EACT,OAAO,EACP,QAAQ,EACR,OAAO,EACP,WAAW,EACZ,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAGpC,4EAA4E;AAC5E,eAAO,MAAM,eAAe,EAAE,SAAS,SAAS,EAAmD,CAAA;AAEnG,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,WAAW,CAAA;IACxB,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,CAAA;IACnC,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AA+BD,oEAAoE;AACpE,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAkC7D;AAED,2FAA2F;AAC3F,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAU1D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKpE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,YAAY,CAAC,CAAC,GACpD,MAAM,CAuBR;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,EAAE,CAuCnE;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAEnD;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE,CAK9D;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAUlD"}
@@ -0,0 +1,150 @@
1
+ import { JobNotFoundError } from '../contract/errors.js';
2
+ import { newJobId } from '../contract/paths.js';
3
+ import { now } from './db.js';
4
+ /** Lifecycles that count against the concurrency ceiling and hold locks. */
5
+ export const LIVE_LIFECYCLES = ['queued', 'starting', 'running', 'canceling'];
6
+ function toJobRow(raw) {
7
+ return raw;
8
+ }
9
+ /** Inserts with `lifecycle = 'queued'` and `created_at = now()`. */
10
+ export function createJob(store, input) {
11
+ const jobId = input.jobId || newJobId();
12
+ const createdAt = now();
13
+ store.db
14
+ .prepare(`INSERT INTO jobs (
15
+ job_id, session_id, lifecycle, outcome, headline, cwd, profile,
16
+ write_mode, session_mode, pid, pgid, proc_start_time,
17
+ created_at, started_at, finished_at, deadline_at,
18
+ exit_code, agent_status, contract_status, on_denial,
19
+ requested_by, parent_task_id
20
+ ) VALUES (
21
+ @job_id, @session_id, @lifecycle, NULL, NULL, @cwd, @profile,
22
+ @write_mode, @session_mode, NULL, NULL, NULL,
23
+ @created_at, NULL, NULL, @deadline_at,
24
+ NULL, NULL, NULL, @on_denial,
25
+ @requested_by, @parent_task_id
26
+ )`)
27
+ .run({
28
+ job_id: jobId,
29
+ session_id: input.sessionId,
30
+ lifecycle: 'queued',
31
+ cwd: input.cwd,
32
+ profile: input.profile,
33
+ write_mode: input.writeMode ? 1 : 0,
34
+ session_mode: input.sessionMode,
35
+ created_at: createdAt,
36
+ deadline_at: input.deadlineAt,
37
+ on_denial: input.onDenial,
38
+ requested_by: input.requestedBy ?? null,
39
+ parent_task_id: input.parentTaskId ?? null,
40
+ });
41
+ return getJob(store, jobId);
42
+ }
43
+ /** @throws {import('../contract/errors.js').JobNotFoundError} with recent ids attached. */
44
+ export function getJob(store, jobId) {
45
+ const row = tryGetJob(store, jobId);
46
+ if (!row) {
47
+ throw new JobNotFoundError({
48
+ job_id: jobId,
49
+ known_recent: recentJobIds(store),
50
+ project_root: store.root,
51
+ });
52
+ }
53
+ return row;
54
+ }
55
+ export function tryGetJob(store, jobId) {
56
+ const row = store.db.prepare('SELECT * FROM jobs WHERE job_id = ?').get(jobId);
57
+ return row ? toJobRow(row) : null;
58
+ }
59
+ /**
60
+ * Patch columns and return the row as it now stands.
61
+ *
62
+ * `job_id` and `created_at` are not patchable. Callers inside a transaction must
63
+ * pass that transaction's store; this never opens one of its own.
64
+ */
65
+ export function updateJob(store, jobId, patch) {
66
+ const entries = Object.entries(patch).filter(([k]) => k !== 'job_id' && k !== 'created_at');
67
+ if (entries.length === 0)
68
+ return getJob(store, jobId);
69
+ const setClauses = entries.map(([k]) => `${k} = @${k}`).join(', ');
70
+ const params = { job_id: jobId };
71
+ for (const [k, v] of entries) {
72
+ if (k === 'write_mode') {
73
+ params[k] = v ? 1 : 0;
74
+ }
75
+ else {
76
+ params[k] = v;
77
+ }
78
+ }
79
+ const result = store.db.prepare(`UPDATE jobs SET ${setClauses} WHERE job_id = @job_id`).run(params);
80
+ if (result.changes === 0) {
81
+ throw new JobNotFoundError({
82
+ job_id: jobId,
83
+ known_recent: recentJobIds(store),
84
+ project_root: store.root,
85
+ });
86
+ }
87
+ return getJob(store, jobId);
88
+ }
89
+ export function listJobs(store, filter) {
90
+ const clauses = [];
91
+ const params = {};
92
+ if (filter?.lifecycle) {
93
+ const values = Array.isArray(filter.lifecycle) ? filter.lifecycle : [filter.lifecycle];
94
+ const placeholders = values.map((v, i) => `@lifecycle${i}`);
95
+ values.forEach((v, i) => {
96
+ params[`lifecycle${i}`] = v;
97
+ });
98
+ clauses.push(`lifecycle IN (${placeholders.join(', ')})`);
99
+ }
100
+ if (filter?.outcome) {
101
+ const values = Array.isArray(filter.outcome) ? filter.outcome : [filter.outcome];
102
+ const placeholders = values.map((v, i) => `@outcome${i}`);
103
+ values.forEach((v, i) => {
104
+ params[`outcome${i}`] = v;
105
+ });
106
+ clauses.push(`outcome IN (${placeholders.join(', ')})`);
107
+ }
108
+ if (filter?.sessionId) {
109
+ clauses.push('session_id = @session_id');
110
+ params.session_id = filter.sessionId;
111
+ }
112
+ if (filter?.cwd) {
113
+ clauses.push('cwd = @cwd');
114
+ params.cwd = filter.cwd;
115
+ }
116
+ if (filter?.since !== undefined) {
117
+ clauses.push('created_at >= @since');
118
+ params.since = filter.since;
119
+ }
120
+ const where = clauses.length ? `WHERE ${clauses.join(' AND ')}` : '';
121
+ const limit = filter?.limit && filter.limit > 0 ? Math.floor(filter.limit) : 100;
122
+ const rows = store.db
123
+ .prepare(`SELECT * FROM jobs ${where} ORDER BY created_at DESC LIMIT ${limit}`)
124
+ .all(params);
125
+ return rows.map(toJobRow);
126
+ }
127
+ /** Jobs in {@link LIVE_LIFECYCLES}. The gate's binding candidates come from here. */
128
+ export function listLiveJobs(store) {
129
+ return listJobs(store, { lifecycle: [...LIVE_LIFECYCLES], limit: 10000 });
130
+ }
131
+ /** Ids of the most recent jobs, used to make `JobNotFoundError` self-correcting. */
132
+ export function recentJobIds(store, limit = 5) {
133
+ const rows = store.db
134
+ .prepare('SELECT job_id FROM jobs ORDER BY created_at DESC LIMIT ?')
135
+ .all(limit);
136
+ return rows.map((r) => r.job_id);
137
+ }
138
+ /** Count of jobs in {@link LIVE_LIFECYCLES}. Checked against the ceiling. */
139
+ export function countLiveJobs(store) {
140
+ const placeholders = LIVE_LIFECYCLES.map((_, i) => `@l${i}`).join(', ');
141
+ const params = {};
142
+ LIVE_LIFECYCLES.forEach((v, i) => {
143
+ params[`l${i}`] = v;
144
+ });
145
+ const row = store.db
146
+ .prepare(`SELECT COUNT(*) as n FROM jobs WHERE lifecycle IN (${placeholders})`)
147
+ .get(params);
148
+ return row.n;
149
+ }
150
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/store/jobs.ts"],"names":[],"mappings":"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"}