@intentius/chant-lexicon-fountain 0.76.0 → 0.78.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.
Files changed (56) hide show
  1. package/README.md +6 -5
  2. package/dist/coverage.d.ts +6 -5
  3. package/dist/coverage.d.ts.map +1 -1
  4. package/dist/generated/index.d.ts.map +1 -1
  5. package/dist/integrity.json +10 -9
  6. package/dist/lint/audit-catalog.d.ts.map +1 -1
  7. package/dist/lint/post-synth/ftn023-acp-runtime-command.d.ts +3 -2
  8. package/dist/lint/post-synth/ftn023-acp-runtime-command.d.ts.map +1 -1
  9. package/dist/lint/post-synth/ftn024-setup-timeout-range.d.ts +3 -0
  10. package/dist/lint/post-synth/ftn024-setup-timeout-range.d.ts.map +1 -0
  11. package/dist/lint/post-synth/index.d.ts.map +1 -1
  12. package/dist/lsp/hover.d.ts.map +1 -1
  13. package/dist/manifest.json +2 -2
  14. package/dist/meta.json +14 -2
  15. package/dist/okf/index.md +2 -1
  16. package/dist/okf/rules/FTN023.md +2 -2
  17. package/dist/okf/rules/FTN024.md +15 -0
  18. package/dist/okf/types/Agent.md +7 -5
  19. package/dist/okf/types/Environment.md +3 -0
  20. package/dist/okf/types/Vault.md +1 -0
  21. package/dist/rules/ftn016-runtime-model-valid.ts +5 -5
  22. package/dist/rules/ftn023-acp-runtime-command.ts +4 -3
  23. package/dist/rules/ftn024-setup-timeout-range.ts +48 -0
  24. package/dist/skills/chant-fountain-ops.md +6 -5
  25. package/dist/skills/chant-fountain-secrets.md +2 -2
  26. package/dist/skills/chant-fountain.md +2 -2
  27. package/dist/spec/fetch.d.ts +18 -3
  28. package/dist/spec/fetch.d.ts.map +1 -1
  29. package/dist/spec/parse.d.ts +5 -3
  30. package/dist/spec/parse.d.ts.map +1 -1
  31. package/dist/types/index.d.ts +14 -6
  32. package/package.json +2 -2
  33. package/src/codegen/docs.ts +2 -2
  34. package/src/composites/composites.test.ts +19 -0
  35. package/src/coverage.test.ts +8 -0
  36. package/src/coverage.ts +24 -8
  37. package/src/generated/index.d.ts +14 -6
  38. package/src/generated/index.ts +2 -2
  39. package/src/generated/lexicon-fountain.json +14 -2
  40. package/src/lint/audit-catalog.ts +11 -3
  41. package/src/lint/post-synth/ftn016-runtime-model-valid.ts +5 -5
  42. package/src/lint/post-synth/ftn023-acp-runtime-command.ts +4 -3
  43. package/src/lint/post-synth/ftn024-setup-timeout-range.ts +48 -0
  44. package/src/lint/post-synth/index.ts +2 -0
  45. package/src/lint/post-synth/post-synth.test.ts +24 -0
  46. package/src/lsp/hover.test.ts +9 -2
  47. package/src/lsp/hover.ts +6 -4
  48. package/src/plugin.test.ts +1 -1
  49. package/src/serializer.test.ts +2 -2
  50. package/src/skills/chant-fountain-ops.md +6 -5
  51. package/src/skills/chant-fountain-secrets.md +2 -2
  52. package/src/skills/chant-fountain.md +2 -2
  53. package/src/spec/fetch.ts +46 -6
  54. package/src/spec/fountain-openapi.snapshot.json +12221 -4739
  55. package/src/spec/parse.ts +84 -41
  56. package/src/spec/spec.test.ts +163 -0
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  fountain lexicon plugin for [chant](https://github.com/intentius/chant).
4
4
 
5
- [fountain](https://github.com/BinaryBourbon/fountain) runs coding agents in
5
+ [fountain](https://github.com/managoat/fountain) runs coding agents in
6
6
  sandboxed VMs. This lexicon declares its workload layer as typed chant
7
7
  resources: `Environment` (sandbox baseline), `Vault` (env-var overrides),
8
8
  `Agent` (a runnable agent config), `Teammate` (an agent seated on the team,
@@ -41,10 +41,11 @@ export const nightly = new Schedule({
41
41
  });
42
42
  ```
43
43
 
44
- `runtime: "acp"` and `runtime_command` are on the generated `Agent` type as
45
- chant extensions. Upstream does not have them until
46
- [BinaryBourbon/fountain#1634](https://github.com/BinaryBourbon/fountain/pull/1634)
47
- lands, and an instance without that PR rejects the pair at apply.
44
+ Types are generated from fountain v0.21.0. That release describes
45
+ `runtime: "acp"` and `runtime_command` on `Agent` itself, so an older instance
46
+ rejects the pair at apply. `secrets` on `Environment` and `Vault` is the one
47
+ field the lexicon adds to the request schemas, taken from fountain's manifest
48
+ format.
48
49
 
49
50
  For agents handling anything sensitive, `ConciergeStack` bundles the
50
51
  locked-down defaults (deny-all egress, no vault overrides, ownership marker
@@ -18,11 +18,12 @@
18
18
  /**
19
19
  * Request schemas with no typed resource, and why.
20
20
  *
21
- * Every `*Request` schema in the pinned spec is either modeled or listed here.
22
- * v0.16.0 describes the whole product, not just the workload layer, so most of
23
- * this list is one restatement of the same three reasons: it is a session and
24
- * not a thing, it is an account operation and not estate, or it is write-only
25
- * and so could never be diffed.
21
+ * Every `*Request` schema in the pinned spec is either modeled or listed here,
22
+ * and every name listed here is a schema the pinned spec has (the coverage test
23
+ * holds both). The spec describes the whole product, not just the workload
24
+ * layer, so most of this list restates three reasons: it is a session and not a
25
+ * thing, it is an account operation and not estate, or it is write-only and so
26
+ * could never be diffed.
26
27
  */
27
28
  export declare const EXCLUDED_KINDS: Record<string, string>;
28
29
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAmDjD,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKxD,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yEAAyE;IACzE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,yDAAyD;IACzD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,iEAAiE;IACjE,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC7D;AAOD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,OAAO,EAAE,eAAe,GACvB,sBAAsB,CAqDxB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAGpE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAkCpE;AAED,sDAAsD;AACtD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,sBAAsB,CASrF;AAED,wBAAsB,uBAAuB,CAAC,IAAI,CAAC,EAAE;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAsBlC"}
1
+ {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkEjD,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKxD,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yEAAyE;IACzE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,yDAAyD;IACzD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,iEAAiE;IACjE,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,+EAA+E;IAC/E,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC7D;AAOD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,OAAO,EAAE,eAAe,GACvB,sBAAsB,CAqDxB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAGpE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAkCpE;AAED,sDAAsD;AACtD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,sBAAsB,CASrF;AAED,wBAAsB,uBAAuB,CAAC,IAAI,CAAC,EAAE;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAsBlC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generated/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,KAAK,+IAAqN,CAAC;AACxO,eAAO,MAAM,WAAW,+IAA2O,CAAC;AACpQ,eAAO,MAAM,QAAQ,+IAAgR,CAAC;AACtS,eAAO,MAAM,QAAQ,+IAA4N,CAAC;AAClP,eAAO,MAAM,KAAK,+IAAqJ,CAAC;AACxK,eAAO,MAAM,OAAO,+IAAyP,CAAC;AAE9Q,eAAO,MAAM,UAAU,0GAAyD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/generated/index.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,KAAK,+IAAqN,CAAC;AACxO,eAAO,MAAM,WAAW,+IAAuL,CAAC;AAChN,eAAO,MAAM,QAAQ,+IAAgR,CAAC;AACtS,eAAO,MAAM,QAAQ,+IAAwM,CAAC;AAC9N,eAAO,MAAM,KAAK,+IAAqJ,CAAC;AACxK,eAAO,MAAM,OAAO,+IAAyP,CAAC;AAE9Q,eAAO,MAAM,UAAU,0GAAyD,CAAC"}
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "algorithm": "sha256",
3
3
  "artifacts": {
4
- "manifest.json": "e2a11b25b51cd9dad49c40bd4894870b6ca73ffd40feb937ccd1bb742dfd7a0d",
5
- "meta.json": "ed2c507b18806e3eac6641d9b8fc85cd59401a86ab39ba39405869fab91ba729",
6
- "types/index.d.ts": "242196b012731a2fb7b586159ab234bf33f63b1653e49fc625b1cff0b3f7f1f3",
4
+ "manifest.json": "aa3acd6881163a56c6439a5bc69623fa527034d04d4344a0fceccb01602769ee",
5
+ "meta.json": "3301437a2a56eaf1a5cc8f6eabb18a40767f916e09701b2d9bf20aba4066738c",
6
+ "types/index.d.ts": "cf6b634fe0a8e9e96f1d9d07e3df53838def2683dc93dbe3c7fd971c6d3908ae",
7
7
  "rules/ftn001-no-secret-literals.ts": "a417b194cd7039911cca9a0f14c49b042dfa6b1ee48517f7c2e22b16590a8599",
8
8
  "rules/ftn010-networking-explicit.ts": "29d62025b456b207758a32d463b686e1acc5f1d39e36a6e8999946df26bbe1fc",
9
9
  "rules/ftn011-no-unrestricted-networking.ts": "2bf44295dfa5825a7863e49514f75ea9a74fe2658869d908a50de3a287a398a8",
@@ -11,16 +11,17 @@
11
11
  "rules/ftn013-substitution-resolvable.ts": "1425ca7de9494725ad4ec0bcb22abc30cff718d3fc3816fb86322897ebcaf451",
12
12
  "rules/ftn014-vault-shadowing.ts": "e966a441c52f57fee059e3e4834da2c5f9d12c71e551924beebd7d0740f714e1",
13
13
  "rules/ftn015-mcp-secret-env-substitution.ts": "88dc87c8f403a2fe48ee43bc4a4678d95273dba810135c8e74750f1bd62d2564",
14
- "rules/ftn016-runtime-model-valid.ts": "22a4f8f94b4baf55714a629ea67045a48826ceaf51222f0ac5acad9e092bca46",
14
+ "rules/ftn016-runtime-model-valid.ts": "5bb5e399ab4efd764816dec221e3ca424ba1ce2470d00b034fbcc95b12de4979",
15
15
  "rules/ftn017-unique-resource-names.ts": "866f3f385083f96b6e8a18fa6f5624bab43752c5d22e7291e95835e62745d26c",
16
16
  "rules/ftn020-schedule-cron-syntax.ts": "a4291345035fbfddfa443aeae59c08be4d35f383a28cd19c827bf162b79f7703",
17
17
  "rules/ftn021-typed-references-resolve.ts": "1f62b4d1a47707b00634a50960bdd8233c292898a76aac0089ab02de76460d96",
18
18
  "rules/ftn022-webhook-url-public-https.ts": "06c4997350d6ad5b713b5f205becf89f9479136f015a76ebfff79938b45c6206",
19
- "rules/ftn023-acp-runtime-command.ts": "856e12f47d7fd1dfff4a2d195ea857b21d5004305bcf445887583be9df27c72a",
20
- "skills/chant-fountain.md": "909864c17d34ac1f614b286555bbc4a8d859530d1808b6fb7c32a24ef6a3bf20",
21
- "skills/chant-fountain-secrets.md": "27e349a91589510a92e518c7d7824a4a322cab5ef242cf5799373a55cbfcd1cd",
22
- "skills/chant-fountain-ops.md": "206b9088be0c43807df32de39949888bd28eefd870a191743e051814c94b2d0c",
19
+ "rules/ftn023-acp-runtime-command.ts": "1c46442052061d0f817afcf12b37880c1b261f9b4cffdbe9dcf87c7967383f6d",
20
+ "rules/ftn024-setup-timeout-range.ts": "2f292f3ecc3175604a47f03ff0e783b25b125f2d040684f189ce17650f78f121",
21
+ "skills/chant-fountain.md": "906a312756a02c88de634915f63ab4dfe1b1078ff4d8cfb4b6dc97eec14bc237",
22
+ "skills/chant-fountain-secrets.md": "40aa847d62547581bebdde630b54796c4e1cbf498869392e0d396d96a75c0ab6",
23
+ "skills/chant-fountain-ops.md": "4e72f0a0c7477a9e98f85ea45e49ba69e8a699f9c13ba0f0cf1cb20a88151373",
23
24
  "skills/chant-fountain-locked-sandboxes.md": "de82f06cb3a08ba6bf3ae45fb9869e21d6da18b9ebe0fc769da8aebaceea7dd1"
24
25
  },
25
- "composite": "7f81d2852dd7719fb522d023fbdc2fdca18d7c36ac0fe425e0bf342ce478a7d3"
26
+ "composite": "ee2fae5b543bbf3521c91d488db426aadd40cb6825299244b3432e3e91e06dc9"
26
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"audit-catalog.d.ts","sourceRoot":"","sources":["../../src/lint/audit-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAa,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AA+B1E,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAsGzD,CAAC"}
1
+ {"version":3,"file":"audit-catalog.d.ts","sourceRoot":"","sources":["../../src/lint/audit-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAa,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AA+B1E,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CA8GzD,CAAC"}
@@ -9,8 +9,9 @@ import type { PostSynthCheck } from "@intentius/chant/lint/post-synth";
9
9
  * expects to run that nothing will ever execute, which is worse than an error
10
10
  * because it looks configured.
11
11
  *
12
- * Both fields are chant extensions pending BinaryBourbon/fountain#1634; the
13
- * rule holds the shape steady until upstream enforces it.
12
+ * Both fields are in the spec since fountain v0.21.0, and the server refuses
13
+ * either half without the other at apply. The rule moves that refusal to
14
+ * build, where it is a diagnostic in review instead of a 422 in a run.
14
15
  */
15
16
  export declare const acpRuntimeCommandCheck: PostSynthCheck;
16
17
  //# sourceMappingURL=ftn023-acp-runtime-command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ftn023-acp-runtime-command.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/ftn023-acp-runtime-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAyC,MAAM,kCAAkC,CAAC;AAG9G;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,sBAAsB,EAAE,cAwCpC,CAAC"}
1
+ {"version":3,"file":"ftn023-acp-runtime-command.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/ftn023-acp-runtime-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAyC,MAAM,kCAAkC,CAAC;AAG9G;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,sBAAsB,EAAE,cAwCpC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PostSynthCheck } from "@intentius/chant/lint/post-synth";
2
+ export declare const setupTimeoutRangeCheck: PostSynthCheck;
3
+ //# sourceMappingURL=ftn024-setup-timeout-range.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ftn024-setup-timeout-range.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/ftn024-setup-timeout-range.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAyC,MAAM,kCAAkC,CAAC;AAoB9G,eAAO,MAAM,sBAAsB,EAAE,cA2BpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAcvE,eAAO,MAAM,eAAe,EAAE,cAAc,EAa3C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lint/post-synth/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAevE,eAAO,MAAM,eAAe,EAAE,cAAc,EAc3C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../src/lsp/hover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AA0E1E,4DAA4D;AAC5D,wBAAgB,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,CAE9D"}
1
+ {"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../src/lsp/hover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AA4E1E,4DAA4D;AAC5D,wBAAgB,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,CAE9D"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "fountain",
3
- "version": "0.76.0",
3
+ "version": "0.78.0",
4
4
  "chantVersion": ">=0.1.0",
5
5
  "namespace": "Fountain",
6
- "specVersion": "v0.16.0"
6
+ "specVersion": "v0.21.0"
7
7
  }
package/dist/meta.json CHANGED
@@ -5,9 +5,11 @@
5
5
  "lexicon": "fountain",
6
6
  "props": [
7
7
  "allowed_environment_ids",
8
+ "allowed_inference_credential_ids",
8
9
  "allowed_vault_ids",
9
10
  "description",
10
11
  "environment_id",
12
+ "inference_credential_id",
11
13
  "mcp_servers",
12
14
  "metadata",
13
15
  "model",
@@ -24,6 +26,9 @@
24
26
  "environment_id": {
25
27
  "format": "uuid"
26
28
  },
29
+ "inference_credential_id": {
30
+ "format": "uuid"
31
+ },
27
32
  "model": {
28
33
  "pattern": "^[a-z0-9_-]+/[a-z0-9._-]+$"
29
34
  },
@@ -68,7 +73,9 @@
68
73
  "networking_type",
69
74
  "packages",
70
75
  "repositories",
71
- "setup_script"
76
+ "secrets",
77
+ "setup_script",
78
+ "setup_timeout_seconds"
72
79
  ],
73
80
  "propertyConstraints": {
74
81
  "name": {
@@ -80,6 +87,10 @@
80
87
  "unrestricted",
81
88
  "limited"
82
89
  ]
90
+ },
91
+ "setup_timeout_seconds": {
92
+ "minimum": 1,
93
+ "maximum": 900
83
94
  }
84
95
  }
85
96
  },
@@ -154,7 +165,8 @@
154
165
  "props": [
155
166
  "description",
156
167
  "metadata",
157
- "name"
168
+ "name",
169
+ "secrets"
158
170
  ],
159
171
  "propertyConstraints": {
160
172
  "name": {
package/dist/okf/index.md CHANGED
@@ -25,4 +25,5 @@ okf_version: '0.2'
25
25
  * [FTN020](/rules/FTN020.md) - Schedule cron must be five- or six-field UTC cron (no @nickname shorthands)
26
26
  * [FTN021](/rules/FTN021.md) - A Teammate's agent and a Schedule's teammate must resolve within the build
27
27
  * [FTN022](/rules/FTN022.md) - Webhook url must be https and must not be a loopback or private address
28
- * [FTN023](/rules/FTN023.md) - FTN023
28
+ * [FTN023](/rules/FTN023.md) - Agent runtime "acp" requires runtime_command, and no other runtime accepts one
29
+ * [FTN024](/rules/FTN024.md) - Environment setup_timeout_seconds must be an integer from 1 to 900
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  type: post-synth-check
3
3
  title: FTN023
4
- description: FTN023
4
+ description: Agent runtime "acp" requires runtime_command, and no other runtime accepts one
5
5
  id: FTN023
6
6
  severity: error
7
7
  category: post-synth
8
8
  lexicon: fountain
9
9
  docs: https://intentius.io/chant/lexicons/fountain/rules/
10
10
  ---
11
- FTN023
11
+ Agent runtime "acp" requires runtime_command, and no other runtime accepts one
12
12
 
13
13
  ## Applies to
14
14
 
@@ -0,0 +1,15 @@
1
+ ---
2
+ type: post-synth-check
3
+ title: FTN024
4
+ description: Environment setup_timeout_seconds must be an integer from 1 to 900
5
+ id: FTN024
6
+ severity: error
7
+ category: post-synth
8
+ lexicon: fountain
9
+ docs: https://intentius.io/chant/lexicons/fountain/rules/
10
+ ---
11
+ Environment setup_timeout_seconds must be an integer from 1 to 900
12
+
13
+ ## Applies to
14
+
15
+ - [Environment](/types/Environment.md)
@@ -10,17 +10,19 @@ resource_type: Fountain::V1::Agent
10
10
 
11
11
  ## Properties
12
12
 
13
- - `model` (`string`, required)
14
13
  - `name` (`string`, required)
15
14
  - `runtime` (`"acp" | "claude" | "codex" | "gemini" | "opencode"`, required)
16
- - `allowed_environment_ids` (`string[]`, optional): Environments a conversation may launch this agent under instead of its own. Same shape as allowed_vault_ids: null (default) allows any environment the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own environment always passes.
15
+ - `allowed_environment_ids` (`string[]`, optional): Environments a conversation may launch this agent under instead of its own (environment_id on create). Same shape as allowed_vault_ids: null (default) allows any environment the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own environment always passes.
16
+ - `allowed_inference_credential_ids` (`string[]`, optional): Credential sets a conversation may launch this agent on instead of the agent's (inference_credential_id on create). Same shape as allowed_vault_ids: null (default) allows any set the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own set always passes.
17
17
  - `allowed_vault_ids` (`string[]`, optional): Vaults a conversation may attach to this agent. null (default) allows any vault the tenant owns; an empty list forbids attaching any vault; a non-empty list is an allowlist.
18
18
  - `description` (`string`, optional)
19
19
  - `environment_id` (`string`, optional)
20
+ - `inference_credential_id` (`string`, optional): The credential set this agent's conversations run on. null (default) is the account's default set, which is what every agent had before an account could hold more than one.
20
21
  - `mcp_servers` (`Record<string, unknown>`, optional)
21
22
  - `metadata` (`Record<string, unknown>`, optional)
22
- - `permission_policy` (`Record<string, "ask" | "auto_allow" | "auto_deny">`, optional): Per-tool permission policy: a map of key to verdict, plus an optional "default" key. A key is matched against the tool card's title first and then ACP's kind (execute, edit, read, fetch, …); prefer a kind, because claude titles a tool call with the command it is about to run. Unset keys fall back to the default, and an unset default is auto_allow. "ask" holds the tool until a human answers it on the conversation stream, and denies if nobody does before the timeout. A conversation may narrow this at launch, never widen it. A runtime that never asks (opencode) refuses anything stricter than auto_allow with 422 permission_policy_unenforceable.
23
- - `runtime_command` (`string`, optional): The command line an "acp" agent speaks the Agent Client Protocol over, e.g. "chant acp". chant extension, pending BinaryBourbon/fountain#1634 — an instance without that PR rejects it at apply.
23
+ - `model` (`string`, optional)
24
+ - `permission_policy` (`Record<string, "ask" | "auto_allow" | "auto_deny" | number>`, optional): Per-tool permission policy: a map of key to verdict, plus an optional "default" key. A key is matched against the tool card's title first and then ACP's kind (execute, edit, read, fetch, …); prefer a kind, because claude titles a tool call with the command it is about to run. Unset keys fall back to the default, and an unset default is auto_allow. "ask" holds the tool until a human answers it on the conversation stream, and denies if nobody does before the timeout. A conversation may narrow this at launch, never widen it. A runtime that never asks (opencode) refuses anything stricter than auto_allow with 422 permission_policy_unenforceable.
25
+ - `runtime_command` (`string`, optional): The command the acp runtime launches inside the sandbox, as a shell line resolved there (for example `chant acp`). Required when runtime is acp, and rejected on every other runtime, which resolves its own executable. A free string by design: it runs under the same isolation as an environment's setup script.
24
26
  - `sandbox_mode` (`"ephemeral" | "persistent"`, optional): Where a conversation of this agent runs by default (ADR 0023). ephemeral: a sandbox per conversation, reclaimed with it. persistent: one sandbox per agent identity (agent, environment, vault) — the agent's computer — that every conversation of that identity lands on and shares; it survives a conversation ending and is parked, not destroyed, at the ceiling. A launch may name the other with sandbox_mode on POST /api/conversations.
25
27
  - `sandbox_provider` (`"daytona" | "e2b" | "runner" | "sprites"`, optional): Sandbox backend override; null inherits the instance default (SANDBOX_PROVIDER). Only providers configured on this instance are accepted
26
28
  - `skills` (`Record<string, unknown>[]`, optional): Each entry is either inline (`{name, content}` — full SKILL.md text written to the sprite) or github (`{source, ref?, name?}` — installed on the sprite via the skills.sh CLI, optionally pinned to a tag/branch/sha via `ref`). Exactly one of `content` or `source` must be set on each entry.
@@ -33,4 +35,4 @@ resource_type: Fountain::V1::Agent
33
35
  - [FTN015](/rules/FTN015.md): Secret-shaped MCP env keys must be ${VAR} references, not literals
34
36
  - [FTN016](/rules/FTN016.md): Agent runtime must be a known runtime and model canonical provider/model_id
35
37
  - [FTN021](/rules/FTN021.md): A Teammate's agent and a Schedule's teammate must resolve within the build
36
- - [FTN023](/rules/FTN023.md): FTN023
38
+ - [FTN023](/rules/FTN023.md): Agent runtime "acp" requires runtime_command, and no other runtime accepts one
@@ -17,7 +17,9 @@ resource_type: Fountain::V1::Environment
17
17
  - `networking_type` (`"limited" | "unrestricted"`, optional)
18
18
  - `packages` (`Record<string, unknown>`, optional)
19
19
  - `repositories` (`Repository[]`, optional)
20
+ - `secrets` (`{ key: string; value: string }[]`, optional): Secrets upserted with the resource at apply, as key/value pairs; fountainApply sends them as the manifest's inline `secrets` map. Values are write-only upstream and can never be read back or diffed. Write a reference that resolves at build (an env var, a secret-manager lookup), never a literal: FTN001 flags a literal here as it does anywhere else in a declaration.
20
21
  - `setup_script` (`string`, optional)
22
+ - `setup_timeout_seconds` (`number`, optional): Setup exec timeout in seconds; defaults to 120. The overall provisioning deadline still applies.
21
23
 
22
24
  ## Governed by
23
25
 
@@ -27,3 +29,4 @@ resource_type: Fountain::V1::Environment
27
29
  - [FTN012](/rules/FTN012.md): Environment env_vars must not carry cloud-credential-shaped keys or values
28
30
  - [FTN013](/rules/FTN013.md): Agent ${VAR} references should resolve against the environment's declared keys
29
31
  - [FTN014](/rules/FTN014.md): Vault keys shadowing a declared Environment key should be visible in review
32
+ - [FTN024](/rules/FTN024.md): Environment setup_timeout_seconds must be an integer from 1 to 900
@@ -13,6 +13,7 @@ resource_type: Fountain::V1::Vault
13
13
  - `name` (`string`, required)
14
14
  - `description` (`string`, optional)
15
15
  - `metadata` (`Record<string, unknown>`, optional)
16
+ - `secrets` (`{ key: string; value: string }[]`, optional): Secrets upserted with the resource at apply, as key/value pairs; fountainApply sends them as the manifest's inline `secrets` map. Values are write-only upstream and can never be read back or diffed. Write a reference that resolves at build (an env var, a secret-manager lookup), never a literal: FTN001 flags a literal here as it does anywhere else in a declaration.
16
17
 
17
18
  ## Governed by
18
19
 
@@ -8,11 +8,11 @@ import { propsOf } from "../../entity-props";
8
8
  * this backstops untyped construction (imported templates, hand-built
9
9
  * plans) so a typo fails the build instead of a 422 at apply.
10
10
  *
11
- * `acp` is the exception on both counts. It is a chant extension pending
12
- * BinaryBourbon/fountain#1634, and it names a process rather than a hosted
13
- * model: the model is whatever the command on the other end of the protocol
14
- * decides to use, so a `model` on an acp agent is a value nothing reads. The
15
- * command itself is FTN023's business.
11
+ * `acp` is the exception on the model. The runtime is in the spec since
12
+ * fountain v0.21.0, which also stopped requiring `model`, and it names a
13
+ * process rather than a hosted model: the model is whatever the command on the
14
+ * other end of the protocol decides to use, so a `model` on an acp agent is a
15
+ * value nothing reads. The command itself is FTN023's business.
16
16
  */
17
17
 
18
18
  const RUNTIMES = new Set(["claude", "codex", "gemini", "opencode", "acp"]);
@@ -11,12 +11,13 @@ import { propsOf } from "../../entity-props";
11
11
  * expects to run that nothing will ever execute, which is worse than an error
12
12
  * because it looks configured.
13
13
  *
14
- * Both fields are chant extensions pending BinaryBourbon/fountain#1634; the
15
- * rule holds the shape steady until upstream enforces it.
14
+ * Both fields are in the spec since fountain v0.21.0, and the server refuses
15
+ * either half without the other at apply. The rule moves that refusal to
16
+ * build, where it is a diagnostic in review instead of a 422 in a run.
16
17
  */
17
18
  export const acpRuntimeCommandCheck: PostSynthCheck = {
18
19
  id: "FTN023",
19
- description: 'Agent runtime "acp" requires runtime_command, and no other runtime accepts one',
20
+ description: "Agent runtime \"acp\" requires runtime_command, and no other runtime accepts one",
20
21
 
21
22
  check(ctx: PostSynthContext): PostSynthDiagnostic[] {
22
23
  const diagnostics: PostSynthDiagnostic[] = [];
@@ -0,0 +1,48 @@
1
+ import type { PostSynthCheck, PostSynthContext, PostSynthDiagnostic } from "@intentius/chant/lint/post-synth";
2
+ import { propsOf } from "../../entity-props";
3
+
4
+ /**
5
+ * FTN024: an Environment's `setup_timeout_seconds` is a whole number from 1 to 900.
6
+ *
7
+ * fountain v0.21.0 declares the field as an integer with `minimum: 1` and
8
+ * `maximum: 900`, and defaults it to 120 when it is absent. Codegen types it as
9
+ * `number` and carries neither bound into validation, so without this rule a
10
+ * 901 or a 12.5 builds cleanly and the first anyone hears of it is a 422 at
11
+ * apply.
12
+ *
13
+ * A value in range is still worth a second look in review. Changing it
14
+ * invalidates the environment's checkpoints (recorded on chant#2391), so an
15
+ * edit to this field costs what an edit to `setup_script` costs.
16
+ */
17
+
18
+ const MIN = 1;
19
+ const MAX = 900;
20
+
21
+ export const setupTimeoutRangeCheck: PostSynthCheck = {
22
+ id: "FTN024",
23
+ description: "Environment setup_timeout_seconds must be an integer from 1 to 900",
24
+
25
+ check(ctx: PostSynthContext): PostSynthDiagnostic[] {
26
+ const diagnostics: PostSynthDiagnostic[] = [];
27
+
28
+ for (const [name, entity] of ctx.entities) {
29
+ if (entity.entityType !== "Fountain::V1::Environment") continue;
30
+ const timeout = propsOf(entity).setup_timeout_seconds;
31
+ if (timeout === undefined || timeout === null) continue;
32
+
33
+ if (typeof timeout !== "number" || !Number.isInteger(timeout) || timeout < MIN || timeout > MAX) {
34
+ diagnostics.push({
35
+ checkId: "FTN024",
36
+ severity: "error",
37
+ message:
38
+ `Environment "${name}" setup_timeout_seconds ${JSON.stringify(timeout)} is not an integer ` +
39
+ `from ${MIN} to ${MAX}; fountain refuses it at apply`,
40
+ entity: name,
41
+ lexicon: "fountain",
42
+ });
43
+ }
44
+ }
45
+
46
+ return diagnostics;
47
+ },
48
+ };
@@ -125,7 +125,8 @@ The second posts `chant run <op>` back onto the steward's thread, with
125
125
  now-resolved fact.
126
126
 
127
127
  `--durable-requests` (answering fountain's own permission card instead) is
128
- refused by name: it needs BinaryBourbon/fountain#1635, which has not shipped.
128
+ refused by name: it needs fountain#1635's request-answer path, which fountain
129
+ v0.21.0 carries and chant does not use yet (chant#2391).
129
130
 
130
131
  ## When the steward is busy
131
132
 
@@ -158,7 +159,7 @@ success nobody saw.
158
159
 
159
160
  ## Two upstream caveats
160
161
 
161
- - `runtime: "acp"` with `runtime_command` is BinaryBourbon/fountain#1634 and is
162
- not in v0.16.0. An instance without it rejects the pair at apply.
163
- - Bulk apply covering the team-side kinds is BinaryBourbon/fountain#1636. Until
164
- then they go through their own routes, which is what `fountainApply` does.
162
+ - `runtime: "acp"` with `runtime_command` needs fountain v0.21.0 or later. An
163
+ older instance rejects the pair at apply.
164
+ - Bulk apply covering the team-side kinds is fountain#1636. Until chant uses it,
165
+ they go through their own routes, which is what `fountainApply` does.
@@ -11,7 +11,7 @@ user-invocable: true
11
11
  Everything materialized into a fountain sandbox must be presumed exfiltrated once untrusted agent code runs. Order of preference:
12
12
 
13
13
  1. **`${VAR}` substitution references** in agent config (MCP server env, system prompts). Resolved at spawn from the merged environment + vault sets. Never a value in source.
14
- 2. **Environment secrets** (`spec.secrets`) — encrypted at rest, write-only over the API (values are never returned once stored). `fountainApply` sends them inline with the rest of the resource in the bulk apply request, and the server upserts them through the encrypted envelope path; a changed value cannot be detected, only overwritten.
14
+ 2. **Environment and Vault secrets** (`spec.secrets`), typed on both kinds as `secrets: { key: string; value: string }[]`. Encrypted at rest, write-only over the API (values are never returned once stored). Write the value as a reference your build resolves, not the secret itself. `fountainApply` sends them inline with the rest of the resource in the bulk apply request, and the server upserts them through the encrypted envelope path; a changed value cannot be detected, only overwritten.
15
15
  3. **`env_vars`** — plaintext config only. FTN012 errors on credential-shaped keys or values here.
16
16
 
17
17
  Never put a literal credential anywhere in a declaration: FTN001 catches known shapes (AWS keys, GitHub/Slack tokens, `sk-`/`ftn_` keys, private key material) at the AST; FTN015 errors on secret-shaped MCP env keys that are not `${VAR}` references.
@@ -26,4 +26,4 @@ FTN013 warns when an agent references `${VAR}` and its declared environment has
26
26
 
27
27
  ## Round-trips and their limits
28
28
 
29
- `chant import --from` exports live resources but never secrets: values are write-only upstream, and secret keys are not on the typed request surface. Re-declare imported environments' secrets through your secret provider. Upstream discussion of a reference-based model that would fix this: BinaryBourbon/fountain#148.
29
+ `chant import --from` exports live resources but never secrets: values are write-only upstream, so there is nothing to read back into `secrets`. Re-declare imported environments' secrets through your secret provider. Upstream discussion of a reference-based model that would fix this: BinaryBourbon/fountain#148.
@@ -8,7 +8,7 @@ user-invocable: true
8
8
 
9
9
  ## What this lexicon covers
10
10
 
11
- [fountain](https://github.com/BinaryBourbon/fountain) runs coding agents in sandboxed VMs. Six kinds are declarable, and this lexicon types all of them. `Environment` (sandbox baseline), `Vault` (env-var overrides) and `Agent` (a runnable agent config) are the workload layer; `Teammate` (an agent seated on the team, with a thread of its own), `Schedule` (a cron prompt into that thread) and `Webhook` (where the estate's events leave it) are the team, schedule and webhook routes. Conversations are runs, not resources: start them with the `fountainRun` op, never declare them.
11
+ [fountain](https://github.com/managoat/fountain) runs coding agents in sandboxed VMs. Six kinds are declarable, and this lexicon types all of them. `Environment` (sandbox baseline), `Vault` (env-var overrides) and `Agent` (a runnable agent config) are the workload layer; `Teammate` (an agent seated on the team, with a thread of its own), `Schedule` (a cron prompt into that thread) and `Webhook` (where the estate's events leave it) are the team, schedule and webhook routes. Conversations are runs, not resources: start them with the `fountainRun` op, never declare them.
12
12
 
13
13
  The source of truth is the TypeScript in `src/`. `chant build` serializes it to fountain's own manifest YAML (ejectable — `fountain apply -f` accepts it verbatim). `fountainApply` sends that same YAML to fountain's bulk `POST /api/apply` endpoint in one request: create-if-new, update-by-name, opt-in owned-only prune keyed on the `managed-by: chant` metadata marker. Bulk apply covers Environment, Vault and Agent only — a Teammate, Schedule or Webhook document is emitted and valid, and applying it through its own route waits on chant #2127.
14
14
 
@@ -64,6 +64,6 @@ What a client sees:
64
64
  - A run that stops at an unapproved gate replies with the pending fact and the `chant approve <op> <gate>` line, and the turn ends. The gate is a fact on chant's ledger, not a wait — the next run re-evaluates it.
65
65
  - `session/cancel` aborts the in-flight step, runs the op's `onFailure` phases, and ends the turn `cancelled`.
66
66
 
67
- `--durable-requests` turns the gated reply into a `session/request_permission` with `allow_once`/`reject_once` and ends the turn `waiting`; the client answers on a later prompt carrying `_meta.chant.permission`, which records the resolution and re-runs. It is off by default because a request that outlives a turn needs BinaryBourbon/fountain#1635.
67
+ `--durable-requests` turns the gated reply into a `session/request_permission` with `allow_once`/`reject_once` and ends the turn `waiting`; the client answers on a later prompt carrying `_meta.chant.permission`, which records the resolution and re-runs. It is off by default because a request that outlives a turn needs fountain#1635, which v0.21.0 carries and chant does not answer through yet (chant#2391).
68
68
 
69
69
  The server does not redact. A step's output reaches the thread verbatim and fountain redacts secrets on the way in; chant never reads or prints the environment it was spawned with.
@@ -16,7 +16,10 @@
16
16
  * The committed snapshot is now only the offline path. It is not a silent
17
17
  * substitute for the pin: both routes log which one was taken and at what
18
18
  * version, because a fallback nobody can see is how you end up debugging types
19
- * that came from somewhere you did not expect.
19
+ * that came from somewhere you did not expect. And it is refused outright when
20
+ * its own `info.version` is not the pin (#2389). A bump that changes the
21
+ * constant but not the snapshot would otherwise generate the old surface on
22
+ * any machine without a network and label it with the new version.
20
23
  */
21
24
  /**
22
25
  * The pinned upstream spec.
@@ -24,10 +27,13 @@
24
27
  * v0.3.0 was the first release to carry the `openapi.json` asset. v0.16.0 is
25
28
  * the first that describes team, schedules, webhooks, sandboxes and the event
26
29
  * stream, which is what the Teammate, Schedule and Webhook kinds are generated
27
- * from. Bumping this changes the generated surface, so it belongs in its own
30
+ * from. v0.21.0 adds `setup_timeout_seconds` to Environment and describes the
31
+ * acp runtime itself (`runtime: "acp"` and `runtime_command` on Agent, with
32
+ * `model` no longer required), which chant had modeled as an extension until
33
+ * then. Bumping this changes the generated surface, so it belongs in its own
28
34
  * commit with the regenerated snapshot beside it.
29
35
  */
30
- export declare const FOUNTAIN_SPEC_VERSION = "v0.16.0";
36
+ export declare const FOUNTAIN_SPEC_VERSION = "v0.21.0";
31
37
  /**
32
38
  * Fetch the pinned fountain OpenAPI spec, falling back to the committed
33
39
  * snapshot when there is no network. Returns a single-entry map — the whole
@@ -35,5 +41,14 @@ export declare const FOUNTAIN_SPEC_VERSION = "v0.16.0";
35
41
  */
36
42
  export declare function fetchSchemas(options?: {
37
43
  force?: boolean;
44
+ /** The offline fallback's file. Tests point it at a snapshot of another release. */
45
+ snapshotFile?: string;
38
46
  }): Promise<Map<string, Buffer>>;
47
+ /**
48
+ * Read the committed snapshot, refusing it when it describes a release other
49
+ * than the pinned one. The spec's `info.version` carries no leading `v`
50
+ * (`0.21.0`) where the release tag does (`v0.21.0`), so both are compared
51
+ * without it.
52
+ */
53
+ export declare function readSnapshot(file?: string, pinned?: string): Buffer;
39
54
  //# sourceMappingURL=fetch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/spec/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAQH;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,YAAY,CAAC;AAQ/C;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAiB9F"}
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/spec/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAQH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qBAAqB,YAAY,CAAC;AAU/C;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE;IAC3C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,oFAAoF;IACpF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAiB/B;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAsB,EAAE,MAAM,GAAE,MAA8B,GAAG,MAAM,CAoBzG"}
@@ -20,9 +20,11 @@
20
20
  * add one that reaches the API only as a path parameter (a schedule's
21
21
  * teammate), into a by-name reference the serializer resolves and FTN021
22
22
  * proves resolvable — the same shape an Agent's `environment` has.
23
- * - Extensions. A prop chant accepts ahead of upstream, declared here so the
24
- * generated type documents it instead of leaving authors to smuggle it
25
- * through `metadata`. Today that is the ACP runtime.
23
+ * - Extensions. A prop chant accepts that the request schema does not
24
+ * describe, declared here so the generated type documents it instead of
25
+ * leaving authors to smuggle it through `metadata` or a cast. Today that is
26
+ * the inline `secrets` on Environment and Vault, which upstream documents
27
+ * on its manifest format rather than on either request schema.
26
28
  */
27
29
  import { type PropertyConstraints } from "@intentius/chant/codegen/json-schema";
28
30
  export type { PropertyConstraints };
@@ -1 +1 @@
1
- {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/spec/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAKL,KAAK,mBAAmB,EACzB,MAAM,sCAAsC,CAAC;AAI9C,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,mBAAmB,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,cAAc,CAAC;IACzB,0EAA0E;IAC1E,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,iEAAiE;IACjE,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACjD,oEAAoE;IACpE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AA0ID;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,EAAoC,CAAC;AAqBjF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,mBAAmB,EAAE,CA4GjF;AAmID,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,0DAA0D;AAC1D,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG5D"}
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/spec/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAKL,KAAK,mBAAmB,EACzB,MAAM,sCAAsC,CAAC;AAI9C,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,mBAAmB,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,cAAc,CAAC;IACzB,0EAA0E;IAC1E,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,iEAAiE;IACjE,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACjD,oEAAoE;IACpE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AA6ID;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,EAAoC,CAAC;AAqBjF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,mBAAmB,EAAE,CA6GjF;AAwKD,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,0DAA0D;AAC1D,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG5D"}
@@ -4,20 +4,24 @@
4
4
 
5
5
  export declare class Agent {
6
6
  constructor(props: {
7
- model: string;
8
7
  name: string;
9
8
  runtime: "acp" | "claude" | "codex" | "gemini" | "opencode";
10
- /** Environments a conversation may launch this agent under instead of its own. Same shape as allowed_vault_ids: null (default) allows any environment the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own environment always passes. */
9
+ /** Environments a conversation may launch this agent under instead of its own (environment_id on create). Same shape as allowed_vault_ids: null (default) allows any environment the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own environment always passes. */
11
10
  allowed_environment_ids?: string[];
11
+ /** Credential sets a conversation may launch this agent on instead of the agent's (inference_credential_id on create). Same shape as allowed_vault_ids: null (default) allows any set the tenant owns; an empty list forbids overriding; a non-empty list is an allowlist. The agent's own set always passes. */
12
+ allowed_inference_credential_ids?: string[];
12
13
  /** Vaults a conversation may attach to this agent. null (default) allows any vault the tenant owns; an empty list forbids attaching any vault; a non-empty list is an allowlist. */
13
14
  allowed_vault_ids?: string[];
14
15
  description?: string;
15
16
  environment_id?: string;
17
+ /** The credential set this agent's conversations run on. null (default) is the account's default set, which is what every agent had before an account could hold more than one. */
18
+ inference_credential_id?: string;
16
19
  mcp_servers?: Record<string, unknown>;
17
20
  metadata?: Record<string, unknown>;
21
+ model?: string;
18
22
  /** Per-tool permission policy: a map of key to verdict, plus an optional "default" key. A key is matched against the tool card's title first and then ACP's kind (execute, edit, read, fetch, …); prefer a kind, because claude titles a tool call with the command it is about to run. Unset keys fall back to the default, and an unset default is auto_allow. "ask" holds the tool until a human answers it on the conversation stream, and denies if nobody does before the timeout. A conversation may narrow this at launch, never widen it. A runtime that never asks (opencode) refuses anything stricter than auto_allow with 422 permission_policy_unenforceable. */
19
- permission_policy?: Record<string, "ask" | "auto_allow" | "auto_deny">;
20
- /** The command line an "acp" agent speaks the Agent Client Protocol over, e.g. "chant acp". chant extension, pending BinaryBourbon/fountain#1634 — an instance without that PR rejects it at apply. */
23
+ permission_policy?: Record<string, "ask" | "auto_allow" | "auto_deny" | number>;
24
+ /** The command the acp runtime launches inside the sandbox, as a shell line resolved there (for example `chant acp`). Required when runtime is acp, and rejected on every other runtime, which resolves its own executable. A free string by design: it runs under the same isolation as an environment's setup script. */
21
25
  runtime_command?: string;
22
26
  /** Where a conversation of this agent runs by default (ADR 0023). ephemeral: a sandbox per conversation, reclaimed with it. persistent: one sandbox per agent identity (agent, environment, vault) — the agent's computer — that every conversation of that identity lands on and shares; it survives a conversation ending and is parked, not destroyed, at the ceiling. A launch may name the other with sandbox_mode on POST /api/conversations. */
23
27
  sandbox_mode?: "ephemeral" | "persistent";
@@ -45,10 +49,13 @@ export declare class Environment {
45
49
  networking_type?: "limited" | "unrestricted";
46
50
  packages?: Record<string, unknown>;
47
51
  repositories?: Repository[];
52
+ /** Secrets upserted with the resource at apply, as key/value pairs; fountainApply sends them as the manifest's inline `secrets` map. Values are write-only upstream and can never be read back or diffed. Write a reference that resolves at build (an env var, a secret-manager lookup), never a literal: FTN001 flags a literal here as it does anywhere else in a declaration. */
53
+ secrets?: { key: string; value: string }[];
48
54
  setup_script?: string;
55
+ /** Setup exec timeout in seconds; defaults to 120. The overall provisioning deadline still applies. */
56
+ setup_timeout_seconds?: number;
49
57
  });
50
58
  readonly agent_count: number;
51
- readonly allowed_environment_ids: string[];
52
59
  readonly id: string;
53
60
  readonly inserted_at: string;
54
61
  readonly secret_count: number;
@@ -87,7 +94,6 @@ export declare class Teammate {
87
94
  /** Layer this vault's secrets on top. Must satisfy allowed_vault_ids. */
88
95
  vault?: Vault | string;
89
96
  });
90
- readonly contact: Record<string, unknown>;
91
97
  readonly conversation: Record<string, unknown>;
92
98
  readonly last_turn: Record<string, unknown>;
93
99
  readonly presence: Record<string, unknown>;
@@ -101,6 +107,8 @@ export declare class Vault {
101
107
  name: string;
102
108
  description?: string;
103
109
  metadata?: Record<string, unknown>;
110
+ /** Secrets upserted with the resource at apply, as key/value pairs; fountainApply sends them as the manifest's inline `secrets` map. Values are write-only upstream and can never be read back or diffed. Write a reference that resolves at build (an env var, a secret-manager lookup), never a literal: FTN001 flags a literal here as it does anywhere else in a declaration. */
111
+ secrets?: { key: string; value: string }[];
104
112
  });
105
113
  readonly id: string;
106
114
  readonly inserted_at: string;