@cotal-ai/workspace 0.111.0 → 0.112.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.
@@ -3,7 +3,7 @@
3
3
  "platform": "darwin",
4
4
  "arch": "arm64",
5
5
  "nodeApi": 8,
6
- "source": "5a9323f8b5cf8dfad86a40456207c8b9d2244cc6",
6
+ "source": "d4543d735e4651e5820fb270e71564558c096184",
7
7
  "sourceHashes": {
8
8
  "native/win32-process.c": "889b215135b60dd3a45096737a3219ce114bc424e4b6cce42624f0913f8447dc",
9
9
  "native/win32-system-id.cpp": "2dd51f24425e8239aeac1aae01e67f43264f04f09cd9097a12d288be7a84e074",
@@ -3,7 +3,7 @@
3
3
  "platform": "darwin",
4
4
  "arch": "x64",
5
5
  "nodeApi": 8,
6
- "source": "5a9323f8b5cf8dfad86a40456207c8b9d2244cc6",
6
+ "source": "d4543d735e4651e5820fb270e71564558c096184",
7
7
  "sourceHashes": {
8
8
  "native/win32-process.c": "889b215135b60dd3a45096737a3219ce114bc424e4b6cce42624f0913f8447dc",
9
9
  "native/win32-system-id.cpp": "2dd51f24425e8239aeac1aae01e67f43264f04f09cd9097a12d288be7a84e074",
@@ -3,7 +3,7 @@
3
3
  "platform": "win32",
4
4
  "arch": "arm64",
5
5
  "nodeApi": 8,
6
- "source": "5a9323f8b5cf8dfad86a40456207c8b9d2244cc6",
6
+ "source": "d4543d735e4651e5820fb270e71564558c096184",
7
7
  "sourceHashes": {
8
8
  "native/win32-process.c": "889b215135b60dd3a45096737a3219ce114bc424e4b6cce42624f0913f8447dc",
9
9
  "native/win32-system-id.cpp": "2dd51f24425e8239aeac1aae01e67f43264f04f09cd9097a12d288be7a84e074",
@@ -3,7 +3,7 @@
3
3
  "platform": "win32",
4
4
  "arch": "x64",
5
5
  "nodeApi": 8,
6
- "source": "5a9323f8b5cf8dfad86a40456207c8b9d2244cc6",
6
+ "source": "d4543d735e4651e5820fb270e71564558c096184",
7
7
  "sourceHashes": {
8
8
  "native/win32-process.c": "889b215135b60dd3a45096737a3219ce114bc424e4b6cce42624f0913f8447dc",
9
9
  "native/win32-system-id.cpp": "2dd51f24425e8239aeac1aae01e67f43264f04f09cd9097a12d288be7a84e074",
@@ -17,6 +17,9 @@ export declare const SUPERVISE_ONLY_FLAGS: readonly ["execution", "spawn", "seat
17
17
  /** The `deliver` flags the `delivery` service preset has no form for yet: the preset starts one
18
18
  * space's daemon, and `--spaces` serves several from one process. */
19
19
  export declare const DELIVER_ONLY_FLAGS: readonly ["spaces"];
20
+ /** The `auth-service` flags the `auth-service` service preset has no form for yet: the preset starts
21
+ * one space's service, and `--spaces` serves several from one process. */
22
+ export declare const AUTH_SERVICE_ONLY_FLAGS: readonly ["spaces"];
20
23
  /** The hidden twin `up` launches for each deprecated entry it still starts, and the manager's daemon
21
24
  * entry. A twin is the entry's own declaration and runner without the warning, so only a persisted
22
25
  * caller sees the warning. */
@@ -1 +1 @@
1
- {"version":3,"file":"deprecated-daemon-entries.d.ts","sourceRoot":"","sources":["../src/deprecated-daemon-entries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAI1D;wDACwD;AACxD,eAAO,MAAM,4BAA4B,UAAU,CAAC;AAEpD,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB;;;;CAI5B,CAAC;AAEX;iCACiC;AACjC,eAAO,MAAM,wBAAwB,cAAc,CAAC;AAEpD;yFACyF;AACzF,eAAO,MAAM,oBAAoB,oIAAqI,CAAC;AAEvK;sEACsE;AACtE,eAAO,MAAM,kBAAkB,qBAAsB,CAAC;AAQtD;;+BAE+B;AAC/B,eAAO,MAAM,kBAAkB;;;;CAIrB,CAAC;AAEX,iGAAiG;AACjG,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,yBAAyB,GAAG,OAAO,wBAAwB,GAAG,iBAAiB,CAAC;AAEjI;;wFAEwF;AACxF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,qBAAqB,EAAE,IAAI,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,CAW/G;AAED;uCACuC;AACvC,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,OAAO,yBAAyB,GAAG,OAAO,wBAAwB,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAGrJ;AAED;uFACuF;AACvF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,qBAAqB,EAAE,IAAI,GAAE,SAAS,MAAM,EAAO,GAAG,IAAI,CAG1G;AAED;;iEAEiE;AACjE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,OAAO,kBAAkB,EACtC,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,CAAC,IAAI,EAAE,UAAU,KAAK,qBAAmC,GACjE,OAAO,CAQT"}
1
+ {"version":3,"file":"deprecated-daemon-entries.d.ts","sourceRoot":"","sources":["../src/deprecated-daemon-entries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAI1D;wDACwD;AACxD,eAAO,MAAM,4BAA4B,UAAU,CAAC;AAEpD,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB;;;;CAI5B,CAAC;AAEX;iCACiC;AACjC,eAAO,MAAM,wBAAwB,cAAc,CAAC;AAEpD;yFACyF;AACzF,eAAO,MAAM,oBAAoB,oIAAqI,CAAC;AAEvK;sEACsE;AACtE,eAAO,MAAM,kBAAkB,qBAAsB,CAAC;AAEtD;2EAC2E;AAC3E,eAAO,MAAM,uBAAuB,qBAAsB,CAAC;AAS3D;;+BAE+B;AAC/B,eAAO,MAAM,kBAAkB;;;;CAIrB,CAAC;AAEX,iGAAiG;AACjG,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,yBAAyB,GAAG,OAAO,wBAAwB,GAAG,iBAAiB,CAAC;AAEjI;;wFAEwF;AACxF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,qBAAqB,EAAE,IAAI,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,CAW/G;AAED;uCACuC;AACvC,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,OAAO,yBAAyB,GAAG,OAAO,wBAAwB,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAGrJ;AAED;uFACuF;AACvF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,qBAAqB,EAAE,IAAI,GAAE,SAAS,MAAM,EAAO,GAAG,IAAI,CAG1G;AAED;;iEAEiE;AACjE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,OAAO,kBAAkB,EACtC,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,CAAC,IAAI,EAAE,UAAU,KAAK,qBAAmC,GACjE,OAAO,CAQT"}
@@ -18,10 +18,14 @@ export const SUPERVISE_ONLY_FLAGS = ["execution", "spawn", "seat-cap", "resume-a
18
18
  /** The `deliver` flags the `delivery` service preset has no form for yet: the preset starts one
19
19
  * space's daemon, and `--spaces` serves several from one process. */
20
20
  export const DELIVER_ONLY_FLAGS = ["spaces"];
21
+ /** The `auth-service` flags the `auth-service` service preset has no form for yet: the preset starts
22
+ * one space's service, and `--spaces` serves several from one process. */
23
+ export const AUTH_SERVICE_ONLY_FLAGS = ["spaces"];
21
24
  /** Per entry, the flags its replacement has no form for. */
22
25
  const ENTRY_ONLY_FLAGS = {
23
26
  [DEPRECATED_MANAGER_ENTRY]: SUPERVISE_ONLY_FLAGS,
24
27
  deliver: DELIVER_ONLY_FLAGS,
28
+ "auth-service": AUTH_SERVICE_ONLY_FLAGS,
25
29
  };
26
30
  /** The hidden twin `up` launches for each deprecated entry it still starts, and the manager's daemon
27
31
  * entry. A twin is the entry's own declaration and runner without the warning, so only a persisted
@@ -1 +1 @@
1
- {"version":3,"file":"deprecated-daemon-entries.js","sourceRoot":"","sources":["../src/deprecated-daemon-entries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deprecated-daemon-entries.js","sourceRoot":"","sources":["../src/deprecated-daemon-entries.ts"],"names":[],"mappings":"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"}
@@ -5,21 +5,45 @@ export interface SpaceManifest {
5
5
  version: 1;
6
6
  spaces: string[];
7
7
  }
8
+ /** A version 2 manifest: one object per space, `{ "space": "<s>", ...settings }`, read by a host
9
+ * whose lanes take per-space settings. */
10
+ export interface SpaceSettingsManifest<S> {
11
+ version: 2;
12
+ spaces: string[];
13
+ settings: ReadonlyMap<string, S>;
14
+ }
15
+ /** How a host reads the per-space settings of a version 2 manifest. */
16
+ export interface SpaceSettings<S> {
17
+ /** Parse one entry's fields other than `space`, or throw naming what is wrong. Return a JSON
18
+ * value built in a fixed key order: the host compares two parses as JSON to tell whether a live
19
+ * lane's settings changed. */
20
+ parse(space: string, fields: Readonly<Record<string, unknown>>): S;
21
+ /** Refuse entries that conflict with each other, such as two spaces naming one port. */
22
+ across?(settings: ReadonlyMap<string, S>): void;
23
+ }
8
24
  /** One space's lane, as a host holds it. */
9
25
  export interface SpaceLane {
10
26
  readonly space: string;
11
27
  /** Settles with what this lane lost once it stops serving, by {@link close} or by a loss. It never
12
28
  * rejects: a holder distinguishes the two by whether it asked for the close. */
13
29
  readonly lost: Promise<string>;
14
- /** Stop serving and release everything the lane holds. Safe to call more than once. */
30
+ /** Stop serving and release everything the lane holds. Safe to call more than once. A rejection
31
+ * says the lane may still serve: the host then acknowledges nothing until a later close resolves. */
15
32
  close(): Promise<void>;
16
33
  }
17
34
  /** What a multi-space daemon supplies to {@link runSpaceHost}. */
18
- export interface SpaceHostOptions {
35
+ export interface SpaceHostOptions<S = undefined> {
19
36
  /** Path of the manifest file. */
20
37
  manifest: string;
38
+ /** Present for a host whose lanes take per-space settings: it reads version 2 manifests only.
39
+ * Absent, the host reads version 1 only, so neither kind of host runs on the other's file. */
40
+ settings?: SpaceSettings<S>;
21
41
  /** Open one space's lane, or throw naming why the space cannot be served. */
22
- open(space: string): Promise<SpaceLane>;
42
+ open(space: string, settings: S): Promise<SpaceLane>;
43
+ /** `every` (the default) refuses to start unless every space opens, and leaves no lane running.
44
+ * `servable` starts with the spaces that open, reports each one that does not, and retries it as
45
+ * reconcile does after startup. A manifest that does not read whole refuses either way. */
46
+ startup?: "every" | "servable";
23
47
  /** Names the host in its log lines, such as `auth callout host`. */
24
48
  label: string;
25
49
  /** Names the command in a startup refusal, such as `auth-service --callout-only --spaces`. */
@@ -34,17 +58,21 @@ export interface SpaceHostOptions {
34
58
  /** A started host. `ended` resolves with the exit code once a signal has closed every lane. */
35
59
  export interface SpaceHost {
36
60
  readonly lanes: ReadonlyMap<string, SpaceLane>;
61
+ /** The spaces the manifest named at startup, in manifest order. */
62
+ readonly named: readonly string[];
37
63
  readonly ended: Promise<number>;
38
64
  }
39
65
  /** Parse a space manifest. Throws with what is wrong: the caller keeps its live lanes rather than
40
- * acting on a file it could not read whole. */
66
+ * acting on a file it could not read whole. With `settings` it reads version 2, otherwise version 1. */
41
67
  export declare function parseSpaceManifest(text: string): SpaceManifest;
68
+ export declare function parseSpaceManifest<S>(text: string, settings: SpaceSettings<S>): SpaceSettingsManifest<S>;
42
69
  /** Read and parse the manifest at `path`. The error names the path, so a host log line is legible
43
70
  * without the operator correlating it. */
44
71
  export declare function readSpaceManifest(path: string): SpaceManifest;
45
72
  /** Open a lane for every space in the manifest, then keep the live lanes equal to the manifest until
46
- * a signal stops the host. Every space must open at startup: one that cannot is a configuration
47
- * error naming the space, and no lane is left running. Returns once startup has succeeded; the
48
- * caller prints its ready line and exits with `ended`. */
49
- export declare function runSpaceHost(options: SpaceHostOptions): Promise<SpaceHost>;
73
+ * a signal stops the host. Under the default `every` startup, a space that cannot open is a
74
+ * configuration error naming the space, and no lane is left running; under `servable` the host
75
+ * starts with the spaces that open. Returns once startup has succeeded; the caller prints its ready
76
+ * line and exits with `ended`. */
77
+ export declare function runSpaceHost<S = undefined>(options: SpaceHostOptions<S>): Promise<SpaceHost>;
50
78
  //# sourceMappingURL=space-host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"space-host.d.ts","sourceRoot":"","sources":["../src/space-host.ts"],"names":[],"mappings":"AAyBA;;0BAE0B;AAC1B,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,4CAA4C;AAC5C,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;qFACiF;IACjF,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B,uFAAuF;IACvF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,8FAA8F;IAC9F,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;IAC1C,iDAAiD;IACjD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,+FAA+F;AAC/F,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC;AAED;gDACgD;AAChD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CA0B9D;AAED;2CAC2C;AAC3C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAY7D;AAED;;;2DAG2D;AAC3D,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAwIhF"}
1
+ {"version":3,"file":"space-host.d.ts","sourceRoot":"","sources":["../src/space-host.ts"],"names":[],"mappings":"AA+BA;;0BAE0B;AAC1B,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;2CAC2C;AAC3C,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;CAClC;AAED,uEAAuE;AACvE,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B;;mCAE+B;IAC/B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;IACnE,wFAAwF;IACxF,MAAM,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;CACjD;AAED,4CAA4C;AAC5C,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;qFACiF;IACjF,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/B;0GACsG;IACtG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,kEAAkE;AAClE,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,SAAS;IAC7C,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB;mGAC+F;IAC/F,QAAQ,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5B,6EAA6E;IAC7E,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACrD;;gGAE4F;IAC5F,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC/B,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,8FAA8F;IAC9F,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;IAC1C,iDAAiD;IACjD,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,+FAA+F;AAC/F,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC/C,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC;AAED;yGACyG;AACzG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;AAChE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;AAgD1G;2CAC2C;AAC3C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAE7D;AAmBD;;;;mCAImC;AACnC,wBAAsB,YAAY,CAAC,CAAC,GAAG,SAAS,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CA+NlG"}
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * One process holding one lane per space named in a manifest file. The auth callout host
3
- * (`cotal auth-service --callout-only --spaces <manifest>`) and the delivery host
4
- * (`cotal deliver --spaces <manifest>`) both run on this, so the manifest grammar and the lane
5
- * lifecycle are one piece of code for every multi-space daemon.
3
+ * (`cotal auth-service --callout-only --spaces <manifest>`), the auth service host
4
+ * (`cotal auth-service --spaces <manifest>`) and the delivery host (`cotal deliver --spaces
5
+ * <manifest>`) all run on this, so the manifest grammar and the lane lifecycle are one piece of code
6
+ * for every multi-space daemon.
6
7
  *
7
8
  * A lane is whatever the caller opens for one space. The host shares nothing between lanes but the
8
9
  * process: a lane that ends leaves the map and the others keep serving.
@@ -11,8 +12,13 @@
11
12
  * opens or closes the difference. It runs when the manifest changes on disk, on `SIGHUP`, when a
12
13
  * lane is lost, after a short fixed wait when a lane failed to open, and on a slow backstop
13
14
  * interval. A manifest that does not read or parse whole leaves the live lanes alone.
15
+ *
16
+ * Once a pass has closed every lane its manifest does not name, the host writes
17
+ * `<manifest>.applied` naming the SHA-256 of the manifest bytes that pass read. A writer that
18
+ * removes a space waits for that record to know the space has no lane left in this process.
14
19
  */
15
- import { readFileSync, watch } from "node:fs";
20
+ import { createHash } from "node:crypto";
21
+ import { readFileSync, renameSync, watch, writeFileSync } from "node:fs";
16
22
  import { basename, dirname, resolve } from "node:path";
17
23
  /** How long after a lane fails to open the host tries it again. One fixed wait, never a growing
18
24
  * backoff, and the log line that reports the failure names it. */
@@ -20,9 +26,7 @@ const REOPEN_WAIT_SECONDS = 5;
20
26
  /** The backstop reconcile. A lost lane and a changed manifest each reconcile at once, so this only
21
27
  * catches a change no watch reported. */
22
28
  const BACKSTOP_INTERVAL_SECONDS = 60;
23
- /** Parse a space manifest. Throws with what is wrong: the caller keeps its live lanes rather than
24
- * acting on a file it could not read whole. */
25
- export function parseSpaceManifest(text) {
29
+ export function parseSpaceManifest(text, settings) {
26
30
  let doc;
27
31
  try {
28
32
  doc = JSON.parse(text);
@@ -37,53 +41,89 @@ export function parseSpaceManifest(text) {
37
41
  if (unknown.length)
38
42
  throw new Error(`unknown field(s) ${unknown.join(", ")}; the manifest takes version and spaces`);
39
43
  const { version, spaces } = doc;
40
- if (version !== 1)
41
- throw new Error(`version must be 1, got ${JSON.stringify(version)}`);
44
+ if (settings === undefined && version !== 1)
45
+ throw new Error(`version must be 1, got ${JSON.stringify(version)}${version === 2 ? "; this host takes no per-space settings" : ""}`);
46
+ if (settings !== undefined && version !== 2)
47
+ throw new Error(`version must be 2, got ${JSON.stringify(version)}${version === 1 ? '; this host reads one object per space, {"space": "<s>", ...}' : ""}`);
42
48
  if (!Array.isArray(spaces))
43
- throw new Error("spaces must be an array of space names");
49
+ throw new Error(`spaces must be an array of ${settings === undefined ? "space names" : "space objects"}`);
44
50
  if (spaces.length === 0)
45
51
  throw new Error("spaces is empty; a host serves at least one space");
52
+ const names = [];
53
+ const parsed = new Map();
46
54
  for (const entry of spaces) {
47
- if (typeof entry !== "string")
48
- throw new Error(`every entry of spaces must be a space name string, got ${JSON.stringify(entry)}; one host serves one broker, so run one host per broker rather than naming a server per space`);
49
- if (entry.trim() === "")
55
+ let name = entry;
56
+ let fields = {};
57
+ if (settings === undefined) {
58
+ if (typeof entry !== "string")
59
+ throw new Error(`every entry of spaces must be a space name string, got ${JSON.stringify(entry)}; one host serves one broker, so run one host per broker rather than naming a server per space`);
60
+ }
61
+ else {
62
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry))
63
+ throw new Error(`every entry of spaces must be an object {"space": "<s>", ...}, got ${JSON.stringify(entry)}`);
64
+ ({ space: name, ...fields } = entry);
65
+ if (typeof name !== "string")
66
+ throw new Error(`every entry of spaces needs a space name string, got ${JSON.stringify(name)}`);
67
+ }
68
+ if (name.trim() === "")
50
69
  throw new Error("a space name is empty");
70
+ if (names.includes(name))
71
+ throw new Error(`space ${JSON.stringify(name)} is named more than once`);
72
+ names.push(name);
73
+ if (settings === undefined)
74
+ continue;
75
+ try {
76
+ parsed.set(name, settings.parse(name, fields));
77
+ }
78
+ catch (e) {
79
+ throw new Error(`space ${JSON.stringify(name)}: ${e instanceof Error ? e.message : String(e)}`);
80
+ }
51
81
  }
52
- const seen = new Set();
53
- for (const entry of spaces) {
54
- if (seen.has(entry))
55
- throw new Error(`space ${JSON.stringify(entry)} is named more than once`);
56
- seen.add(entry);
57
- }
58
- return { version: 1, spaces: spaces };
82
+ if (settings === undefined)
83
+ return { version: 1, spaces: names };
84
+ settings.across?.(parsed);
85
+ return { version: 2, spaces: names, settings: parsed };
59
86
  }
60
87
  /** Read and parse the manifest at `path`. The error names the path, so a host log line is legible
61
88
  * without the operator correlating it. */
62
89
  export function readSpaceManifest(path) {
63
- let text;
90
+ return readManifestFile(path, undefined).manifest;
91
+ }
92
+ /** Read the manifest at `path` and the SHA-256 of the bytes read, which an acknowledgment names. */
93
+ function readManifestFile(path, settings) {
94
+ let bytes;
64
95
  try {
65
- text = readFileSync(path, "utf8");
96
+ bytes = readFileSync(path);
66
97
  }
67
98
  catch (e) {
68
99
  throw new Error(`${path} could not be read (${e instanceof Error ? e.message : String(e)})`);
69
100
  }
70
101
  try {
71
- return parseSpaceManifest(text);
102
+ const text = bytes.toString("utf8");
103
+ const manifest = settings === undefined ? parseSpaceManifest(text) : parseSpaceManifest(text, settings);
104
+ return { manifest, sha256: createHash("sha256").update(bytes).digest("hex") };
72
105
  }
73
106
  catch (e) {
74
107
  throw new Error(`${path} is invalid: ${e instanceof Error ? e.message : String(e)}`);
75
108
  }
76
109
  }
77
110
  /** Open a lane for every space in the manifest, then keep the live lanes equal to the manifest until
78
- * a signal stops the host. Every space must open at startup: one that cannot is a configuration
79
- * error naming the space, and no lane is left running. Returns once startup has succeeded; the
80
- * caller prints its ready line and exits with `ended`. */
111
+ * a signal stops the host. Under the default `every` startup, a space that cannot open is a
112
+ * configuration error naming the space, and no lane is left running; under `servable` the host
113
+ * starts with the spaces that open. Returns once startup has succeeded; the caller prints its ready
114
+ * line and exits with `ended`. */
81
115
  export async function runSpaceHost(options) {
82
116
  const { label } = options;
83
117
  const manifestPath = resolve(options.manifest);
84
118
  const log = options.log ?? ((l) => console.error(l));
85
119
  const lanes = new Map();
120
+ /** Each live lane's settings as JSON, which a changed entry no longer matches. */
121
+ const opened = new Map();
122
+ /** Lanes taken out of service whose close rejected. Each may still serve, so while any is here
123
+ * no acknowledgment is written and its space is not opened again; every pass retries its close. */
124
+ const unclosed = new Map();
86
125
  let stopping = false;
126
+ const settingsOf = (wanted, space) => (wanted.version === 2 ? wanted.settings.get(space) : undefined);
87
127
  /** Watch one lane for a loss. A lane the host deliberately removed is no longer the map's lane for
88
128
  * its space, so its settled `lost` is ignored rather than read as a failure to recover from. */
89
129
  const watchLane = (lane) => {
@@ -91,16 +131,54 @@ export async function runSpaceHost(options) {
91
131
  if (stopping || lanes.get(lane.space) !== lane)
92
132
  return;
93
133
  lanes.delete(lane.space);
134
+ opened.delete(lane.space);
94
135
  log(`✗ ${label}: space "${lane.space}" lost ${what} - that lane stopped ${options.serving}; ${lanes.size} lane(s) still up`);
95
136
  schedule(0);
96
137
  });
97
138
  };
98
- const open = async (space) => {
99
- const lane = await options.open(space);
139
+ const open = async (space, settings) => {
140
+ const lane = await options.open(space, settings);
100
141
  lanes.set(space, lane);
142
+ opened.set(space, JSON.stringify(settings) ?? "");
101
143
  watchLane(lane);
102
144
  return lane;
103
145
  };
146
+ /** Open every wanted space without a lane. Each failure is reported and retried after the fixed
147
+ * wait; the others still open. */
148
+ const openWanted = async (wanted) => {
149
+ let failed = false;
150
+ for (const space of wanted.spaces) {
151
+ if (lanes.has(space) || unclosed.has(space) || stopping)
152
+ continue;
153
+ try {
154
+ await open(space, settingsOf(wanted, space));
155
+ log(`${label}: space "${space}" opened - ${lanes.size} lane(s) up`);
156
+ }
157
+ catch (e) {
158
+ failed = true;
159
+ log(`✗ ${label}: space "${space}" could not be served (${e instanceof Error ? e.message : String(e)}) - retrying in ${REOPEN_WAIT_SECONDS}s`);
160
+ }
161
+ }
162
+ if (failed)
163
+ schedule(REOPEN_WAIT_SECONDS);
164
+ };
165
+ // ---- the acknowledgment ------------------------------------------------------------------------
166
+ // Sound because passes are serialized and each reads the manifest afresh: a pass that read an
167
+ // older manifest and is still opening a removed space is followed by one that closes it before
168
+ // it acknowledges, nothing opens a space except a pass whose own manifest names it, and no pass
169
+ // acknowledges while a lane whose close rejected may still serve.
170
+ const appliedPath = `${manifestPath}.applied`;
171
+ let acknowledged;
172
+ /** Record that every space the manifest with this digest does not name has no lane. Written
173
+ * through a sibling and a rename, so a reader never sees a partial record. */
174
+ const acknowledge = (sha256) => {
175
+ if (sha256 === acknowledged)
176
+ return;
177
+ const tmp = `${appliedPath}.${process.pid}.tmp`;
178
+ writeFileSync(tmp, `${JSON.stringify({ version: 1, sha256 })}\n`);
179
+ renameSync(tmp, appliedPath);
180
+ acknowledged = sha256;
181
+ };
104
182
  // ---- reconcile: the one path that adds and removes a lane -------------------------------------
105
183
  let reconciling = false;
106
184
  let pending = false;
@@ -129,54 +207,108 @@ export async function runSpaceHost(options) {
129
207
  try {
130
208
  do {
131
209
  pending = false;
132
- let wanted;
210
+ let read;
133
211
  try {
134
- wanted = readSpaceManifest(manifestPath);
212
+ read = readManifestFile(manifestPath, options.settings);
135
213
  }
136
214
  catch (e) {
137
215
  log(`✗ ${label}: ${e instanceof Error ? e.message : String(e)} - keeping the ${lanes.size} lane(s) already open`);
138
216
  return;
139
217
  }
218
+ const wanted = read.manifest;
140
219
  const want = new Set(wanted.spaces);
220
+ for (const [space, lane] of [...unclosed]) {
221
+ if (stopping)
222
+ continue;
223
+ if (await closeLane(space, lane))
224
+ log(`${label}: space "${space}" closed its lane on a retry`);
225
+ }
141
226
  for (const [space, lane] of [...lanes]) {
142
- if (want.has(space) || stopping)
227
+ if (stopping)
228
+ continue;
229
+ const changed = want.has(space) && opened.get(space) !== (JSON.stringify(settingsOf(wanted, space)) ?? "");
230
+ if (want.has(space) && !changed)
143
231
  continue;
144
232
  // Out of the map before the close, so this lane's `lost` reads as the removal it is.
145
233
  lanes.delete(space);
146
- await lane.close().catch(() => { });
147
- log(`${label}: space "${space}" left the manifest - closed its lane; ${lanes.size} lane(s) up`);
148
- }
149
- let failed = false;
150
- for (const space of wanted.spaces) {
151
- if (lanes.has(space) || stopping)
234
+ opened.delete(space);
235
+ if (!(await closeLane(space, lane)))
152
236
  continue;
237
+ log(changed
238
+ ? `${label}: space "${space}" changed its settings - closed its lane to reopen it; ${lanes.size} lane(s) up`
239
+ : `${label}: space "${space}" left the manifest - closed its lane; ${lanes.size} lane(s) up`);
240
+ }
241
+ if (stopping)
242
+ return;
243
+ if (unclosed.size === 0) {
153
244
  try {
154
- await open(space);
155
- log(`${label}: space "${space}" opened - ${lanes.size} lane(s) up`);
245
+ acknowledge(read.sha256);
156
246
  }
157
247
  catch (e) {
158
- failed = true;
159
- log(`✗ ${label}: space "${space}" could not be served (${e instanceof Error ? e.message : String(e)}) - retrying in ${REOPEN_WAIT_SECONDS}s`);
248
+ log(`✗ ${label}: could not write ${appliedPath} (${e instanceof Error ? e.message : String(e)}) - a writer waiting on it keeps waiting; retrying on the next pass`);
160
249
  }
161
250
  }
162
- if (failed)
251
+ else {
163
252
  schedule(REOPEN_WAIT_SECONDS);
253
+ }
254
+ await openWanted(wanted);
164
255
  } while (pending && !stopping);
165
256
  }
166
257
  finally {
167
258
  reconciling = false;
168
259
  }
169
260
  };
170
- // ---- startup: every space or none -------------------------------------------------------------
171
- const initial = readSpaceManifest(manifestPath);
172
- for (const space of initial.spaces) {
261
+ /** Close a lane already out of the map. A close that rejects keeps the lane in `unclosed`, which
262
+ * holds back every acknowledgment until a later pass closes it. */
263
+ const closeLane = async (space, lane) => {
173
264
  try {
174
- await open(space);
265
+ await lane.close();
266
+ unclosed.delete(space);
267
+ return true;
175
268
  }
176
269
  catch (e) {
177
- await Promise.all([...lanes.values()].map((lane) => lane.close().catch(() => { })));
178
- lanes.clear();
179
- throw new Error(`${options.entry}: space "${space}" could not be served (${e instanceof Error ? e.message : String(e)}) - no lane was left running`);
270
+ unclosed.set(space, lane);
271
+ log(`✗ ${label}: space "${space}" did not confirm its lane closed (${e instanceof Error ? e.message : String(e)}) - acknowledging nothing until it does; retrying in ${REOPEN_WAIT_SECONDS}s`);
272
+ return false;
273
+ }
274
+ };
275
+ /** Close every lane at once. Each leaves the maps before its close, so its `lost` reads as the
276
+ * deliberate close it is and never schedules a reconcile that would open it again. */
277
+ const closeAll = async () => {
278
+ const all = [...lanes.values(), ...unclosed.values()];
279
+ lanes.clear();
280
+ opened.clear();
281
+ unclosed.clear();
282
+ await Promise.all(all.map((lane) => lane.close().catch(() => { })));
283
+ };
284
+ // ---- startup ----------------------------------------------------------------------------------
285
+ // A manifest that does not read whole refuses under either policy: there is no list to serve. The
286
+ // acknowledgment is written before any lane opens, so a host that cannot write it refuses too.
287
+ const initial = readManifestFile(manifestPath, options.settings);
288
+ try {
289
+ acknowledge(initial.sha256);
290
+ }
291
+ catch (e) {
292
+ throw new Error(`${options.entry}: cannot write ${appliedPath} (${e instanceof Error ? e.message : String(e)}) - no lane was opened`);
293
+ }
294
+ if (options.startup === "servable") {
295
+ reconciling = true;
296
+ try {
297
+ await openWanted(initial.manifest);
298
+ }
299
+ finally {
300
+ reconciling = false;
301
+ }
302
+ }
303
+ else {
304
+ for (const space of initial.manifest.spaces) {
305
+ try {
306
+ await open(space, settingsOf(initial.manifest, space));
307
+ }
308
+ catch (e) {
309
+ await closeAll();
310
+ throw new Error(`${options.entry}: space "${space}" could not be served (${e instanceof Error ? e.message : String(e)}) - no lane was left running`);
311
+ }
180
312
  }
181
313
  }
182
314
  // ---- triggers ---------------------------------------------------------------------------------
@@ -197,10 +329,14 @@ export async function runSpaceHost(options) {
197
329
  });
198
330
  }
199
331
  catch (e) {
200
- await Promise.all([...lanes.values()].map((lane) => lane.close().catch(() => { })));
201
- lanes.clear();
332
+ if (retry !== undefined)
333
+ clearTimeout(retry);
334
+ await closeAll();
202
335
  throw new Error(`${options.entry}: cannot watch ${dirname(manifestPath)} for manifest changes (${e instanceof Error ? e.message : String(e)})`);
203
336
  }
337
+ // A trigger that arrived during a servable startup's opens runs now.
338
+ if (pending)
339
+ schedule(0);
204
340
  const backstop = setInterval(() => schedule(0), BACKSTOP_INTERVAL_SECONDS * 1000);
205
341
  backstop.unref();
206
342
  const ended = new Promise((resolve_) => {
@@ -216,15 +352,12 @@ export async function runSpaceHost(options) {
216
352
  clearInterval(backstop);
217
353
  watcher?.close();
218
354
  // Every lane closes at once: one lane waiting on a slow broker must not hold the others open.
219
- void Promise.all([...lanes.values()].map((lane) => lane.close().catch(() => { }))).then(() => {
220
- lanes.clear();
221
- resolve_(0);
222
- });
355
+ void closeAll().then(() => resolve_(0));
223
356
  };
224
357
  process.on("SIGINT", stop("SIGINT"));
225
358
  process.on("SIGTERM", stop("SIGTERM"));
226
359
  process.on("SIGHUP", () => schedule(0));
227
360
  });
228
- return { lanes, ended };
361
+ return { lanes, named: initial.manifest.spaces, ended };
229
362
  }
230
363
  //# sourceMappingURL=space-host.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"space-host.js","sourceRoot":"","sources":["../src/space-host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"space-host.js","sourceRoot":"","sources":["../src/space-host.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cotal-ai/workspace",
3
3
  "description": "Cotal machine-local workstation layer: the ~/.cotal mesh registry, target resolution, preflight, on-disk auth-path I/O, and the command-copy renderer — operator concerns over a local checkout, kept separate from the wire protocol in @cotal-ai/core.",
4
- "version": "0.111.0",
4
+ "version": "0.112.0",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -22,7 +22,7 @@
22
22
  }
23
23
  },
24
24
  "dependencies": {
25
- "@cotal-ai/core": "0.111.0",
25
+ "@cotal-ai/core": "0.112.0",
26
26
  "ajv": "^8.20.0",
27
27
  "string-width": "^8.2.1",
28
28
  "yaml": "^2.9.0",