@farmslot/protocol 0.80.0 → 0.81.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.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,10 @@ All notable changes to `@farmslot/protocol` are tracked here.
6
6
 
7
7
  - Active-development baseline; add user-facing changes here before release or package publication.
8
8
 
9
+ ## 0.81.0 - 2026-11-07
10
+
11
+ - Define capability-gated persistent node commands, durable outcomes and bounded resumable streams without changing peer compatibility rules.
12
+
9
13
  ## 0.80.0 - 2026-11-07
10
14
 
11
15
  - Share native tool diffs and text-diff formatting between clients, with optional registered-agent effort choices.
package/dist/index.d.ts CHANGED
@@ -63,6 +63,8 @@ export * from './transport/events.js';
63
63
  export * from './transport/frames.js';
64
64
  export * from './transport/gateway-recovery.js';
65
65
  export * from './transport/gateway-tls.js';
66
+ export * from './transport/node-link.js';
67
+ export * from './transport/node-link-operations.js';
66
68
  export * from './transport/observations.js';
67
69
  export * from './transport/signal.js';
68
70
  export { MINIMUM_PROTOCOL_VERSION, PROTOCOL_VERSION } from './version.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC1E,cAAc,oCAAoC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC1E,cAAc,oCAAoC,CAAC"}
package/dist/index.js CHANGED
@@ -63,6 +63,8 @@ export * from './transport/events.js';
63
63
  export * from './transport/frames.js';
64
64
  export * from './transport/gateway-recovery.js';
65
65
  export * from './transport/gateway-tls.js';
66
+ export * from './transport/node-link.js';
67
+ export * from './transport/node-link-operations.js';
66
68
  export * from './transport/observations.js';
67
69
  export * from './transport/signal.js';
68
70
  export { MINIMUM_PROTOCOL_VERSION, PROTOCOL_VERSION } from './version.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC1E,cAAc,oCAAoC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,qCAAqC,CAAC;AACpD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC1E,cAAc,oCAAoC,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Published prebuilds can lose their executable bit during dependency installation. */
2
+ export declare function ensureNodePtySpawnHelpersExecutable(callerUrl: string): void;
3
+ //# sourceMappingURL=node-pty-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-pty-helper.d.ts","sourceRoot":"","sources":["../../src/node/node-pty-helper.ts"],"names":[],"mappings":"AAIA,wFAAwF;AACxF,wBAAgB,mCAAmC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAsB3E"}
@@ -0,0 +1,33 @@
1
+ import { chmodSync, readdirSync, statSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import path from 'node:path';
4
+ /** Published prebuilds can lose their executable bit during dependency installation. */
5
+ export function ensureNodePtySpawnHelpersExecutable(callerUrl) {
6
+ const require = createRequire(callerUrl);
7
+ const prebuilds = path.join(path.dirname(require.resolve('node-pty/package.json')), 'prebuilds');
8
+ let platforms;
9
+ try {
10
+ platforms = readdirSync(prebuilds);
11
+ }
12
+ catch (error) {
13
+ // A source-built node-pty can use its native fork without packaged spawn helpers.
14
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT')
15
+ return;
16
+ throw error;
17
+ }
18
+ for (const platform of platforms) {
19
+ const helper = path.join(prebuilds, platform, 'spawn-helper');
20
+ let mode;
21
+ try {
22
+ mode = statSync(helper).mode;
23
+ }
24
+ catch (error) {
25
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT')
26
+ continue;
27
+ throw error;
28
+ }
29
+ if ((mode & 0o111) !== 0o111)
30
+ chmodSync(helper, mode | 0o755);
31
+ }
32
+ }
33
+ //# sourceMappingURL=node-pty-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-pty-helper.js","sourceRoot":"","sources":["../../src/node/node-pty-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,wFAAwF;AACxF,MAAM,UAAU,mCAAmC,CAAC,SAAiB;IACnE,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACjG,IAAI,SAAmB,CAAC;IACxB,IAAI,CAAC;QACH,SAAS,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kFAAkF;QAClF,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QACjF,MAAM,KAAK,CAAC;IACd,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC9D,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACnF,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,KAAK;YAAE,SAAS,CAAC,MAAM,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
@@ -57,4 +57,7 @@ export declare function readPoolFiles<P = SlotPoolFile>(poolDir: string): PoolFi
57
57
  * ignored and unparsable pool files. An unreadable pool directory throws.
58
58
  */
59
59
  export declare function findSlotByRepo<P extends SlotPoolFile = SlotPoolFile>(poolDir: string, realTarget: string, options?: SlotByRepoOptions): Promise<SlotByRepoMatch<P> | null>;
60
+ /** One default-off setting, read by gateway routing and the existing node service. */
61
+ export declare const NODE_LINK_FLAG = "FARMSLOT_NODE_LINK_ENABLED";
62
+ export declare function configuredNodeLinkEnabled(machine: string, poolDirectory: string): boolean;
60
63
  //# sourceMappingURL=slot-by-repo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"slot-by-repo.d.ts","sourceRoot":"","sources":["../../src/node/slot-by-repo.ts"],"names":[],"mappings":"AAKA,iFAAiF;AACjF,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY;IACpE,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IAKtC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE;IAJ/B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;IACnD,QAAQ,CAAC,QAAQ,KAAK;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEjB,UAAU,EAAE,MAAM,EAAE,EAC7B,QAAQ,CAAC,EAAE,MAAM;CAWpB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAM7F;AAED,2DAA2D;AAC3D,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,GAAG,eAAe,GAAG,eAAe,CAAC;AAExF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAAG,SAAS,CAOxD;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,CAAC;CACT;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,CAAC,GAAG,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,CAqBnF;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EACxE,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAmCpC"}
1
+ {"version":3,"file":"slot-by-repo.d.ts","sourceRoot":"","sources":["../../src/node/slot-by-repo.ts"],"names":[],"mappings":"AAKA,iFAAiF;AACjF,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY;IACpE,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IAKtC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE;IAJ/B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;IACnD,QAAQ,CAAC,QAAQ,KAAK;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEjB,UAAU,EAAE,MAAM,EAAE,EAC7B,QAAQ,CAAC,EAAE,MAAM;CAWpB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAM7F;AAED,2DAA2D;AAC3D,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,GAAG,eAAe,GAAG,eAAe,CAAC;AAExF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GAAG,SAAS,CAOxD;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,CAAC;CACT;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,CAAC,GAAG,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,CAqBnF;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EACxE,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAmCpC;AAED,sFAAsF;AACtF,eAAO,MAAM,cAAc,+BAA+B,CAAC;AAE3D,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAoBzF"}
@@ -116,4 +116,30 @@ export async function findSlotByRepo(poolDir, realTarget, options = {}) {
116
116
  throw new SlotByRepoError([], options.slotId);
117
117
  return candidates[0] ?? null;
118
118
  }
119
+ /** One default-off setting, read by gateway routing and the existing node service. */
120
+ export const NODE_LINK_FLAG = 'FARMSLOT_NODE_LINK_ENABLED';
121
+ export function configuredNodeLinkEnabled(machine, poolDirectory) {
122
+ if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(machine))
123
+ throw new Error('Invalid node machine identity');
124
+ let content;
125
+ try {
126
+ content = readFileSync(path.join(poolDirectory, `${machine}.json`), 'utf8');
127
+ }
128
+ catch (error) {
129
+ // Older/private installations may have no canonical machine pool yet: the pilot stays off.
130
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT')
131
+ return false;
132
+ throw error;
133
+ }
134
+ const pool = JSON.parse(content);
135
+ if (!pool || typeof pool !== 'object' || !('machine' in pool) || pool.machine !== machine)
136
+ throw new Error('Node-link policy requires its canonical machine pool');
137
+ const env = 'env' in pool ? pool.env : undefined;
138
+ if (!env || typeof env !== 'object')
139
+ return false;
140
+ const setting = Reflect.get(env, NODE_LINK_FLAG);
141
+ if (setting !== undefined && setting !== '0' && setting !== '1')
142
+ throw new Error(`${NODE_LINK_FLAG} must be 0 or 1`);
143
+ return setting === '1';
144
+ }
119
145
  //# sourceMappingURL=slot-by-repo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"slot-by-repo.js","sourceRoot":"","sources":["../../src/node/slot-by-repo.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slot-by-repo.js","sourceRoot":"","sources":["../../src/node/slot-by-repo.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import type { PeerVersionDeclaration } from '../peer-versions.js';
2
+ import type { NodeLinkCapabilities } from '../transport/node-link.js';
2
3
  export interface NodeInfo extends PeerVersionDeclaration {
3
4
  machine: string;
4
5
  pid: number;
6
+ nodeLink?: NodeLinkCapabilities;
5
7
  connectedAt: string;
6
8
  version?: string;
7
9
  versionMatch?: boolean;
@@ -21,6 +23,7 @@ export interface NodesListResult {
21
23
  }
22
24
  export interface NodeRegistrationResult extends PeerVersionDeclaration {
23
25
  registered: boolean;
26
+ nodeLink?: NodeLinkCapabilities;
24
27
  }
25
28
  export interface NodeDeployParams {
26
29
  machine: string;
@@ -40,6 +43,8 @@ interface NodeExecCommonParams {
40
43
  cwd?: string;
41
44
  timeout?: number;
42
45
  maxBuffer?: number;
46
+ /** Policy-selected exports; values never cross the control link. */
47
+ environment?: 'service' | 'login';
43
48
  }
44
49
  export type NodeExecParams = (NodeExecCommonParams & {
45
50
  cmd: string;
@@ -1 +1 @@
1
- {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/rpc/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,WAAW,QAAS,SAAQ,sBAAsB;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+EAA+E;IAC/E,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,sBAAsB,CAAC;CAC/C;AAED,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IACpE,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAE3C,UAAU,oBAAoB;IAC5B,gEAAgE;IAChE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,cAAc,GACtB,CAAC,oBAAoB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GACtD,CAAC,oBAAoB,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;AAE7D,wFAAwF;AACxF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,OAAO,EAAE,MAAM,IAAI,GAClB,MAAM,IAAI,CAOZ;AAED,6FAA6F;AAC7F,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,KAAK,IAAI,EACtD,SAAS,SAAwB,EACjC,QAAQ,CAAC,EAAE,MAAM,IAAI,GACpB;IAAE,SAAS,IAAI,IAAI,CAAC;IAAC,OAAO,IAAI,IAAI,CAAA;CAAE,CAkBxC"}
1
+ {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/rpc/nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,MAAM,WAAW,QAAS,SAAQ,sBAAsB;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+EAA+E;IAC/E,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,sBAAsB,CAAC;CAC/C;AAED,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IACpE,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAE3C,UAAU,oBAAoB;IAC5B,gEAAgE;IAChE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,WAAW,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;CACnC;AAED,MAAM,MAAM,cAAc,GACtB,CAAC,oBAAoB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,GACtD,CAAC,oBAAoB,GAAG;IAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;AAE7D,wFAAwF;AACxF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,OAAO,EAAE,MAAM,IAAI,GAClB,MAAM,IAAI,CAOZ;AAED,6FAA6F;AAC7F,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,KAAK,IAAI,EACtD,SAAS,SAAwB,EACjC,QAAQ,CAAC,EAAE,MAAM,IAAI,GACpB;IAAE,SAAS,IAAI,IAAI,CAAC;IAAC,OAAO,IAAI,IAAI,CAAA;CAAE,CAkBxC"}
@@ -1 +1 @@
1
- {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/rpc/nodes.ts"],"names":[],"mappings":"AAsCA,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAgB3C,wFAAwF;AACxF,MAAM,UAAU,oBAAoB,CAClC,MAA+B,EAC/B,OAAmB;IAEnB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC;QACV,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,OAAO,GAAG,EAAE,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,sBAAsB,CACpC,aAAsD,EACtD,SAAS,GAAG,qBAAqB,EACjC,QAAqB;IAErB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,KAAgD,CAAC;IACrD,OAAO;QACL,SAAS;YACP,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,aAAa,CAAC,SAAS,CAAC,CAAC;YACzB,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,QAAQ,EAAE,EAAE,CAAC;gBACb,aAAa,CAAC,SAAS,CAAC,CAAC;YAC3B,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAClB,CAAC;QACD,OAAO;YACL,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/rpc/nodes.ts"],"names":[],"mappings":"AAyCA,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAkB3C,wFAAwF;AACxF,MAAM,UAAU,oBAAoB,CAClC,MAA+B,EAC/B,OAAmB;IAEnB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC;QACV,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,OAAO,GAAG,EAAE,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,sBAAsB,CACpC,aAAsD,EACtD,SAAS,GAAG,qBAAqB,EACjC,QAAqB;IAErB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,KAAgD,CAAC;IACrD,OAAO;QACL,SAAS;YACP,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,aAAa,CAAC,SAAS,CAAC,CAAC;YACzB,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,QAAQ,EAAE,EAAE,CAAC;gBACb,aAAa,CAAC,SAAS,CAAC,CAAC;YAC3B,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAClB,CAAC;QACD,OAAO;YACL,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,165 @@
1
+ import type { ExecResult } from '../contracts/common.js';
2
+ import type { NodeFsDeleteParams, NodeFsPathParams, NodeFsReadChunkParams, NodeFsReadChunkResult, NodeFsRenameParams, NodeFsWriteChunkParams, NodeFsWriteChunkResult, NodeFsWriteFilesParams, NodeFsWriteParams } from '../rpc/fs.js';
3
+ import { type NodeLinkAuthority, type NodeLinkCommand, type NodeLinkTarget } from './node-link.js';
4
+ export interface NodeLinkFileInfo {
5
+ size: number;
6
+ isFile: boolean;
7
+ isDirectory: boolean;
8
+ mtimeMs: number;
9
+ }
10
+ export interface NodeLinkTerminalSize {
11
+ cols: number;
12
+ rows: number;
13
+ }
14
+ export interface NodeLinkProcessUpdate {
15
+ kind: 'started' | 'output';
16
+ stream: 'stdout' | 'stderr';
17
+ text: string;
18
+ }
19
+ export interface NodeLinkProcessInput {
20
+ /** Exactly approved argv; shell command strings are not part of this contract. */
21
+ argv: string[];
22
+ cwd: string;
23
+ timeoutMs: number;
24
+ closeoutTimeoutMs?: number;
25
+ maxOutputBytes: number;
26
+ environment?: 'service' | 'login';
27
+ /** Node-owned PTY attachment. Input uses the existing sequenced terminal command. */
28
+ terminal?: NodeLinkTerminalSize;
29
+ }
30
+ export interface NodeLinkWriteFilesInput extends NodeFsWriteFilesParams {
31
+ createOnly?: boolean;
32
+ }
33
+ export interface NodeLinkFileCommitInput {
34
+ root: string;
35
+ stagedRelPath: string;
36
+ destinationRelPath: string;
37
+ sha256: string;
38
+ size: number;
39
+ createOnly?: boolean;
40
+ }
41
+ export interface NodeLinkOutputDigest {
42
+ bytes: number;
43
+ sha256: string;
44
+ }
45
+ export interface NodeLinkProcessSummary {
46
+ kind: 'streamed-process-result';
47
+ exitCode: number;
48
+ stdout: NodeLinkOutputDigest;
49
+ stderr: NodeLinkOutputDigest;
50
+ }
51
+ export interface NodeLinkOperationMap {
52
+ 'system.which': {
53
+ input: {
54
+ programs: string[];
55
+ };
56
+ result: {
57
+ paths: Record<string, string | null>;
58
+ };
59
+ };
60
+ 'file.exists': {
61
+ input: NodeFsPathParams;
62
+ result: {
63
+ exists: boolean;
64
+ };
65
+ };
66
+ 'file.commit': {
67
+ input: NodeLinkFileCommitInput;
68
+ result: {
69
+ committed: boolean;
70
+ sha256: string;
71
+ };
72
+ };
73
+ 'file.inspect': {
74
+ input: NodeFsPathParams;
75
+ result: NodeLinkFileInfo;
76
+ };
77
+ 'file.read': {
78
+ input: NodeFsPathParams;
79
+ result: {
80
+ content: string;
81
+ hash: string;
82
+ };
83
+ };
84
+ 'file.read-range': {
85
+ input: NodeFsReadChunkParams;
86
+ result: NodeFsReadChunkResult;
87
+ };
88
+ 'file.hash': {
89
+ input: NodeFsPathParams;
90
+ result: {
91
+ sha256: string;
92
+ size: number;
93
+ };
94
+ };
95
+ 'file.write': {
96
+ input: NodeFsWriteParams;
97
+ result: {
98
+ ok: true;
99
+ hash?: string;
100
+ };
101
+ };
102
+ 'file.write-range': {
103
+ input: NodeFsWriteChunkParams;
104
+ result: NodeFsWriteChunkResult;
105
+ };
106
+ 'file.write-files': {
107
+ input: NodeLinkWriteFilesInput;
108
+ result: {
109
+ ok: true;
110
+ count: number;
111
+ };
112
+ };
113
+ 'file.mkdir': {
114
+ input: NodeFsPathParams;
115
+ result: {
116
+ ok: true;
117
+ };
118
+ };
119
+ 'file.delete': {
120
+ input: NodeFsDeleteParams;
121
+ result: {
122
+ ok: true;
123
+ };
124
+ };
125
+ 'file.rename': {
126
+ input: NodeFsRenameParams;
127
+ result: {
128
+ ok: true;
129
+ hash?: string;
130
+ };
131
+ };
132
+ 'process.run': {
133
+ input: NodeLinkProcessInput;
134
+ result: ExecResult | NodeLinkProcessSummary;
135
+ };
136
+ }
137
+ export type NodeLinkOperation = keyof NodeLinkOperationMap;
138
+ export type TypedNodeLinkCommand = {
139
+ [Operation in NodeLinkOperation]: NodeLinkCommand<NodeLinkOperationMap[Operation]['input']> & {
140
+ operation: Operation;
141
+ };
142
+ }[NodeLinkOperation];
143
+ /** Server-to-node grant. It is never a public launch/delegation parameter. */
144
+ export interface NodeLinkGrant {
145
+ target: NodeLinkTarget;
146
+ authority: NodeLinkAuthority;
147
+ expiresAt: number;
148
+ operations: NodeLinkOperation[];
149
+ /** Canonical admitted workspace; file inputs cannot replace it. */
150
+ root?: string;
151
+ /** A process request must match this exact admitted argv/cwd/limit policy. */
152
+ process?: NodeLinkProcessInput;
153
+ }
154
+ export declare const NODE_LINK_OPERATIONS: NodeLinkOperation[];
155
+ /** Unknown future operation names remain unsupported without breaking peer registration. */
156
+ export declare function nodeLinkCapabilities(value: unknown): import('./node-link.js').NodeLinkCapabilities | undefined;
157
+ export type NodeLinkOperationRequest = {
158
+ [Operation in NodeLinkOperation]: {
159
+ operation: Operation;
160
+ input: NodeLinkOperationMap[Operation]['input'];
161
+ };
162
+ }[NodeLinkOperation];
163
+ export declare function isNodeLinkGrant(value: unknown): value is NodeLinkGrant;
164
+ export declare function isNodeLinkProcessInput(value: unknown): value is NodeLinkProcessInput;
165
+ //# sourceMappingURL=node-link-operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-link-operations.d.ts","sourceRoot":"","sources":["../../src/transport/node-link-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { isNodeLinkAuthority, isNodeLinkTarget, } from './node-link.js';
2
+ export const NODE_LINK_OPERATIONS = [
3
+ 'system.which',
4
+ 'file.exists',
5
+ 'file.commit',
6
+ 'file.inspect',
7
+ 'file.read',
8
+ 'file.read-range',
9
+ 'file.hash',
10
+ 'file.write',
11
+ 'file.write-range',
12
+ 'file.write-files',
13
+ 'file.mkdir',
14
+ 'file.delete',
15
+ 'file.rename',
16
+ 'process.run',
17
+ ];
18
+ /** Unknown future operation names remain unsupported without breaking peer registration. */
19
+ export function nodeLinkCapabilities(value) {
20
+ if (value === undefined)
21
+ return undefined;
22
+ if (!value || typeof value !== 'object' || Array.isArray(value))
23
+ return undefined;
24
+ const commands = 'commands' in value && value.commands === 1;
25
+ const streams = 'streams' in value && value.streams === 1;
26
+ const offered = 'operations' in value && Array.isArray(value.operations) ? value.operations : [];
27
+ const operations = NODE_LINK_OPERATIONS.filter((operation) => offered.includes(operation));
28
+ return { ...(commands ? { commands: 1 } : {}), ...(streams ? { streams: 1 } : {}), operations };
29
+ }
30
+ export function isNodeLinkGrant(value) {
31
+ if (!value || typeof value !== 'object' || Array.isArray(value))
32
+ return false;
33
+ const grant = value;
34
+ return (isNodeLinkTarget(grant.target) &&
35
+ isNodeLinkAuthority(grant.authority) &&
36
+ typeof grant.expiresAt === 'number' &&
37
+ Number.isFinite(grant.expiresAt) &&
38
+ Array.isArray(grant.operations) &&
39
+ grant.operations.every((operation) => NODE_LINK_OPERATIONS.some((known) => known === operation)) &&
40
+ (grant.root === undefined || typeof grant.root === 'string') &&
41
+ (grant.process === undefined || isNodeLinkProcessInput(grant.process)));
42
+ }
43
+ export function isNodeLinkProcessInput(value) {
44
+ if (!value || typeof value !== 'object' || Array.isArray(value))
45
+ return false;
46
+ const process = value;
47
+ return (Array.isArray(process.argv) &&
48
+ process.argv.every((arg) => typeof arg === 'string') &&
49
+ typeof process.cwd === 'string' &&
50
+ typeof process.timeoutMs === 'number' &&
51
+ Number.isFinite(process.timeoutMs) &&
52
+ typeof process.maxOutputBytes === 'number' &&
53
+ Number.isFinite(process.maxOutputBytes));
54
+ }
55
+ //# sourceMappingURL=node-link-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-link-operations.js","sourceRoot":"","sources":["../../src/transport/node-link-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ export declare const NODE_LINK_RECEIPT_RETENTION_MS: number;
2
+ /** ADR-008 Amendment 3. Infrastructure identity is independent of runner transport. */
3
+ export declare const NODE_LINK_LIMITS: {
4
+ readonly frameBytes: number;
5
+ readonly chunkBytes: number;
6
+ readonly queuedBytes: number;
7
+ readonly inFlight: 32;
8
+ readonly reservedControl: 8;
9
+ readonly streamBytes: number;
10
+ };
11
+ export interface NodeLinkCapabilities {
12
+ commands?: 1;
13
+ operations?: import('./node-link-operations.js').NodeLinkOperation[];
14
+ streams?: 1;
15
+ }
16
+ export interface NodeLinkPrincipal {
17
+ principalId: string;
18
+ generation: number;
19
+ }
20
+ export interface NodeLinkLease {
21
+ runId: string;
22
+ contextId: string;
23
+ leaseId: string;
24
+ generation: string;
25
+ }
26
+ export interface NodeLinkAuthority {
27
+ requester: NodeLinkPrincipal | {
28
+ kind: 'system';
29
+ };
30
+ executor: NodeLinkPrincipal;
31
+ grantId: string;
32
+ approvalId: string;
33
+ approval: 'ask' | 'bypass' | 'framework';
34
+ lease?: NodeLinkLease;
35
+ }
36
+ /** A resource reference is resolved by its adapter, never by a runner-name branch. */
37
+ export interface NodeLinkTarget {
38
+ nodeId: string;
39
+ resourceId: string;
40
+ }
41
+ export interface NodeLinkCommand<Input = unknown> {
42
+ commandId: string;
43
+ operation: string;
44
+ target: NodeLinkTarget;
45
+ authority: NodeLinkAuthority;
46
+ expiresAt: number;
47
+ input: Input;
48
+ }
49
+ export type NodeLinkCommandState = 'admitted' | 'running' | 'cancel-requested' | 'completed' | 'failed' | 'cancelled' | 'unknown';
50
+ export interface NodeLinkError {
51
+ code: string;
52
+ message: string;
53
+ }
54
+ /** Audit metadata contains identifiers/digests only. Protected result payloads stay separate. */
55
+ export interface NodeLinkReceipt<Result = unknown> {
56
+ commandId: string;
57
+ digest: string;
58
+ target: NodeLinkTarget;
59
+ authority: NodeLinkAuthority;
60
+ operation: string;
61
+ expiresAt: number;
62
+ admittedAt: number;
63
+ state: NodeLinkCommandState;
64
+ closeoutConfirmed: boolean;
65
+ settledAt?: number;
66
+ result?: Result;
67
+ error?: NodeLinkError;
68
+ }
69
+ export interface NodeLinkCursor {
70
+ streamId: string;
71
+ incarnation: string;
72
+ offset: number;
73
+ }
74
+ export interface NodeLinkStreamFrame<Payload = unknown> extends NodeLinkCursor {
75
+ authority: NodeLinkAuthority;
76
+ target: NodeLinkTarget;
77
+ payload: Payload;
78
+ }
79
+ export type NodeLinkResumeResult<Payload = unknown> = {
80
+ kind: 'replay';
81
+ frames: NodeLinkStreamFrame<Payload>[];
82
+ cursor: NodeLinkCursor;
83
+ } | {
84
+ kind: 'reset';
85
+ reason: 'expired' | 'gap' | 'source-replaced';
86
+ snapshot: Payload;
87
+ cursor: NodeLinkCursor;
88
+ };
89
+ export declare class NodeLinkFailure extends Error {
90
+ readonly code: string;
91
+ readonly details?: {
92
+ admitted: false;
93
+ } | undefined;
94
+ constructor(code: string, message: string, details?: {
95
+ admitted: false;
96
+ } | undefined);
97
+ }
98
+ export declare function isNodeLinkTerminal(state: NodeLinkCommandState): boolean;
99
+ export declare function isNodeLinkPrincipal(value: unknown): value is NodeLinkPrincipal;
100
+ export declare function isNodeLinkAuthority(value: unknown): value is NodeLinkAuthority;
101
+ export declare function isNodeLinkTarget(value: unknown): value is NodeLinkTarget;
102
+ /** Deadline-bearing keys remain expired after their settled receipt has been pruned. */
103
+ export declare function nodeLinkCommandDeadline(commandId: string): number | undefined;
104
+ export declare function isNodeLinkCommand(value: unknown): value is NodeLinkCommand;
105
+ export declare function isNodeLinkReceipt(value: unknown): value is NodeLinkReceipt;
106
+ //# sourceMappingURL=node-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-link.d.ts","sourceRoot":"","sources":["../../src/transport/node-link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ export const NODE_LINK_RECEIPT_RETENTION_MS = 5 * 60_000;
2
+ /** ADR-008 Amendment 3. Infrastructure identity is independent of runner transport. */
3
+ export const NODE_LINK_LIMITS = {
4
+ frameBytes: 1024 * 1024,
5
+ chunkBytes: 64 * 1024,
6
+ queuedBytes: 8 * 1024 * 1024,
7
+ inFlight: 32,
8
+ reservedControl: 8,
9
+ streamBytes: 256 * 1024,
10
+ };
11
+ export class NodeLinkFailure extends Error {
12
+ constructor(code, message, details) {
13
+ super(message);
14
+ this.code = code;
15
+ this.details = details;
16
+ this.name = 'NodeLinkFailure';
17
+ }
18
+ }
19
+ export function isNodeLinkTerminal(state) {
20
+ return state === 'completed' || state === 'failed' || state === 'cancelled';
21
+ }
22
+ function record(value) {
23
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
24
+ }
25
+ const identity = (value) => typeof value === 'string' && value.length > 0 && value.length <= 512;
26
+ const finite = (value) => typeof value === 'number' && Number.isFinite(value);
27
+ export function isNodeLinkPrincipal(value) {
28
+ return (record(value) &&
29
+ identity(value.principalId) &&
30
+ Number.isSafeInteger(value.generation) &&
31
+ typeof value.generation === 'number' &&
32
+ value.generation >= 0);
33
+ }
34
+ export function isNodeLinkAuthority(value) {
35
+ if (!record(value) ||
36
+ !isNodeLinkPrincipal(value.executor) ||
37
+ !identity(value.grantId) ||
38
+ !identity(value.approvalId) ||
39
+ !['ask', 'bypass', 'framework'].includes(String(value.approval)))
40
+ return false;
41
+ if (!isNodeLinkPrincipal(value.requester) &&
42
+ !(record(value.requester) && value.requester.kind === 'system'))
43
+ return false;
44
+ const lease = value.lease;
45
+ return (lease === undefined ||
46
+ (record(lease) &&
47
+ ['runId', 'contextId', 'leaseId', 'generation'].every((field) => identity(lease[field]))));
48
+ }
49
+ export function isNodeLinkTarget(value) {
50
+ return record(value) && identity(value.nodeId) && identity(value.resourceId);
51
+ }
52
+ /** Deadline-bearing keys remain expired after their settled receipt has been pruned. */
53
+ export function nodeLinkCommandDeadline(commandId) {
54
+ const match = /^nl1:([0-9]{1,16}):[^:]+$/.exec(commandId);
55
+ if (!match)
56
+ return undefined;
57
+ const deadline = Number(match[1]);
58
+ return Number.isSafeInteger(deadline) && deadline > 0 ? deadline : undefined;
59
+ }
60
+ export function isNodeLinkCommand(value) {
61
+ return (record(value) &&
62
+ identity(value.commandId) &&
63
+ identity(value.operation) &&
64
+ isNodeLinkTarget(value.target) &&
65
+ isNodeLinkAuthority(value.authority) &&
66
+ finite(value.expiresAt) &&
67
+ (!value.commandId.startsWith('nl1:') ||
68
+ nodeLinkCommandDeadline(value.commandId) === value.expiresAt) &&
69
+ Object.hasOwn(value, 'input') &&
70
+ Object.keys(value).every((key) => ['commandId', 'operation', 'target', 'authority', 'expiresAt', 'input'].includes(key)));
71
+ }
72
+ export function isNodeLinkReceipt(value) {
73
+ return (record(value) &&
74
+ identity(value.commandId) &&
75
+ typeof value.digest === 'string' &&
76
+ /^[a-f0-9]{64}$/.test(value.digest) &&
77
+ identity(value.operation) &&
78
+ isNodeLinkTarget(value.target) &&
79
+ isNodeLinkAuthority(value.authority) &&
80
+ finite(value.expiresAt) &&
81
+ finite(value.admittedAt) &&
82
+ [
83
+ 'admitted',
84
+ 'running',
85
+ 'cancel-requested',
86
+ 'completed',
87
+ 'failed',
88
+ 'cancelled',
89
+ 'unknown',
90
+ ].includes(String(value.state)) &&
91
+ typeof value.closeoutConfirmed === 'boolean' &&
92
+ (value.settledAt === undefined || finite(value.settledAt)) &&
93
+ (value.error === undefined ||
94
+ (record(value.error) &&
95
+ identity(value.error.code) &&
96
+ typeof value.error.message === 'string')));
97
+ }
98
+ //# sourceMappingURL=node-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-link.js","sourceRoot":"","sources":["../../src/transport/node-link.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const PROTOCOL_VERSION = "0.80.0";
1
+ export declare const PROTOCOL_VERSION = "0.81.0";
2
2
  /** Node-facing additions since this release remain additive or capability-gated. */
3
3
  export declare const MINIMUM_PROTOCOL_VERSION = "0.76.0";
4
4
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // Published protocol release plus an explicit oldest-supported peer.
2
2
  // Different release numbers are harmless when both declared bounds are met;
3
3
  // optional methods/events still require their existing feature capabilities.
4
- export const PROTOCOL_VERSION = '0.80.0';
4
+ export const PROTOCOL_VERSION = '0.81.0';
5
5
  /** Node-facing additions since this release remain additive or capability-gated. */
6
6
  export const MINIMUM_PROTOCOL_VERSION = '0.76.0';
7
7
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farmslot/protocol",
3
- "version": "0.80.0",
3
+ "version": "0.81.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -365,6 +365,11 @@
365
365
  "import": "./dist/node/farm-layout.js",
366
366
  "default": "./dist/node/farm-layout.js"
367
367
  },
368
+ "./node/node-pty-helper": {
369
+ "types": "./dist/node/node-pty-helper.d.ts",
370
+ "import": "./dist/node/node-pty-helper.js",
371
+ "default": "./dist/node/node-pty-helper.js"
372
+ },
368
373
  "./node/loopback-host": {
369
374
  "types": "./dist/node/loopback-host.d.ts",
370
375
  "import": "./dist/node/loopback-host.js",