@listen-fire/engine-contracts 0.12.0-rc.7 → 0.12.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.
@@ -1423,6 +1423,9 @@ export declare const WireSignedInboundDeclaration: z.ZodObject<{
1423
1423
  installer: "installer";
1424
1424
  provider: "provider";
1425
1425
  }>>;
1426
+ deliveryId: z.ZodOptional<z.ZodObject<{
1427
+ header: z.ZodString;
1428
+ }, z.core.$strip>>;
1426
1429
  }, z.core.$strip>;
1427
1430
  /**
1428
1431
  * The module checks its own inbound requests (`scheme: module`): the host
@@ -1457,6 +1460,9 @@ export declare const WireInboundDeclaration: z.ZodDiscriminatedUnion<[z.ZodObjec
1457
1460
  installer: "installer";
1458
1461
  provider: "provider";
1459
1462
  }>>;
1463
+ deliveryId: z.ZodOptional<z.ZodObject<{
1464
+ header: z.ZodString;
1465
+ }, z.core.$strip>>;
1460
1466
  }, z.core.$strip>, z.ZodObject<{
1461
1467
  providerKey: z.ZodString;
1462
1468
  scheme: z.ZodLiteral<"module">;
@@ -1548,8 +1554,13 @@ export type WireModuleKindShape = z.infer<typeof WireModuleKind>;
1548
1554
  * other host leaves empty (a module asking for a page is refused by name),
1549
1555
  * and `wake`, which stays empty unless named (nobody is told work is due;
1550
1556
  * a scheduled worker finds it), and `ocr`, which stays empty unless named
1551
- * (a scanned file is refused, saying the slot is empty). */
1552
- export declare const CORE_SLOTS: readonly ["models", "judge", "store", "files", "limiter", "loopGuard", "browser", "wake", "ocr"];
1557
+ * (a scanned file is refused, saying the slot is empty). `secrets` is
1558
+ * where credentials are kept (`lf`'s default: its secrets file); a secrets
1559
+ * module's own settings come from the environment or that file, never
1560
+ * from itself. `movements` answers the project's movement files by name
1561
+ * (`lf`'s default: the movements folder); its module's own settings come
1562
+ * from the same two places. */
1563
+ export declare const CORE_SLOTS: readonly ["models", "judge", "store", "files", "limiter", "loopGuard", "browser", "wake", "ocr", "secrets", "movements"];
1553
1564
  export declare const WireCoreSlot: z.ZodEnum<{
1554
1565
  store: "store";
1555
1566
  models: "models";
@@ -1560,6 +1571,8 @@ export declare const WireCoreSlot: z.ZodEnum<{
1560
1571
  browser: "browser";
1561
1572
  wake: "wake";
1562
1573
  ocr: "ocr";
1574
+ secrets: "secrets";
1575
+ movements: "movements";
1563
1576
  }>;
1564
1577
  export type WireCoreSlotShape = z.infer<typeof WireCoreSlot>;
1565
1578
  /** One construction argument the install supplies (an Airtable `base`, a
@@ -1618,6 +1631,8 @@ export declare const WireModuleDeclarations: z.ZodObject<{
1618
1631
  browser: "browser";
1619
1632
  wake: "wake";
1620
1633
  ocr: "ocr";
1634
+ secrets: "secrets";
1635
+ movements: "movements";
1621
1636
  }>>;
1622
1637
  settings: z.ZodOptional<z.ZodArray<z.ZodObject<{
1623
1638
  name: z.ZodString;
@@ -1676,6 +1691,9 @@ export declare const WireModuleDeclarations: z.ZodObject<{
1676
1691
  installer: "installer";
1677
1692
  provider: "provider";
1678
1693
  }>>;
1694
+ deliveryId: z.ZodOptional<z.ZodObject<{
1695
+ header: z.ZodString;
1696
+ }, z.core.$strip>>;
1679
1697
  }, z.core.$strip>, z.ZodObject<{
1680
1698
  providerKey: z.ZodString;
1681
1699
  scheme: z.ZodLiteral<"module">;
@@ -1759,6 +1777,8 @@ export declare const WireManifestResult: z.ZodObject<{
1759
1777
  browser: "browser";
1760
1778
  wake: "wake";
1761
1779
  ocr: "ocr";
1780
+ secrets: "secrets";
1781
+ movements: "movements";
1762
1782
  }>>;
1763
1783
  settings: z.ZodOptional<z.ZodArray<z.ZodObject<{
1764
1784
  name: z.ZodString;
@@ -1817,6 +1837,9 @@ export declare const WireManifestResult: z.ZodObject<{
1817
1837
  installer: "installer";
1818
1838
  provider: "provider";
1819
1839
  }>>;
1840
+ deliveryId: z.ZodOptional<z.ZodObject<{
1841
+ header: z.ZodString;
1842
+ }, z.core.$strip>>;
1820
1843
  }, z.core.$strip>, z.ZodObject<{
1821
1844
  providerKey: z.ZodString;
1822
1845
  scheme: z.ZodLiteral<"module">;
@@ -2064,6 +2087,7 @@ export declare const WireInboundCheck: z.ZodDiscriminatedUnion<[z.ZodObject<{
2064
2087
  }, z.core.$strip>>;
2065
2088
  wakeKeys: z.ZodOptional<z.ZodArray<z.ZodString>>;
2066
2089
  checkpoint: z.ZodOptional<z.ZodUnknown>;
2090
+ deliveryId: z.ZodOptional<z.ZodString>;
2067
2091
  }, z.core.$strip>, z.ZodObject<{
2068
2092
  outcome: z.ZodLiteral<"refused">;
2069
2093
  status: z.ZodOptional<z.ZodNumber>;
@@ -2092,6 +2116,7 @@ export declare const HostModelRequest: z.ZodObject<{
2092
2116
  schema: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
2093
2117
  toolName: z.ZodOptional<z.ZodString>;
2094
2118
  toolDescription: z.ZodOptional<z.ZodString>;
2119
+ runId: z.ZodOptional<z.ZodString>;
2095
2120
  }, z.core.$strip>;
2096
2121
  export type HostModelRequestShape = z.infer<typeof HostModelRequest>;
2097
2122
  /** The tokens a model call spent: what a run's usage reports, beside its cost. */
@@ -2260,6 +2285,8 @@ export declare const METHODS: {
2260
2285
  browser: "browser";
2261
2286
  wake: "wake";
2262
2287
  ocr: "ocr";
2288
+ secrets: "secrets";
2289
+ movements: "movements";
2263
2290
  }>>;
2264
2291
  settings: z.ZodOptional<z.ZodArray<z.ZodObject<{
2265
2292
  name: z.ZodString;
@@ -2318,6 +2345,9 @@ export declare const METHODS: {
2318
2345
  installer: "installer";
2319
2346
  provider: "provider";
2320
2347
  }>>;
2348
+ deliveryId: z.ZodOptional<z.ZodObject<{
2349
+ header: z.ZodString;
2350
+ }, z.core.$strip>>;
2321
2351
  }, z.core.$strip>, z.ZodObject<{
2322
2352
  providerKey: z.ZodString;
2323
2353
  scheme: z.ZodLiteral<"module">;
@@ -3775,6 +3805,7 @@ export declare const METHODS: {
3775
3805
  }, z.core.$strip>>;
3776
3806
  wakeKeys: z.ZodOptional<z.ZodArray<z.ZodString>>;
3777
3807
  checkpoint: z.ZodOptional<z.ZodUnknown>;
3808
+ deliveryId: z.ZodOptional<z.ZodString>;
3778
3809
  }, z.core.$strip>, z.ZodObject<{
3779
3810
  outcome: z.ZodLiteral<"refused">;
3780
3811
  status: z.ZodOptional<z.ZodNumber>;
package/dist/protocol.js CHANGED
@@ -664,6 +664,10 @@ exports.WireSignedInboundDeclaration = zod_1.z.object({
664
664
  .min(1),
665
665
  intercepts: zod_1.z.array(exports.WireInboundIntercept).optional(),
666
666
  secretIssuedBy: WireSecretIssuedBy.optional(),
667
+ /** The header carrying the provider's id for each delivery (GitHub's
668
+ * `x-github-delivery`), read by the host before the module sees the body:
669
+ * a redelivery under an id the host kept before is acked and runs nothing. */
670
+ deliveryId: zod_1.z.object({ header: zod_1.z.string().regex(HEADER_NAME, 'a delivery id header is a lower-case header name') }).optional(),
667
671
  });
668
672
  /**
669
673
  * The module checks its own inbound requests (`scheme: module`): the host
@@ -738,8 +742,13 @@ exports.WireModuleKind = zod_1.z.enum(exports.MODULE_KINDS);
738
742
  * other host leaves empty (a module asking for a page is refused by name),
739
743
  * and `wake`, which stays empty unless named (nobody is told work is due;
740
744
  * a scheduled worker finds it), and `ocr`, which stays empty unless named
741
- * (a scanned file is refused, saying the slot is empty). */
742
- exports.CORE_SLOTS = ['models', 'judge', 'store', 'files', 'limiter', 'loopGuard', 'browser', 'wake', 'ocr'];
745
+ * (a scanned file is refused, saying the slot is empty). `secrets` is
746
+ * where credentials are kept (`lf`'s default: its secrets file); a secrets
747
+ * module's own settings come from the environment or that file, never
748
+ * from itself. `movements` answers the project's movement files by name
749
+ * (`lf`'s default: the movements folder); its module's own settings come
750
+ * from the same two places. */
751
+ exports.CORE_SLOTS = ['models', 'judge', 'store', 'files', 'limiter', 'loopGuard', 'browser', 'wake', 'ocr', 'secrets', 'movements'];
743
752
  exports.WireCoreSlot = zod_1.z.enum(exports.CORE_SLOTS);
744
753
  /** One construction argument the install supplies (an Airtable `base`, a
745
754
  * Sheets `spreadsheet`): asked for when the module is set up (`lf connect`,
@@ -926,6 +935,9 @@ exports.WireInboundCheck = zod_1.z.discriminatedUnion('outcome', [
926
935
  events: zod_1.z.array(exports.WireDiscriminableEvent),
927
936
  wakeKeys: zod_1.z.array(zod_1.z.string().min(1)).optional(),
928
937
  checkpoint: zod_1.z.unknown().optional(),
938
+ /** The provider's id for this delivery: a redelivery under an id the
939
+ * host kept before is acked and runs nothing. */
940
+ deliveryId: zod_1.z.string().min(1).optional(),
929
941
  }),
930
942
  zod_1.z.object({
931
943
  outcome: zod_1.z.literal('refused'),
@@ -953,6 +965,8 @@ exports.HostModelRequest = zod_1.z.object({
953
965
  schema: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional(),
954
966
  toolName: zod_1.z.string().optional(),
955
967
  toolDescription: zod_1.z.string().optional(),
968
+ /** The run the call is made for, when it is made inside one: a host's usage rows attribute the call to it. */
969
+ runId: zod_1.z.string().optional(),
956
970
  });
957
971
  /** The tokens a model call spent: what a run's usage reports, beside its cost. */
958
972
  exports.WireModelUsage = zod_1.z.object({
@@ -5,3 +5,5 @@ export * from './files';
5
5
  export * from './browser';
6
6
  export * from './wake';
7
7
  export * from './ocr';
8
+ export * from './secrets';
9
+ export * from './movements';
@@ -24,3 +24,5 @@ __exportStar(require("./files"), exports);
24
24
  __exportStar(require("./browser"), exports);
25
25
  __exportStar(require("./wake"), exports);
26
26
  __exportStar(require("./ocr"), exports);
27
+ __exportStar(require("./secrets"), exports);
28
+ __exportStar(require("./movements"), exports);
@@ -10,6 +10,7 @@ export declare const ModelsCallRequest: z.ZodObject<{
10
10
  schema: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
11
11
  toolName: z.ZodOptional<z.ZodString>;
12
12
  toolDescription: z.ZodOptional<z.ZodString>;
13
+ runId: z.ZodOptional<z.ZodString>;
13
14
  effort: z.ZodOptional<z.ZodEnum<{
14
15
  low: "low";
15
16
  medium: "medium";
@@ -0,0 +1,41 @@
1
+ import { z } from 'zod';
2
+ export declare const MOVEMENTS_METHODS: readonly ["movements.list", "movements.read", "movements.write"];
3
+ /** A file's path under the movements folder: `/`-separated, ending `.mvt`,
4
+ * no segment empty, `.` or `..`, and no `\` (`orders/sync.mvt`). */
5
+ export declare const MovementPath: z.ZodString;
6
+ export declare function isMovementPath(path: string): boolean;
7
+ /** One file `movements.list` names; without a version, `lf` reads it on every scan. */
8
+ export declare const MovementsListed: z.ZodObject<{
9
+ path: z.ZodString;
10
+ version: z.ZodOptional<z.ZodString>;
11
+ }, z.core.$strip>;
12
+ export declare const MovementsListAnswer: z.ZodArray<z.ZodObject<{
13
+ path: z.ZodString;
14
+ version: z.ZodOptional<z.ZodString>;
15
+ }, z.core.$strip>>;
16
+ /** What `movements.read` answers (or null: nothing is at the path). */
17
+ export declare const MovementsReadAnswer: z.ZodNullable<z.ZodObject<{
18
+ text: z.ZodString;
19
+ version: z.ZodString;
20
+ }, z.core.$strip>>;
21
+ export declare const MovementsReadRequest: z.ZodObject<{
22
+ path: z.ZodString;
23
+ }, z.core.$strip>;
24
+ /** `expectedVersion` is present: a version replaces the file only if it is
25
+ * still at it; null creates it only if nothing is at the path. */
26
+ export declare const MovementsWriteRequest: z.ZodObject<{
27
+ path: z.ZodString;
28
+ text: z.ZodString;
29
+ expectedVersion: z.ZodNullable<z.ZodString>;
30
+ }, z.core.$strip>;
31
+ export declare const MovementsWriteAnswer: z.ZodDiscriminatedUnion<[z.ZodObject<{
32
+ kind: z.ZodLiteral<"written">;
33
+ version: z.ZodString;
34
+ }, z.core.$strip>, z.ZodObject<{
35
+ kind: z.ZodLiteral<"conflict">;
36
+ current: z.ZodNullable<z.ZodString>;
37
+ }, z.core.$strip>, z.ZodObject<{
38
+ kind: z.ZodLiteral<"read_only">;
39
+ reason: z.ZodString;
40
+ }, z.core.$strip>], "kind">;
41
+ export type MovementsWriteAnswerShape = z.infer<typeof MovementsWriteAnswer>;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ // The movements slot's methods (docs/contracts/movements-slot.md): where the
3
+ // project's movement files live. A module lists every file by its path under
4
+ // the movements folder, reads one, and writes one by compare-and-swap on its
5
+ // version. `lf.yaml` and the externals folder stay local files.
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.MovementsWriteAnswer = exports.MovementsWriteRequest = exports.MovementsReadRequest = exports.MovementsReadAnswer = exports.MovementsListAnswer = exports.MovementsListed = exports.MovementPath = exports.MOVEMENTS_METHODS = void 0;
8
+ exports.isMovementPath = isMovementPath;
9
+ const zod_1 = require("zod");
10
+ exports.MOVEMENTS_METHODS = ['movements.list', 'movements.read', 'movements.write'];
11
+ /** A file's path under the movements folder: `/`-separated, ending `.mvt`,
12
+ * no segment empty, `.` or `..`, and no `\` (`orders/sync.mvt`). */
13
+ exports.MovementPath = zod_1.z.string().refine(isMovementPath, 'a movement path: relative to the movements folder, `/`-separated, ending .mvt');
14
+ function isMovementPath(path) {
15
+ const segments = path.split('/');
16
+ return (!path.includes('\\') &&
17
+ path.endsWith('.mvt') &&
18
+ segments.every((segment) => segment !== '' && segment !== '.' && segment !== '..') &&
19
+ segments.at(-1) !== '.mvt');
20
+ }
21
+ /** Opaque; it changes whenever the text changes. */
22
+ const Version = zod_1.z.string().min(1);
23
+ /** One file `movements.list` names; without a version, `lf` reads it on every scan. */
24
+ exports.MovementsListed = zod_1.z.object({ path: exports.MovementPath, version: Version.optional() });
25
+ exports.MovementsListAnswer = zod_1.z.array(exports.MovementsListed);
26
+ /** What `movements.read` answers (or null: nothing is at the path). */
27
+ exports.MovementsReadAnswer = zod_1.z.object({ text: zod_1.z.string(), version: Version }).nullable();
28
+ exports.MovementsReadRequest = zod_1.z.object({ path: exports.MovementPath });
29
+ /** `expectedVersion` is present: a version replaces the file only if it is
30
+ * still at it; null creates it only if nothing is at the path. */
31
+ exports.MovementsWriteRequest = zod_1.z.object({ path: exports.MovementPath, text: zod_1.z.string(), expectedVersion: Version.nullable() });
32
+ exports.MovementsWriteAnswer = zod_1.z.discriminatedUnion('kind', [
33
+ zod_1.z.object({ kind: zod_1.z.literal('written'), version: Version }),
34
+ /** `current`: the version there now, or null when there is none. */
35
+ zod_1.z.object({ kind: zod_1.z.literal('conflict'), current: Version.nullable() }),
36
+ /** The module keeps the project's movements where `lf` cannot change them. */
37
+ zod_1.z.object({ kind: zod_1.z.literal('read_only'), reason: zod_1.z.string().min(1) }),
38
+ ]);
@@ -0,0 +1,65 @@
1
+ import { z } from 'zod';
2
+ export declare const SECRETS_METHODS: readonly ["secrets.resolve", "secrets.writeBack", "secrets.list", "secrets.lock", "secrets.unlock", "secrets.assertWritable", "secrets.create", "secrets.replace", "secrets.delete"];
3
+ /** What `secrets.resolve` answers (or null: nothing is stored under the ref). */
4
+ export declare const SecretsRecord: z.ZodObject<{
5
+ fields: z.ZodRecord<z.ZodString, z.ZodString>;
6
+ version: z.ZodString;
7
+ }, z.core.$strip>;
8
+ export declare const SecretsWriteBackAnswer: z.ZodDiscriminatedUnion<[z.ZodObject<{
9
+ kind: z.ZodLiteral<"written">;
10
+ record: z.ZodObject<{
11
+ fields: z.ZodRecord<z.ZodString, z.ZodString>;
12
+ version: z.ZodString;
13
+ }, z.core.$strip>;
14
+ }, z.core.$strip>, z.ZodObject<{
15
+ kind: z.ZodLiteral<"not_persisted">;
16
+ record: z.ZodObject<{
17
+ fields: z.ZodRecord<z.ZodString, z.ZodString>;
18
+ version: z.ZodString;
19
+ }, z.core.$strip>;
20
+ why: z.ZodString;
21
+ }, z.core.$strip>, z.ZodObject<{
22
+ kind: z.ZodLiteral<"conflict">;
23
+ current: z.ZodObject<{
24
+ fields: z.ZodRecord<z.ZodString, z.ZodString>;
25
+ version: z.ZodString;
26
+ }, z.core.$strip>;
27
+ }, z.core.$strip>, z.ZodObject<{
28
+ kind: z.ZodLiteral<"missing">;
29
+ }, z.core.$strip>], "kind">;
30
+ /** How an entry is bound: an install of a module, a hand-written legacy
31
+ * entry, or a credential the module declares. */
32
+ export declare const SecretsBinding: z.ZodUnion<readonly [z.ZodLiteral<"install">, z.ZodLiteral<"legacy">, z.ZodObject<{
33
+ credential: z.ZodString;
34
+ }, z.core.$strip>]>;
35
+ export type SecretsBindingShape = z.infer<typeof SecretsBinding>;
36
+ export declare const SecretsListed: z.ZodObject<{
37
+ ref: z.ZodString;
38
+ external: z.ZodString;
39
+ binding: z.ZodUnion<readonly [z.ZodLiteral<"install">, z.ZodLiteral<"legacy">, z.ZodObject<{
40
+ credential: z.ZodString;
41
+ }, z.core.$strip>]>;
42
+ version: z.ZodString;
43
+ }, z.core.$strip>;
44
+ /** `secrets.lock` answers a token, or null when another holds the lease. */
45
+ export declare const SecretsLockAnswer: z.ZodNullable<z.ZodObject<{
46
+ token: z.ZodString;
47
+ }, z.core.$strip>>;
48
+ /** What `secrets.assertWritable`, `create`, `replace` and `delete` answer
49
+ * besides null: the module keeps its credentials where lf cannot change them. */
50
+ export declare const SecretsReadOnlyAnswer: z.ZodObject<{
51
+ kind: z.ZodLiteral<"read_only">;
52
+ reason: z.ZodString;
53
+ }, z.core.$strip>;
54
+ export declare const SecretsEntryAnswer: z.ZodNullable<z.ZodObject<{
55
+ kind: z.ZodLiteral<"read_only">;
56
+ reason: z.ZodString;
57
+ }, z.core.$strip>>;
58
+ export declare const SecretsEntryRequest: z.ZodObject<{
59
+ ref: z.ZodString;
60
+ external: z.ZodString;
61
+ binding: z.ZodUnion<readonly [z.ZodLiteral<"install">, z.ZodLiteral<"legacy">, z.ZodObject<{
62
+ credential: z.ZodString;
63
+ }, z.core.$strip>]>;
64
+ fields: z.ZodRecord<z.ZodString, z.ZodString>;
65
+ }, z.core.$strip>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ // The secrets slot's methods (docs/contracts/secrets-slot.md): where lf's
3
+ // credentials are kept. A module resolves and lists what it holds, takes a
4
+ // write-back by version, holds a credential under a lease while a refresh
5
+ // spends its token, and changes whole entries for `lf connect` and
6
+ // `lf credential`. Token refresh stays in lf; a module only stores.
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.SecretsEntryRequest = exports.SecretsEntryAnswer = exports.SecretsReadOnlyAnswer = exports.SecretsLockAnswer = exports.SecretsListed = exports.SecretsBinding = exports.SecretsWriteBackAnswer = exports.SecretsRecord = exports.SECRETS_METHODS = void 0;
9
+ const zod_1 = require("zod");
10
+ exports.SECRETS_METHODS = [
11
+ 'secrets.resolve',
12
+ 'secrets.writeBack',
13
+ 'secrets.list',
14
+ 'secrets.lock',
15
+ 'secrets.unlock',
16
+ 'secrets.assertWritable',
17
+ 'secrets.create',
18
+ 'secrets.replace',
19
+ 'secrets.delete',
20
+ ];
21
+ const Fields = zod_1.z.record(zod_1.z.string(), zod_1.z.string());
22
+ /** What `secrets.resolve` answers (or null: nothing is stored under the ref). */
23
+ exports.SecretsRecord = zod_1.z.object({ fields: Fields, version: zod_1.z.string().min(1) });
24
+ exports.SecretsWriteBackAnswer = zod_1.z.discriminatedUnion('kind', [
25
+ zod_1.z.object({ kind: zod_1.z.literal('written'), record: exports.SecretsRecord }),
26
+ zod_1.z.object({ kind: zod_1.z.literal('not_persisted'), record: exports.SecretsRecord, why: zod_1.z.string() }),
27
+ zod_1.z.object({ kind: zod_1.z.literal('conflict'), current: exports.SecretsRecord }),
28
+ zod_1.z.object({ kind: zod_1.z.literal('missing') }),
29
+ ]);
30
+ /** How an entry is bound: an install of a module, a hand-written legacy
31
+ * entry, or a credential the module declares. */
32
+ exports.SecretsBinding = zod_1.z.union([zod_1.z.literal('install'), zod_1.z.literal('legacy'), zod_1.z.object({ credential: zod_1.z.string().min(1) })]);
33
+ exports.SecretsListed = zod_1.z.object({ ref: zod_1.z.string().min(1), external: zod_1.z.string().min(1), binding: exports.SecretsBinding, version: zod_1.z.string() });
34
+ /** `secrets.lock` answers a token, or null when another holds the lease. */
35
+ exports.SecretsLockAnswer = zod_1.z.object({ token: zod_1.z.string().min(1) }).nullable();
36
+ /** What `secrets.assertWritable`, `create`, `replace` and `delete` answer
37
+ * besides null: the module keeps its credentials where lf cannot change them. */
38
+ exports.SecretsReadOnlyAnswer = zod_1.z.object({ kind: zod_1.z.literal('read_only'), reason: zod_1.z.string().min(1) });
39
+ exports.SecretsEntryAnswer = exports.SecretsReadOnlyAnswer.nullable();
40
+ exports.SecretsEntryRequest = zod_1.z.object({ ref: zod_1.z.string().min(1), external: zod_1.z.string().min(1), binding: exports.SecretsBinding, fields: Fields });
@@ -39,6 +39,8 @@ export declare const WireSlotManifest: z.ZodObject<{
39
39
  browser: "browser";
40
40
  wake: "wake";
41
41
  ocr: "ocr";
42
+ secrets: "secrets";
43
+ movements: "movements";
42
44
  }>;
43
45
  methods: z.ZodArray<z.ZodString>;
44
46
  }, z.core.$strip>;
@@ -1,5 +1,6 @@
1
- import { CATALOG_SNAPSHOT_VERSION, DEPRECATED_CATALOG_SNAPSHOT_VERSIONS, SUPPORTED_CATALOG_SNAPSHOT_VERSIONS } from '@listen-fire/movement-lang';
1
+ import { CATALOG_SNAPSHOT_VERSION, DEPRECATED_CATALOG_SNAPSHOT_VERSIONS, STORY_ANALYSIS_VERSION, SUPPORTED_CATALOG_SNAPSHOT_VERSIONS, SUPPORTED_STORY_ANALYSIS_VERSIONS } from '@listen-fire/movement-lang';
2
2
  export { CATALOG_SNAPSHOT_VERSION, DEPRECATED_CATALOG_SNAPSHOT_VERSIONS, SUPPORTED_CATALOG_SNAPSHOT_VERSIONS };
3
+ export { STORY_ANALYSIS_VERSION, SUPPORTED_STORY_ANALYSIS_VERSIONS };
3
4
  /** A parked flow's state (docs/contracts/park-state.md). Engine to engine: a
4
5
  * host stores it and hands it back. Version 2 is the Rust engine's; the earlier
5
6
  * TypeScript engine wrote and read 1. */
@@ -47,6 +48,11 @@ export declare const CONTRACTS: {
47
48
  readonly supported: readonly [1];
48
49
  readonly deprecated: readonly [];
49
50
  };
51
+ readonly 'story-analysis': {
52
+ readonly current: 1;
53
+ readonly supported: readonly number[];
54
+ readonly deprecated: readonly [];
55
+ };
50
56
  };
51
57
  /** The language's contract (docs/contracts/language-versions.md) is not an
52
58
  * integer of its own: it is the release's version, and a release reads the
package/dist/versions.js CHANGED
@@ -8,13 +8,15 @@
8
8
  // the version at the point of difference, never by a forked reader. A version
9
9
  // this release does not support is refused at the boundary, loudly.
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.LANGUAGE_CONTRACT = exports.CONTRACTS = exports.SYSTEM_CALLER_VERSION = exports.SUPPORTED_HOST_FAMILIES_VERSIONS = exports.HOST_FAMILIES_VERSION = exports.SUPPORTED_PARK_STATE_VERSIONS = exports.PARK_STATE_VERSION = exports.SUPPORTED_CATALOG_SNAPSHOT_VERSIONS = exports.DEPRECATED_CATALOG_SNAPSHOT_VERSIONS = exports.CATALOG_SNAPSHOT_VERSION = void 0;
11
+ exports.LANGUAGE_CONTRACT = exports.CONTRACTS = exports.SYSTEM_CALLER_VERSION = exports.SUPPORTED_HOST_FAMILIES_VERSIONS = exports.HOST_FAMILIES_VERSION = exports.SUPPORTED_PARK_STATE_VERSIONS = exports.PARK_STATE_VERSION = exports.SUPPORTED_STORY_ANALYSIS_VERSIONS = exports.STORY_ANALYSIS_VERSION = exports.SUPPORTED_CATALOG_SNAPSHOT_VERSIONS = exports.DEPRECATED_CATALOG_SNAPSHOT_VERSIONS = exports.CATALOG_SNAPSHOT_VERSION = void 0;
12
12
  exports.refuseUnsupportedHostFamiliesVersion = refuseUnsupportedHostFamiliesVersion;
13
13
  exports.refuseUnsupportedParkStateVersion = refuseUnsupportedParkStateVersion;
14
14
  const movement_lang_1 = require("@listen-fire/movement-lang");
15
15
  Object.defineProperty(exports, "CATALOG_SNAPSHOT_VERSION", { enumerable: true, get: function () { return movement_lang_1.CATALOG_SNAPSHOT_VERSION; } });
16
16
  Object.defineProperty(exports, "DEPRECATED_CATALOG_SNAPSHOT_VERSIONS", { enumerable: true, get: function () { return movement_lang_1.DEPRECATED_CATALOG_SNAPSHOT_VERSIONS; } });
17
+ Object.defineProperty(exports, "STORY_ANALYSIS_VERSION", { enumerable: true, get: function () { return movement_lang_1.STORY_ANALYSIS_VERSION; } });
17
18
  Object.defineProperty(exports, "SUPPORTED_CATALOG_SNAPSHOT_VERSIONS", { enumerable: true, get: function () { return movement_lang_1.SUPPORTED_CATALOG_SNAPSHOT_VERSIONS; } });
19
+ Object.defineProperty(exports, "SUPPORTED_STORY_ANALYSIS_VERSIONS", { enumerable: true, get: function () { return movement_lang_1.SUPPORTED_STORY_ANALYSIS_VERSIONS; } });
18
20
  const protocol_1 = require("./protocol");
19
21
  /** A parked flow's state (docs/contracts/park-state.md). Engine to engine: a
20
22
  * host stores it and hands it back. Version 2 is the Rust engine's; the earlier
@@ -46,6 +48,8 @@ exports.CONTRACTS = {
46
48
  },
47
49
  'adapter-protocol': { current: protocol_1.MANIFEST_PROTOCOL_VERSION, supported: [protocol_1.MANIFEST_PROTOCOL_VERSION], deprecated: [] },
48
50
  'system-caller': { current: exports.SYSTEM_CALLER_VERSION, supported: [exports.SYSTEM_CALLER_VERSION], deprecated: [] },
51
+ // The shape of what the check settled, for a surface that draws a movement's story (docs/contracts/story-analysis.md).
52
+ 'story-analysis': { current: movement_lang_1.STORY_ANALYSIS_VERSION, supported: [...movement_lang_1.SUPPORTED_STORY_ANALYSIS_VERSIONS], deprecated: [] },
49
53
  };
50
54
  /** The language's contract (docs/contracts/language-versions.md) is not an
51
55
  * integer of its own: it is the release's version, and a release reads the
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@listen-fire/engine-contracts",
3
3
  "license": "Apache-2.0",
4
- "version": "0.12.0-rc.7",
4
+ "version": "0.12.0",
5
5
  "description": "The contracts the movement engine speaks: the tenant id, the host families and entry-point inputs, the parked state, file descriptors, the adapter protocol, the adapter contract and its manifest, the catalog's schema types and positions, the Expression vocabulary, plugins as data and the model names. Runtime-neutral: no Node import, no ambient types.",
6
6
  "engines": {
7
- "node": "22.20.0"
7
+ "node": ">=22.23.4 <23"
8
8
  },
9
9
  "main": "./dist/index.js",
10
10
  "types": "./dist/index.d.ts",
@@ -30,7 +30,7 @@
30
30
  "type": "commonjs",
31
31
  "dependencies": {
32
32
  "zod": "4.1.12",
33
- "@listen-fire/movement-lang": "^0.12.0-rc.7"
33
+ "@listen-fire/movement-lang": "^0.12.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/node": "20.16.5",
@@ -45,8 +45,7 @@
45
45
  "dist"
46
46
  ],
47
47
  "publishConfig": {
48
- "access": "public",
49
- "tag": "next"
48
+ "access": "public"
50
49
  },
51
50
  "scripts": {
52
51
  "code:type-check": "tsc --pretty --noEmit && node __embed_smoke__/check.cjs",