@tagma/sdk 0.7.3 → 0.7.4

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 (92) hide show
  1. package/README.md +26 -5
  2. package/dist/adapters/stdin-approval.d.ts +1 -5
  3. package/dist/adapters/stdin-approval.d.ts.map +1 -1
  4. package/dist/adapters/stdin-approval.js +1 -89
  5. package/dist/adapters/stdin-approval.js.map +1 -1
  6. package/dist/adapters/websocket-approval.d.ts +1 -27
  7. package/dist/adapters/websocket-approval.d.ts.map +1 -1
  8. package/dist/adapters/websocket-approval.js +1 -146
  9. package/dist/adapters/websocket-approval.js.map +1 -1
  10. package/dist/approval.d.ts +2 -12
  11. package/dist/approval.d.ts.map +1 -1
  12. package/dist/approval.js +1 -90
  13. package/dist/approval.js.map +1 -1
  14. package/dist/bootstrap.d.ts +1 -1
  15. package/dist/bootstrap.d.ts.map +1 -1
  16. package/dist/core/task-executor.d.ts.map +1 -1
  17. package/dist/core/task-executor.js +13 -4
  18. package/dist/core/task-executor.js.map +1 -1
  19. package/dist/engine.d.ts +5 -56
  20. package/dist/engine.d.ts.map +1 -1
  21. package/dist/engine.js +7 -297
  22. package/dist/engine.js.map +1 -1
  23. package/dist/index.d.ts +4 -6
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +2 -4
  26. package/dist/index.js.map +1 -1
  27. package/dist/logger.d.ts +2 -60
  28. package/dist/logger.d.ts.map +1 -1
  29. package/dist/logger.js +1 -153
  30. package/dist/logger.js.map +1 -1
  31. package/dist/plugins.d.ts +2 -2
  32. package/dist/plugins.d.ts.map +1 -1
  33. package/dist/plugins.js +1 -1
  34. package/dist/plugins.js.map +1 -1
  35. package/dist/registry.d.ts +2 -66
  36. package/dist/registry.d.ts.map +1 -1
  37. package/dist/registry.js +1 -292
  38. package/dist/registry.js.map +1 -1
  39. package/dist/runner.d.ts +1 -35
  40. package/dist/runner.d.ts.map +1 -1
  41. package/dist/runner.js +1 -610
  42. package/dist/runner.js.map +1 -1
  43. package/dist/runtime/adapters/stdin-approval.d.ts +2 -0
  44. package/dist/runtime/adapters/stdin-approval.d.ts.map +1 -0
  45. package/dist/runtime/adapters/stdin-approval.js +2 -0
  46. package/dist/runtime/adapters/stdin-approval.js.map +1 -0
  47. package/dist/runtime/adapters/websocket-approval.d.ts +2 -0
  48. package/dist/runtime/adapters/websocket-approval.d.ts.map +1 -0
  49. package/dist/runtime/adapters/websocket-approval.js +2 -0
  50. package/dist/runtime/adapters/websocket-approval.js.map +1 -0
  51. package/dist/runtime/bun-process-runner.d.ts +2 -0
  52. package/dist/runtime/bun-process-runner.d.ts.map +1 -0
  53. package/dist/runtime/bun-process-runner.js +2 -0
  54. package/dist/runtime/bun-process-runner.js.map +1 -0
  55. package/dist/runtime.d.ts +2 -8
  56. package/dist/runtime.d.ts.map +1 -1
  57. package/dist/runtime.js +1 -7
  58. package/dist/runtime.js.map +1 -1
  59. package/dist/tagma.d.ts +3 -4
  60. package/dist/tagma.d.ts.map +1 -1
  61. package/dist/tagma.js +2 -3
  62. package/dist/tagma.js.map +1 -1
  63. package/dist/triggers/file.d.ts.map +1 -1
  64. package/dist/triggers/file.js +74 -107
  65. package/dist/triggers/file.js.map +1 -1
  66. package/package.json +15 -4
  67. package/src/adapters/stdin-approval.ts +1 -106
  68. package/src/adapters/websocket-approval.ts +1 -224
  69. package/src/approval.ts +5 -127
  70. package/src/bootstrap.ts +1 -1
  71. package/src/core/run-context.test.ts +35 -0
  72. package/src/core/task-executor.ts +13 -4
  73. package/src/engine-ports-mixed.test.ts +70 -44
  74. package/src/engine-ports.test.ts +77 -33
  75. package/src/engine.ts +18 -444
  76. package/src/index.ts +4 -6
  77. package/src/logger.ts +2 -182
  78. package/src/package-split.test.ts +15 -0
  79. package/src/pipeline-runner.test.ts +65 -12
  80. package/src/plugin-registry.test.ts +69 -3
  81. package/src/plugins.ts +2 -2
  82. package/src/registry.ts +7 -353
  83. package/src/runner.ts +1 -666
  84. package/src/runtime/adapters/stdin-approval.ts +1 -0
  85. package/src/runtime/adapters/websocket-approval.ts +1 -0
  86. package/src/runtime/bun-process-runner.ts +1 -0
  87. package/src/runtime-adapters.test.ts +10 -0
  88. package/src/runtime.ts +12 -20
  89. package/src/tagma.test.ts +162 -0
  90. package/src/tagma.ts +9 -4
  91. package/src/triggers/file.test.ts +79 -0
  92. package/src/triggers/file.ts +85 -118
@@ -0,0 +1,2 @@
1
+ export * from '@tagma/runtime-bun/adapters/websocket-approval';
2
+ //# sourceMappingURL=websocket-approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-approval.js","sourceRoot":"","sources":["../../../src/runtime/adapters/websocket-approval.ts"],"names":[],"mappings":"AAAA,cAAc,gDAAgD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { runCommand, runSpawn } from '@tagma/runtime-bun';
2
+ //# sourceMappingURL=bun-process-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bun-process-runner.d.ts","sourceRoot":"","sources":["../../src/runtime/bun-process-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { runCommand, runSpawn } from '@tagma/runtime-bun';
2
+ //# sourceMappingURL=bun-process-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bun-process-runner.js","sourceRoot":"","sources":["../../src/runtime/bun-process-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/runtime.d.ts CHANGED
@@ -1,9 +1,3 @@
1
- import type { DriverPlugin, SpawnSpec, TaskResult } from './types';
2
- import { type RunOptions } from './runner';
3
- export type { RunOptions };
4
- export interface TagmaRuntime {
5
- runSpawn(spec: SpawnSpec, driver: DriverPlugin | null, options?: RunOptions): Promise<TaskResult>;
6
- runCommand(command: string, cwd: string, options?: RunOptions): Promise<TaskResult>;
7
- }
8
- export declare function bunRuntime(): TagmaRuntime;
1
+ export * from '@tagma/runtime-bun';
2
+ export type { OpenRunLogOptions, PruneLogOptions, RunOptions, RuntimeLogSink, RuntimeLogStore, RuntimeWatchEvent, RuntimeWatchOptions, TagmaRuntime, TaskOutputPathOptions, } from '@tagma/core';
9
3
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAEjE,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B,MAAM,WAAW,YAAY;IAC3B,QAAQ,CACN,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,YAAY,GAAG,IAAI,EAC3B,OAAO,CAAC,EAAE,UAAU,GACnB,OAAO,CAAC,UAAU,CAAC,CAAC;IACvB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACrF;AAED,wBAAgB,UAAU,IAAI,YAAY,CAKzC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,GACtB,MAAM,aAAa,CAAC"}
package/dist/runtime.js CHANGED
@@ -1,8 +1,2 @@
1
- import { runCommand, runSpawn } from './runner';
2
- export function bunRuntime() {
3
- return {
4
- runSpawn,
5
- runCommand,
6
- };
7
- }
1
+ export * from '@tagma/runtime-bun';
8
2
  //# sourceMappingURL=runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAmB,MAAM,UAAU,CAAC;AAajE,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,QAAQ;QACR,UAAU;KACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
package/dist/tagma.d.ts CHANGED
@@ -1,6 +1,5 @@
1
- import { type EngineResult, type RunPipelineOptions } from './engine';
2
- import { PluginRegistry } from './registry';
3
- import { type TagmaRuntime } from './runtime';
1
+ import { PluginRegistry, type EngineResult, type RunPipelineOptions } from '@tagma/core';
2
+ import type { TagmaRuntime } from '@tagma/core';
4
3
  import type { PipelineConfig, TagmaPlugin } from './types';
5
4
  export interface CreateTagmaOptions {
6
5
  /**
@@ -22,7 +21,7 @@ export interface CreateTagmaOptions {
22
21
  */
23
22
  readonly runtime?: TagmaRuntime;
24
23
  }
25
- export interface TagmaRunOptions extends Omit<RunPipelineOptions, 'registry'> {
24
+ export interface TagmaRunOptions extends Omit<RunPipelineOptions, 'registry' | 'runtime'> {
26
25
  readonly cwd: string;
27
26
  }
28
27
  export interface Tagma {
@@ -1 +1 @@
1
- {"version":3,"file":"tagma.d.ts","sourceRoot":"","sources":["../src/tagma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnF,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;CACjC;AAED,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC;IAC3E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7E,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,MAAM,EAAE,CAAC;CACrD;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,KAAK,CAuBnE"}
1
+ {"version":3,"file":"tagma.d.ts","sourceRoot":"","sources":["../src/tagma.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACxB,MAAM,aAAa,CAAC;AAIrB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3D,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;CACjC;AAED,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,SAAS,CAAC;IACvF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7E,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,MAAM,EAAE,CAAC;CACrD;AAED,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,KAAK,CAuBnE"}
package/dist/tagma.js CHANGED
@@ -1,8 +1,7 @@
1
- import { runPipeline } from './engine';
1
+ import { PluginRegistry, runPipeline, } from '@tagma/core';
2
2
  import { bootstrapBuiltins } from './bootstrap';
3
- import { PluginRegistry } from './registry';
4
3
  import { validateConfig } from './schema';
5
- import { bunRuntime } from './runtime';
4
+ import { bunRuntime } from '@tagma/runtime-bun';
6
5
  export function createTagma(options = {}) {
7
6
  const registry = options.registry ?? new PluginRegistry();
8
7
  const runtime = options.runtime ?? bunRuntime();
package/dist/tagma.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tagma.js","sourceRoot":"","sources":["../src/tagma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA8C,MAAM,UAAU,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAqB,MAAM,WAAW,CAAC;AAkC1D,MAAM,UAAU,WAAW,CAAC,UAA8B,EAAE;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,cAAc,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC;IAChD,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC/B,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAC3C,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,OAAO;QACL,QAAQ;QACR,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,UAAU,EAAE;YAChC,OAAO,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC9B,GAAG,UAAU;gBACb,QAAQ;gBACR,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QACD,QAAQ,CAAC,MAAM;YACb,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"tagma.js","sourceRoot":"","sources":["../src/tagma.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,WAAW,GAGZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAmChD,MAAM,UAAU,WAAW,CAAC,UAA8B,EAAE;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,cAAc,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC;IAChD,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC/B,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QAC3C,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,OAAO;QACL,QAAQ;QACR,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,UAAU,EAAE;YAChC,OAAO,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC9B,GAAG,UAAU;gBACb,QAAQ;gBACR,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QACD,QAAQ,CAAC,MAAM;YACb,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/triggers/file.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,UAAU,CAAC;AAU9D,eAAO,MAAM,WAAW,EAAE,aAsJzB,CAAC"}
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/triggers/file.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,UAAU,CAAC;AAU9D,eAAO,MAAM,WAAW,EAAE,aA4BzB,CAAC"}
@@ -1,8 +1,6 @@
1
- import { watch } from 'chokidar';
2
1
  import { resolve, dirname } from 'path';
3
- import { mkdir } from 'fs/promises';
4
2
  import { parseDuration, validatePath } from '../utils';
5
- import { TriggerTimeoutError } from '../engine';
3
+ import { TriggerTimeoutError } from '../core/trigger-errors';
6
4
  const IS_WINDOWS = process.platform === 'win32';
7
5
  function pathsEqual(a, b) {
8
6
  return IS_WINDOWS ? a.toLowerCase() === b.toLowerCase() : a === b;
@@ -31,112 +29,81 @@ export const FileTrigger = {
31
29
  throw new Error(`file trigger: "path" is required`);
32
30
  const safePath = validatePath(filePath, ctx.workDir);
33
31
  const timeoutMs = config.timeout != null ? parseDuration(String(config.timeout)) : 0;
34
- // Hoist the async work into a named async function so the Promise
35
- // constructor itself is synchronous — avoids the no-async-promise-executor
36
- // lint error and ensures exceptions are always propagated via reject().
37
- async function start(resolve_p, reject) {
38
- if (ctx.signal.aborted) {
39
- reject(new Error('Pipeline aborted'));
40
- return;
41
- }
42
- let settled = false;
43
- let timer = null;
44
- // Ensure the parent directory exists so the watcher doesn't fail
45
- // with ENOENT for nested paths like `build/output/result.json`.
46
- const dir = dirname(safePath);
47
- try {
48
- await mkdir(dir, { recursive: true });
49
- }
50
- catch {
51
- /* best effort — dir may already exist */
52
- }
53
- // Pass `cwd: dir` so chokidar resolves paths relative to the watched
54
- // directory. The 'add'/'change' events will then carry paths relative
55
- // to `dir`, which we resolve with `resolve(dir, addedPath)` for an
56
- // accurate absolute comparison — fixing the ambiguous process.cwd()
57
- // resolution of the previous implementation.
58
- const watcher = watch(dir, {
59
- ignoreInitial: true,
60
- depth: 0,
61
- cwd: dir,
62
- awaitWriteFinish: { stabilityThreshold: 100, pollInterval: 50 },
63
- });
64
- const cleanup = () => {
65
- if (settled)
66
- return;
67
- settled = true;
68
- watcher.close().catch(() => {
69
- /* ignore */
70
- });
71
- if (timer)
72
- clearTimeout(timer);
73
- ctx.signal.removeEventListener('abort', onAbort);
74
- };
75
- const onAbort = () => {
76
- cleanup();
77
- reject(new Error('Pipeline aborted'));
78
- };
79
- watcher.on('add', (addedPath) => {
80
- if (settled)
81
- return;
82
- if (pathsEqual(resolve(dir, addedPath), safePath)) {
83
- cleanup();
84
- resolve_p({ path: safePath });
32
+ return waitForFile({ filePath, safePath, timeoutMs, timeoutLabel: config.timeout, ctx });
33
+ },
34
+ };
35
+ async function waitForFile(options) {
36
+ const { filePath, safePath, timeoutMs, timeoutLabel, ctx } = options;
37
+ if (ctx.signal.aborted)
38
+ throw new Error('Pipeline aborted');
39
+ const dir = dirname(safePath);
40
+ await ctx.runtime.ensureDir(dir).catch(() => {
41
+ /* best effort; runtime watch will surface real failures */
42
+ });
43
+ const watchController = new AbortController();
44
+ let removeAbortListener = () => {
45
+ /* no-op until the abort listener is installed */
46
+ };
47
+ const abortPromise = new Promise((_, reject) => {
48
+ const onAbort = () => {
49
+ watchController.abort();
50
+ reject(new Error('Pipeline aborted'));
51
+ };
52
+ ctx.signal.addEventListener('abort', onAbort, { once: true });
53
+ removeAbortListener = () => ctx.signal.removeEventListener('abort', onAbort);
54
+ });
55
+ let timer = null;
56
+ const timeoutPromise = timeoutMs > 0
57
+ ? new Promise((_, reject) => {
58
+ timer = setTimeout(() => {
59
+ watchController.abort();
60
+ reject(new TriggerTimeoutError(`file trigger timeout: ${filePath} did not appear within ${timeoutLabel}`));
61
+ }, timeoutMs);
62
+ })
63
+ : new Promise(() => {
64
+ /* no timeout */
65
+ });
66
+ async function watchLoop() {
67
+ // Pass `cwd: dir` so runtimes can emit paths relative to the watched
68
+ // directory. The 'add'/'change' events are resolved against `dir` before
69
+ // comparison, preserving the old chokidar behavior without coupling this
70
+ // trigger to chokidar or Bun file APIs.
71
+ for await (const event of ctx.runtime.watch(dir, {
72
+ ignoreInitial: true,
73
+ depth: 0,
74
+ cwd: dir,
75
+ awaitWriteFinishMs: 100,
76
+ signal: watchController.signal,
77
+ })) {
78
+ if (event.type === 'ready') {
79
+ let exists = false;
80
+ try {
81
+ exists = await ctx.runtime.fileExists(safePath);
85
82
  }
86
- });
87
- // Also fire on 'change' so that overwriting an existing file is detected.
88
- // Without this, upstream tasks that truncate-and-rewrite a file emit only
89
- // a 'change' event and the downstream trigger would never resolve.
90
- watcher.on('change', (changedPath) => {
91
- if (settled)
92
- return;
93
- if (pathsEqual(resolve(dir, changedPath), safePath)) {
94
- cleanup();
95
- resolve_p({ path: safePath });
83
+ catch (err) {
84
+ throw new Error(`file trigger existence check failed: ${err instanceof Error ? err.message : String(err)}`);
96
85
  }
97
- });
98
- watcher.on('error', (err) => {
99
- if (settled)
100
- return;
101
- cleanup();
102
- reject(new Error(`file trigger watch error: ${err instanceof Error ? err.message : String(err)}`));
103
- });
104
- // After the watcher finishes its initial scan, check if the file already exists.
105
- // Doing this inside 'ready' eliminates the race window between existence check
106
- // and watcher startup, so we neither miss events nor double-resolve.
107
- watcher.on('ready', () => {
108
- if (settled)
109
- return;
110
- Bun.file(safePath)
111
- .exists()
112
- .then((exists) => {
113
- if (settled)
114
- return;
115
- if (exists) {
116
- cleanup();
117
- resolve_p({ path: safePath });
118
- }
119
- })
120
- .catch((err) => {
121
- if (settled)
122
- return;
123
- cleanup();
124
- reject(new Error(`file trigger existence check failed: ${err instanceof Error ? err.message : String(err)}`));
125
- });
126
- });
127
- if (timeoutMs > 0) {
128
- timer = setTimeout(() => {
129
- if (settled)
130
- return;
131
- cleanup();
132
- reject(new TriggerTimeoutError(`file trigger timeout: ${filePath} did not appear within ${config.timeout}`));
133
- }, timeoutMs);
86
+ if (exists)
87
+ return { path: safePath };
88
+ continue;
89
+ }
90
+ if ((event.type === 'add' || event.type === 'change') &&
91
+ pathsEqual(resolve(dir, event.path), safePath)) {
92
+ return { path: safePath };
134
93
  }
135
- ctx.signal.addEventListener('abort', onAbort);
136
94
  }
137
- return new Promise((resolve_p, reject) => {
138
- start(resolve_p, reject).catch(reject);
139
- });
140
- },
141
- };
95
+ if (ctx.signal.aborted)
96
+ throw new Error('Pipeline aborted');
97
+ throw new Error(`file trigger watch ended before ${filePath} appeared`);
98
+ }
99
+ try {
100
+ return await Promise.race([watchLoop(), timeoutPromise, abortPromise]);
101
+ }
102
+ finally {
103
+ if (timer !== null)
104
+ clearTimeout(timer);
105
+ removeAbortListener();
106
+ watchController.abort();
107
+ }
108
+ }
142
109
  //# sourceMappingURL=file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/triggers/file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/triggers/file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAEhD,SAAS,UAAU,CAAC,CAAS,EAAE,CAAS;IACtC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE;QACN,WAAW,EAAE,gEAAgE;QAC7E,MAAM,EAAE;YACN,IAAI,EAAE;gBACJ,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,8DAA8D;gBAC3E,WAAW,EAAE,wBAAwB;aACtC;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,UAAU;gBAChB,WAAW,EAAE,mEAAmE;gBAChF,WAAW,EAAE,KAAK;aACnB;SACF;KACF;IAED,KAAK,CAAC,MAA+B,EAAE,GAAmB;QACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAc,CAAC;QACvC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAEnE,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAErF,OAAO,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3F,CAAC;CACF,CAAC;AAEF,KAAK,UAAU,WAAW,CAAC,OAM1B;IACC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IACrE,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAE5D,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QAC1C,2DAA2D;IAC7D,CAAC,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,IAAI,mBAAmB,GAAG,GAAG,EAAE;QAC7B,iDAAiD;IACnD,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QACpD,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,eAAe,CAAC,KAAK,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC;QACF,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,mBAAmB,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,IAAI,KAAK,GAAyC,IAAI,CAAC;IACvD,MAAM,cAAc,GAClB,SAAS,GAAG,CAAC;QACX,CAAC,CAAC,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,eAAe,CAAC,KAAK,EAAE,CAAC;gBACxB,MAAM,CACJ,IAAI,mBAAmB,CACrB,yBAAyB,QAAQ,0BAA0B,YAAY,EAAE,CAC1E,CACF,CAAC;YACJ,CAAC,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC,CAAC;QACJ,CAAC,CAAC,IAAI,OAAO,CAAQ,GAAG,EAAE;YACtB,gBAAgB;QAClB,CAAC,CAAC,CAAC;IAET,KAAK,UAAU,SAAS;QACtB,qEAAqE;QACrE,yEAAyE;QACzE,yEAAyE;QACzE,wCAAwC;QACxC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE;YAC/C,aAAa,EAAE,IAAI;YACnB,KAAK,EAAE,CAAC;YACR,GAAG,EAAE,GAAG;YACR,kBAAkB,EAAE,GAAG;YACvB,MAAM,EAAE,eAAe,CAAC,MAAM;SAC/B,CAAC,EAAE,CAAC;YACH,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC3B,IAAI,MAAM,GAAG,KAAK,CAAC;gBACnB,IAAI,CAAC;oBACH,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAClD,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CACb,wCAAwC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC3F,CAAC;gBACJ,CAAC;gBACD,IAAI,MAAM;oBAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;gBACtC,SAAS;YACX,CAAC;YAED,IACE,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;gBACjD,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,EAC9C,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,WAAW,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;IACzE,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,KAAK,IAAI;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QACxC,mBAAmB,EAAE,CAAC;QACtB,eAAe,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tagma/sdk",
3
- "version": "0.7.3",
3
+ "version": "0.7.4",
4
4
  "description": "Local AI task orchestration engine — core SDK for tagma pipelines",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -66,6 +66,16 @@
66
66
  "import": "./dist/adapters/websocket-approval.js",
67
67
  "default": "./dist/adapters/websocket-approval.js"
68
68
  },
69
+ "./runtime/adapters/stdin-approval": {
70
+ "types": "./dist/runtime/adapters/stdin-approval.d.ts",
71
+ "import": "./dist/runtime/adapters/stdin-approval.js",
72
+ "default": "./dist/runtime/adapters/stdin-approval.js"
73
+ },
74
+ "./runtime/adapters/websocket-approval": {
75
+ "types": "./dist/runtime/adapters/websocket-approval.d.ts",
76
+ "import": "./dist/runtime/adapters/websocket-approval.js",
77
+ "default": "./dist/runtime/adapters/websocket-approval.js"
78
+ },
69
79
  "./ports": {
70
80
  "types": "./dist/ports.d.ts",
71
81
  "import": "./dist/ports.js",
@@ -92,8 +102,9 @@
92
102
  "release:publish": "bun scripts/release.ts --publish"
93
103
  },
94
104
  "dependencies": {
95
- "@tagma/types": "0.4.11",
96
- "js-yaml": "^4.1.0",
97
- "chokidar": "^4.0.0"
105
+ "@tagma/core": "0.1.0",
106
+ "@tagma/runtime-bun": "0.1.0",
107
+ "@tagma/types": "0.4.12",
108
+ "js-yaml": "^4.1.0"
98
109
  }
99
110
  }
@@ -1,106 +1 @@
1
- import * as readline from 'readline';
2
- import type { ApprovalGateway, ApprovalRequest } from '../approval';
3
-
4
- // ═══ CLI Stdin Adapter ═══
5
- //
6
- // Subscribes to the gateway's 'requested' events, prompts the user on stdout,
7
- // reads a line from stdin, and calls gateway.resolve(). Handles at most one
8
- // prompt at a time — additional requests queue up.
9
-
10
- export interface StdinApprovalAdapter {
11
- readonly detach: () => void;
12
- }
13
-
14
- export function attachStdinApprovalAdapter(gateway: ApprovalGateway): StdinApprovalAdapter {
15
- const queue: ApprovalRequest[] = [];
16
- let processing = false;
17
- let rl: readline.Interface | null = null;
18
-
19
- function ensureReadline(): readline.Interface {
20
- if (!rl) {
21
- rl = readline.createInterface({ input: process.stdin, terminal: false });
22
- }
23
- return rl;
24
- }
25
-
26
- function readOneLine(): Promise<string> {
27
- return new Promise((resolvePromise) => {
28
- const reader = ensureReadline();
29
- const handler = (line: string): void => {
30
- reader.off('line', handler);
31
- resolvePromise(line);
32
- };
33
- reader.on('line', handler);
34
- });
35
- }
36
-
37
- async function processNext(): Promise<void> {
38
- if (processing) return;
39
- processing = true;
40
- try {
41
- while (queue.length > 0) {
42
- const req = queue.shift()!;
43
- // If the request was already resolved by another path while queued, skip it.
44
- if (!gateway.pending().some((p) => p.id === req.id)) continue;
45
-
46
- process.stdout.write(
47
- `\n[APPROVAL REQUIRED] ${req.message}\n` +
48
- ` id: ${req.id}\n` +
49
- ` task: ${req.taskId}${req.trackId ? ` (track: ${req.trackId})` : ''}\n` +
50
- ` approve / reject > `,
51
- );
52
-
53
- const input = (await readOneLine()).trim().toLowerCase();
54
-
55
- const approveAliases = new Set(['approve', 'yes', 'y', 'ok', 'true', '1']);
56
- const rejectAliases = new Set(['reject', 'no', 'n', 'deny', 'false', '0']);
57
-
58
- if (approveAliases.has(input)) {
59
- gateway.resolve(req.id, { outcome: 'approved', actor: 'cli' });
60
- } else if (rejectAliases.has(input)) {
61
- gateway.resolve(req.id, {
62
- outcome: 'rejected',
63
- actor: 'cli',
64
- reason: 'user rejected via CLI',
65
- });
66
- } else {
67
- process.stdout.write(` unrecognized input "${input}" — treating as rejection\n`);
68
- gateway.resolve(req.id, {
69
- outcome: 'rejected',
70
- actor: 'cli',
71
- reason: `unrecognized CLI input: ${input}`,
72
- });
73
- }
74
- }
75
- } finally {
76
- processing = false;
77
- }
78
- }
79
-
80
- const unsubscribe = gateway.subscribe((event) => {
81
- switch (event.type) {
82
- case 'requested':
83
- queue.push(event.request);
84
- void processNext();
85
- return;
86
- case 'resolved':
87
- case 'expired':
88
- case 'aborted': {
89
- // Drop from queue if it's still waiting its turn.
90
- const idx = queue.findIndex((r) => r.id === event.request.id);
91
- if (idx >= 0) queue.splice(idx, 1);
92
- return;
93
- }
94
- }
95
- });
96
-
97
- return {
98
- detach: () => {
99
- unsubscribe();
100
- if (rl) {
101
- rl.close();
102
- rl = null;
103
- }
104
- },
105
- };
106
- }
1
+ export * from '../runtime/adapters/stdin-approval';