@jr2/orchestrator 0.4.1 → 0.5.1

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 (327) hide show
  1. package/README.md +20 -2
  2. package/console/components/app.ts +2 -0
  3. package/console/components/fleet.ts +14 -1
  4. package/console/components/machine-pane.ts +41 -2
  5. package/console/main.ts +13 -1
  6. package/console/store.ts +102 -6
  7. package/console/style.css +21 -0
  8. package/docs/agents-block.md +5 -0
  9. package/docs/concepts/agents-and-turns.md +442 -0
  10. package/docs/concepts/architecture.md +230 -0
  11. package/docs/concepts/charts.md +143 -0
  12. package/docs/concepts/composition.md +357 -0
  13. package/docs/concepts/converge.md +254 -0
  14. package/docs/concepts/durable-runs.md +189 -0
  15. package/docs/concepts/effects.md +603 -0
  16. package/docs/concepts/gates.md +208 -0
  17. package/docs/concepts/machines-and-workflows.md +289 -0
  18. package/docs/concepts/pools-and-sources.md +230 -0
  19. package/docs/concepts/secrets-and-trust.md +222 -0
  20. package/docs/concepts/the-menu.md +378 -0
  21. package/docs/concepts/workspaces.md +678 -0
  22. package/docs/get-started/a-model-decides.md +563 -0
  23. package/docs/get-started/an-agent-in-a-sandbox.md +381 -0
  24. package/docs/get-started/connect-a-model.md +248 -0
  25. package/docs/get-started/create-an-instance.md +194 -0
  26. package/docs/get-started/have-your-assistant-write-a-machine.md +922 -0
  27. package/docs/get-started/install.md +126 -0
  28. package/docs/guides/add-tools-to-the-sandbox.md +295 -0
  29. package/docs/guides/answer-a-gate.md +304 -0
  30. package/docs/guides/bind-open-parts.md +223 -0
  31. package/docs/guides/cancel-a-run.md +146 -0
  32. package/docs/guides/clean-up.md +206 -0
  33. package/docs/guides/fix-a-failed-converge.md +361 -0
  34. package/docs/guides/give-the-cluster-git-credentials.md +222 -0
  35. package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
  36. package/docs/guides/let-an-agent-write-a-chart.md +226 -0
  37. package/docs/guides/look-inside-a-sandbox.md +174 -0
  38. package/docs/guides/mirror-the-kit-images.md +176 -0
  39. package/docs/guides/move-from-kind-to-a-shared-cluster.md +302 -0
  40. package/docs/guides/open-the-console.md +91 -0
  41. package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
  42. package/docs/guides/push-and-sign-a-branch.md +486 -0
  43. package/docs/guides/run-a-chart-by-name.md +270 -0
  44. package/docs/guides/run-a-command-or-call-a-url.md +544 -0
  45. package/docs/guides/run-one-worker-per-item.md +321 -0
  46. package/docs/guides/set-an-agents-access-and-dials.md +375 -0
  47. package/docs/guides/size-a-workspace.md +204 -0
  48. package/docs/guides/start-a-run-from-a-run.md +237 -0
  49. package/docs/guides/start-a-run.md +207 -0
  50. package/docs/guides/upgrade-the-kit-version.md +240 -0
  51. package/docs/guides/use-a-hosted-provider.md +208 -0
  52. package/docs/guides/use-a-local-model.md +313 -0
  53. package/docs/guides/watch-a-run.md +326 -0
  54. package/docs/guides/write-a-workflow.md +318 -0
  55. package/docs/index.md +44 -0
  56. package/docs/llms.txt +216 -0
  57. package/docs/reference/authoring-surface/agent.md +128 -0
  58. package/docs/reference/authoring-surface/answer.md +140 -0
  59. package/docs/reference/authoring-surface/arg.md +60 -0
  60. package/docs/reference/authoring-surface/basic.md +62 -0
  61. package/docs/reference/authoring-surface/bearer.md +53 -0
  62. package/docs/reference/authoring-surface/chartschema.md +23 -0
  63. package/docs/reference/authoring-surface/chartschemafor.md +48 -0
  64. package/docs/reference/authoring-surface/command.md +191 -0
  65. package/docs/reference/authoring-surface/customize.md +64 -0
  66. package/docs/reference/authoring-surface/defineconfig.md +41 -0
  67. package/docs/reference/authoring-surface/defineevent.md +114 -0
  68. package/docs/reference/authoring-surface/dispatch.md +126 -0
  69. package/docs/reference/authoring-surface/fail.md +83 -0
  70. package/docs/reference/authoring-surface/file.md +122 -0
  71. package/docs/reference/authoring-surface/frompick.md +277 -0
  72. package/docs/reference/authoring-surface/http.md +159 -0
  73. package/docs/reference/authoring-surface/isfailure.md +58 -0
  74. package/docs/reference/authoring-surface/jr2setup.md +237 -0
  75. package/docs/reference/authoring-surface/open.md +74 -0
  76. package/docs/reference/authoring-surface/openbody.md +86 -0
  77. package/docs/reference/authoring-surface/paramsof.md +125 -0
  78. package/docs/reference/authoring-surface/pool.md +186 -0
  79. package/docs/reference/authoring-surface/push.md +112 -0
  80. package/docs/reference/authoring-surface/secret.md +118 -0
  81. package/docs/reference/authoring-surface/sentby.md +83 -0
  82. package/docs/reference/authoring-surface/source.md +51 -0
  83. package/docs/reference/authoring-surface/text.md +62 -0
  84. package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
  85. package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
  86. package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
  87. package/docs/reference/authoring-surface/type-agentslots.md +12 -0
  88. package/docs/reference/authoring-surface/type-answeraction.md +12 -0
  89. package/docs/reference/authoring-surface/type-arg.md +19 -0
  90. package/docs/reference/authoring-surface/type-argnames.md +12 -0
  91. package/docs/reference/authoring-surface/type-binding.md +62 -0
  92. package/docs/reference/authoring-surface/type-bindingof.md +12 -0
  93. package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
  94. package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
  95. package/docs/reference/authoring-surface/type-ceilings.md +41 -0
  96. package/docs/reference/authoring-surface/type-chainlink.md +19 -0
  97. package/docs/reference/authoring-surface/type-chartaction.md +46 -0
  98. package/docs/reference/authoring-surface/type-chartagent.md +28 -0
  99. package/docs/reference/authoring-surface/type-chartevent.md +20 -0
  100. package/docs/reference/authoring-surface/type-chartguard.md +20 -0
  101. package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
  102. package/docs/reference/authoring-surface/type-chartjson.md +14 -0
  103. package/docs/reference/authoring-surface/type-chartstate.md +46 -0
  104. package/docs/reference/authoring-surface/type-charttext.md +40 -0
  105. package/docs/reference/authoring-surface/type-charttransition.md +22 -0
  106. package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
  107. package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
  108. package/docs/reference/authoring-surface/type-childat.md +12 -0
  109. package/docs/reference/authoring-surface/type-childslots.md +12 -0
  110. package/docs/reference/authoring-surface/type-commandenv.md +15 -0
  111. package/docs/reference/authoring-surface/type-commandinput.md +19 -0
  112. package/docs/reference/authoring-surface/type-commandoptions.md +78 -0
  113. package/docs/reference/authoring-surface/type-commandoutput.md +104 -0
  114. package/docs/reference/authoring-surface/type-customize.md +109 -0
  115. package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
  116. package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
  117. package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
  118. package/docs/reference/authoring-surface/type-dispatchoutput.md +65 -0
  119. package/docs/reference/authoring-surface/type-duration.md +15 -0
  120. package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
  121. package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
  122. package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
  123. package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
  124. package/docs/reference/authoring-surface/type-eventdef.md +45 -0
  125. package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
  126. package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
  127. package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
  128. package/docs/reference/authoring-surface/type-failslot.md +14 -0
  129. package/docs/reference/authoring-surface/type-failure.md +19 -0
  130. package/docs/reference/authoring-surface/type-failureinput.md +20 -0
  131. package/docs/reference/authoring-surface/type-filebody.md +41 -0
  132. package/docs/reference/authoring-surface/type-frominput.md +14 -0
  133. package/docs/reference/authoring-surface/type-hostinjectedinput.md +58 -0
  134. package/docs/reference/authoring-surface/type-httpdefinition.md +101 -0
  135. package/docs/reference/authoring-surface/type-httpinput.md +12 -0
  136. package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
  137. package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
  138. package/docs/reference/authoring-surface/type-httpoutput.md +89 -0
  139. package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
  140. package/docs/reference/authoring-surface/type-jr2config.md +126 -0
  141. package/docs/reference/authoring-surface/type-lends.md +38 -0
  142. package/docs/reference/authoring-surface/type-logicat.md +12 -0
  143. package/docs/reference/authoring-surface/type-markedif.md +12 -0
  144. package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
  145. package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
  146. package/docs/reference/authoring-surface/type-noslotspec.md +26 -0
  147. package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +32 -0
  148. package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
  149. package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
  150. package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
  151. package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
  152. package/docs/reference/authoring-surface/type-opencommandinput.md +17 -0
  153. package/docs/reference/authoring-surface/type-openeffect.md +12 -0
  154. package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
  155. package/docs/reference/authoring-surface/type-openof.md +12 -0
  156. package/docs/reference/authoring-surface/type-opensecret.md +23 -0
  157. package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
  158. package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +31 -0
  159. package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +32 -0
  160. package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
  161. package/docs/reference/authoring-surface/type-poolspec.md +60 -0
  162. package/docs/reference/authoring-surface/type-pushinput.md +15 -0
  163. package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
  164. package/docs/reference/authoring-surface/type-pushoutput.md +124 -0
  165. package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
  166. package/docs/reference/authoring-surface/type-quantity.md +14 -0
  167. package/docs/reference/authoring-surface/type-reached.md +12 -0
  168. package/docs/reference/authoring-surface/type-reposlot.md +70 -0
  169. package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
  170. package/docs/reference/authoring-surface/type-sandboxoptions.md +77 -0
  171. package/docs/reference/authoring-surface/type-secret.md +25 -0
  172. package/docs/reference/authoring-surface/type-sender.md +19 -0
  173. package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
  174. package/docs/reference/authoring-surface/type-size.md +85 -0
  175. package/docs/reference/authoring-surface/type-slothandles.md +32 -0
  176. package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
  177. package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
  178. package/docs/reference/authoring-surface/type-syncstate.md +12 -0
  179. package/docs/reference/authoring-surface/type-text.md +19 -0
  180. package/docs/reference/authoring-surface/type-textpart.md +24 -0
  181. package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
  182. package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
  183. package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
  184. package/docs/reference/authoring-surface/type-unknown.md +21 -0
  185. package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
  186. package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
  187. package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
  188. package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
  189. package/docs/reference/authoring-surface/type-workspaced.md +94 -0
  190. package/docs/reference/authoring-surface/type-workspacehandles.md +23 -0
  191. package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
  192. package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
  193. package/docs/reference/authoring-surface/type-workspaceoptions.md +39 -0
  194. package/docs/reference/authoring-surface/type-workspacespec.md +37 -0
  195. package/docs/reference/authoring-surface/workspace.md +259 -0
  196. package/docs/reference/authoring-surface.md +197 -0
  197. package/docs/reference/cli.md +433 -0
  198. package/docs/reference/config.md +756 -0
  199. package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +113 -0
  200. package/docs/reference/decisions/0002-duplex-streaming-actor.md +110 -0
  201. package/docs/reference/decisions/0004-worktree-provisioning-model.md +124 -0
  202. package/docs/reference/decisions/0005-sandbox-pod-composition.md +230 -0
  203. package/docs/reference/decisions/0006-agent-control-surface.md +47 -0
  204. package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
  205. package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
  206. package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
  207. package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
  208. package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
  209. package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
  210. package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +157 -0
  211. package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
  212. package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +265 -0
  213. package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +124 -0
  214. package/docs/reference/decisions/0017-pool-over-a-source-port.md +69 -0
  215. package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
  216. package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +275 -0
  217. package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
  218. package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +100 -0
  219. package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
  220. package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +176 -0
  221. package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +439 -0
  222. package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
  223. package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
  224. package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +237 -0
  225. package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +89 -0
  226. package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
  227. package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
  228. package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +190 -0
  229. package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
  230. package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +127 -0
  231. package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
  232. package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
  233. package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
  234. package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
  235. package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
  236. package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
  237. package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
  238. package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
  239. package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
  240. package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
  241. package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
  242. package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
  243. package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
  244. package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
  245. package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
  246. package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
  247. package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +227 -0
  248. package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +81 -0
  249. package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +111 -0
  250. package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
  251. package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
  252. package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
  253. package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
  254. package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +106 -0
  255. package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +384 -0
  256. package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
  257. package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
  258. package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +212 -0
  259. package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +83 -0
  260. package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
  261. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
  262. package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +550 -0
  263. package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +430 -0
  264. package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +464 -0
  265. package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
  266. package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +323 -0
  267. package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
  268. package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
  269. package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
  270. package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
  271. package/docs/reference/decisions.md +83 -0
  272. package/docs/reference/glossary.md +648 -0
  273. package/docs/reference/http-api.md +1348 -0
  274. package/docs/reference/machines.md +190 -0
  275. package/docs/reference/mechanism-events.md +72 -0
  276. package/docs/why.md +206 -0
  277. package/package.json +5 -3
  278. package/src/actor.ts +541 -79
  279. package/src/agent.ts +114 -38
  280. package/src/ambient.ts +2 -1
  281. package/src/assembly-checks.ts +189 -7
  282. package/src/cause.ts +234 -0
  283. package/src/chart.ts +169 -37
  284. package/src/charts.ts +34 -6
  285. package/src/config.ts +430 -178
  286. package/src/custodian.ts +74 -22
  287. package/src/customize.ts +188 -46
  288. package/src/dispatch-effect.ts +945 -0
  289. package/src/door-compat.ts +217 -0
  290. package/src/durability.ts +11 -4
  291. package/src/effect.ts +341 -44
  292. package/src/effector-wire.ts +160 -11
  293. package/src/fail.ts +209 -0
  294. package/src/harness-client.ts +541 -47
  295. package/src/http-effect.ts +495 -53
  296. package/src/http.ts +427 -16
  297. package/src/index.ts +60 -82
  298. package/src/instance.ts +68 -8
  299. package/src/internal.ts +84 -0
  300. package/src/machine-doc.ts +21 -3
  301. package/src/mechanism-routes.ts +168 -0
  302. package/src/model-keys.generated.ts +53 -0
  303. package/src/model-keys.ts +18 -58
  304. package/src/notices.ts +66 -13
  305. package/src/open-body.ts +159 -23
  306. package/src/open-effect.ts +81 -8
  307. package/src/open.ts +59 -6
  308. package/src/parts.ts +184 -13
  309. package/src/party.ts +68 -2
  310. package/src/pick.ts +463 -11
  311. package/src/pool.ts +247 -36
  312. package/src/registration.ts +83 -4
  313. package/src/repos.ts +2 -1
  314. package/src/run-host.ts +565 -31
  315. package/src/run-output.ts +38 -0
  316. package/src/sandbox-effect.ts +273 -38
  317. package/src/sandbox-kube.ts +3 -1
  318. package/src/secret-placement.ts +52 -17
  319. package/src/server.ts +3 -0
  320. package/src/setup.ts +239 -56
  321. package/src/size.ts +121 -9
  322. package/src/snapshot-store.ts +54 -10
  323. package/src/stub-harness.ts +44 -16
  324. package/src/timers.ts +14 -1
  325. package/src/vocabulary.ts +69 -14
  326. package/src/wire.ts +90 -16
  327. package/src/workspace.ts +697 -175
@@ -0,0 +1,240 @@
1
+ ---
2
+ title: Upgrade the Kit version
3
+ description: Move an Instance to a new Kit version. jr2 up converges it and updates the jr2 block in AGENTS.md.
4
+ ---
5
+
6
+ # Upgrade the Kit version
7
+
8
+ Move your [Instance](../reference/glossary.md#instance) to a new [Kit version](../reference/glossary.md#kit-version),
9
+ and converge it.
10
+
11
+ An Instance has one Kit version: the version of `@jr2/orchestrator` that it installs. `package.json` pins
12
+ `@jr2/orchestrator` and `@jr2/cli` to that one exact version. To upgrade, you change the two pins to the new version,
13
+ install, and run [`jr2 up`](../reference/cli.md#up). Each upgrade ends in `jr2 up`. It converges the cluster to the new
14
+ version, and it updates the jr2 block in `AGENTS.md`, which your [Assistant](../reference/glossary.md#assistant) reads.
15
+
16
+ In the commands on this page, `<version>` is the new Kit version, such as `0.4.1`, and `<old version>` is the version
17
+ that the Instance has now.
18
+
19
+ ## Before you start
20
+
21
+ - An Instance that you made with `jr2 init`, with its dependencies installed with npm.
22
+ - The new version. To see the latest release, run `npm view @jr2/cli version`.
23
+ - If the Instance sets [`kitRegistry`](../reference/config.md#kitregistry), write access to that registry. See
24
+ [Mirror the Kit images](mirror-the-kit-images.md).
25
+
26
+ ## See the Kit version now
27
+
28
+ Run this command in the Instance folder:
29
+
30
+ ```sh
31
+ jr2 version --local
32
+ ```
33
+
34
+ ```text
35
+ …
36
+ cli: <old version> <instance folder>/node_modules/@jr2/cli
37
+ global: <global version> <global folder>
38
+ kit: <old version> <instance folder>/node_modules/@jr2/orchestrator ok
39
+ instance: my-instance <instance folder> (installed kit → ghcr.io/snapwich)
40
+ node: v24.18.0
41
+ ```
42
+
43
+ - `cli` is the CLI that runs: the Instance's own `@jr2/cli`.
44
+ - `global` is your global `jr2`. In an Instance folder, it runs the Instance's own `@jr2/cli`. This is the
45
+ [Handoff](../reference/glossary.md#handoff). Thus the version of the global `jr2` does not change what the Instance
46
+ runs.
47
+ - `kit` is the Kit version. `ok` means that the CLI and the Instance use the same copy of `@jr2/orchestrator`, and that
48
+ this copy has the version of the CLI.
49
+
50
+ `<global version>` is the version of your global `jr2`. `<instance folder>` and `<global folder>` are paths on your
51
+ computer, and `node` gives your version of Node.js. The first line (`…`) is the `.env` line, when `.env` sets a variable
52
+ that your shell does not set.
53
+
54
+ ## Install the new version
55
+
56
+ Change the two pins in one command:
57
+
58
+ ```sh
59
+ npm install --save-exact @jr2/orchestrator@<version> @jr2/cli@<version>
60
+ ```
61
+
62
+ npm keeps `@jr2/orchestrator` in `dependencies` and `@jr2/cli` in `devDependencies`. `--save-exact` writes the version
63
+ with no range, as `jr2 init` does.
64
+
65
+ When the Instance also uses [`@jr2/machines`](../reference/machines.md), upgrade it in the same command. It must have
66
+ the same version:
67
+
68
+ ```sh
69
+ npm install --save-exact @jr2/orchestrator@<version> @jr2/cli@<version> @jr2/machines@<version>
70
+ ```
71
+
72
+ > **Caution**
73
+ >
74
+ > Do not upgrade one of the packages alone. If you upgrade only `@jr2/orchestrator`, npm shows
75
+ > `npm warn ERESOLVE overriding peer dependency` and installs it. The CLI and the Kit then have different versions, and
76
+ > each command that reads the Instance, other than `jr2 version`, refuses. See the Rules.
77
+
78
+ Then check the result:
79
+
80
+ ```sh
81
+ jr2 version --local
82
+ ```
83
+
84
+ ```text
85
+ …
86
+ cli: <version> <instance folder>/node_modules/@jr2/cli
87
+ global: <global version> <global folder>
88
+ kit: <version> <instance folder>/node_modules/@jr2/orchestrator ok
89
+ instance: my-instance <instance folder> (installed kit → ghcr.io/snapwich)
90
+ node: v24.18.0
91
+ ```
92
+
93
+ The `cli` line and the `kit` line must show the same version, and the `kit` line must end in `ok`. When you upgraded
94
+ only `@jr2/orchestrator`, the `kit` line gives the version of the `jr2` that runs:
95
+
96
+ ```text
97
+ kit: <version> <instance folder>/node_modules/@jr2/orchestrator MISMATCH — this jr2 (<old version>) runs against <version> (<instance folder>/node_modules/@jr2/orchestrator)
98
+ ```
99
+
100
+ Then install the two packages again, with one version.
101
+
102
+ Your global `jr2` can stay at its version. Its version matters only for `jr2 init` and for commands outside an Instance.
103
+ In an Instance, it runs the Instance's own `@jr2/cli`. To upgrade it too, run `npm i -g @jr2/cli@<version>`.
104
+
105
+ ## Mirror the new images
106
+
107
+ Do this step only when the Instance sets `kitRegistry`. The mirror does not have the images of the new version yet, and
108
+ `jr2 up` never pushes them. In the Instance folder, run:
109
+
110
+ ```sh
111
+ jr2 kit push <registry>
112
+ ```
113
+
114
+ `<registry>` is the value of `kitRegistry`. The Instance's own `@jr2/cli` runs, so the command copies the images of the
115
+ new version. [Mirror the Kit images](mirror-the-kit-images.md) shows its output.
116
+
117
+ ## Compare with the cluster
118
+
119
+ `jr2 version`, with no `--local`, also reads what the cluster runs. Before the converge, it tells you that the cluster
120
+ is at the old version:
121
+
122
+ ```sh
123
+ jr2 version
124
+ ```
125
+
126
+ ```text
127
+ …
128
+ orchestrator: <old version> assembly 87cddbde1271 ghcr.io/snapwich/jr2-orchestrator:<old version>
129
+ operator: <old version> ghcr.io/snapwich/jr2-operator:<old version>
130
+ …
131
+ skew: deployed <old version> predates this kit <version> — `jr2 up` converges it
132
+ ```
133
+
134
+ `87cddbde1271` is the hash of the current [Assembly](../reference/glossary.md#assembly), and your hash is different. The
135
+ `orchestrator` line also gives the image of the [Orchestrator](../reference/glossary.md#orchestrator) that runs in the
136
+ cluster.
137
+
138
+ When the Orchestrator in the cluster is newer than the Kit version of the Instance, the `skew` line says
139
+ ``deployed <deployed version> is newer than this kit <version> — `jr2 up` would roll the orchestrator back; the operator is never downgraded``.
140
+ `<deployed version>` is the version in the cluster.
141
+
142
+ `jr2 version` does not refuse a Kit version mismatch. It shows `MISMATCH` on the `kit` line. When `package.json` pins a
143
+ version that is not installed, the `kit` line ends in `; package.json pins <version> — reinstall`.
144
+
145
+ ## Converge
146
+
147
+ ```sh
148
+ jr2 up
149
+ ```
150
+
151
+ ```text
152
+ …
153
+ AGENTS.md: jr2 block updated for <version>
154
+ jr2 up — instance "my-instance" → context <context> / namespace my-instance
155
+ typecheck: tsc --noEmit (the instance's own compiler)
156
+ …
157
+ images: installed kit — the published v<version> Harness, operator and Orchestrator, pulled from ghcr.io/snapwich
158
+ …
159
+ operator: applying v<version> (ghcr.io/snapwich/jr2-operator:<version>) over v<old version>
160
+ …
161
+ orchestrator: applying (image ghcr.io/snapwich/jr2-orchestrator:<version>)
162
+ orchestrator: waiting for rollout
163
+ orchestrator: verified — 1 pod(s) running ghcr.io/snapwich/jr2-orchestrator:<version>
164
+ …
165
+ assembly: publishing 36b7afe19f88 (no current Assembly)
166
+ assembly: 36b7afe19f88 is current — workflows: <workflows>
167
+ converged — `jr2 run <workflow>` when ready
168
+ ```
169
+
170
+ `<context>` is the kubectl context of the cluster. `36b7afe19f88` is the hash of the Assembly for the new version, and
171
+ your hash is different. The new Orchestrator does not load the Assembly of the old version, so the publish line says
172
+ `no current Assembly`.
173
+
174
+ `jr2 up` does these things for the upgrade:
175
+
176
+ - **`AGENTS.md`.** Before the cluster work, it writes the docs index of the new Kit version between the two `jr2-docs`
177
+ markers. It changes nothing outside the markers. A converge that fails still updates the block. `jr2 up` does not
178
+ change an `AGENTS.md` that has no markers. When the markers are not a correct pair, `jr2 up` does not change the file,
179
+ and the converge continues: `warning: AGENTS.md: <reason>, so the jr2 block was not updated`.
180
+ - **The typecheck.** It typechecks the Instance against the new Kit. A [Workflow](../reference/glossary.md#workflow)
181
+ that the new version does not accept stops the converge before the cluster changes. See the Rules.
182
+ - **The images.** The nodes pull the [Kit images](../reference/glossary.md#kit-image) at the tag of the new version, the
183
+ image of the Orchestrator too. The pod of the Orchestrator starts again on it. A
184
+ [Sandbox Image](../reference/glossary.md#sandbox-image) does not change, because the runtime of jr2 is not in it.
185
+ - **The Assembly.** The Assembly records its Kit version, so the hash changes. `jr2 up` publishes the Assembly after the
186
+ new Orchestrator runs. Until the publish, the new Orchestrator has no current Assembly, and it starts no run.
187
+ - **The operator.** All the Instances on the cluster share one operator. `jr2 up` upgrades an older operator, so the
188
+ upgrade of one Instance upgrades the operator for each Instance on the cluster. `jr2 up` never downgrades the
189
+ operator. When a different Instance upgraded the operator to a later version, `jr2 up` keeps it:
190
+ `operator: leaving v<deployed version> (newer than this kit's v<version> — never downgraded)`.
191
+
192
+ ## What happens to the runs
193
+
194
+ A live run holds the Assembly that it started under, and that Assembly is for the old Kit version. The new Orchestrator
195
+ cannot load it. Thus the publish of the new Assembly marks each live run `drifted`, also a run that waits at a
196
+ [Gate](../reference/glossary.md#gate). `jr2 status <run id>` gives the reason, with the hash of the Assembly and the two
197
+ versions:
198
+ `workflow "<workflow>": Assembly <hash> was published for Kit version <old version>; this Orchestrator is <version>`. To
199
+ keep the result of a run, let it end before you converge, or cancel it. See
200
+ [Machine shape and drift](../concepts/durable-runs.md#machine-shape-and-drift).
201
+
202
+ A [Sandbox](../reference/glossary.md#sandbox) that runs keeps its pod, with the
203
+ [Harness](../reference/glossary.md#harness) of the old version. `jr2 up` does not replace the pod, because the new pod
204
+ would lose the commits that nobody pushed. A Sandbox that starts after the converge uses the new version.
205
+
206
+ ## Rules
207
+
208
+ - `jr2 up` refuses an Instance that does not typecheck against the new Kit. It builds nothing and applies nothing. The
209
+ lines after the refusal are the errors of the compiler:
210
+ `refusing: this instance does not typecheck — nothing was built and nothing was applied`
211
+ - Each verb that reads the Instance, other than `jr2 version`, refuses when the Instance and the CLI do not use the same
212
+ copy of `@jr2/orchestrator`, or when that copy does not have the version of the CLI. The refusal gives the two copies,
213
+ and its last line gives the fix:
214
+
215
+ ```text
216
+ error: Kit version mismatch — an Instance has one (ADR-0056):
217
+ @jr2/orchestrator resolves to <instance kit version> (<path>)
218
+ this jr2 (<cli version>) runs against <cli kit version> (<path>)
219
+ pin "@jr2/orchestrator" and "@jr2/cli" at ONE exact version in <instance folder>/package.json and reinstall
220
+ ```
221
+
222
+ `<instance kit version>` is the version of `@jr2/orchestrator` that the Instance installs. `<cli version>` is the
223
+ version of the `jr2` that runs, and `<cli kit version>` is the version of the `@jr2/orchestrator` beside that `jr2`.
224
+ When the Instance has no `@jr2/cli` of its own, the last line is
225
+ `add "@jr2/cli": "<instance kit version>" to devDependencies in <instance folder>/package.json and reinstall — the Instance's own jr2 then runs`.
226
+ When nothing is installed, the refusal says `@jr2/orchestrator does not resolve from <instance folder>`.
227
+
228
+ ## Read next
229
+
230
+ - [Converge](../concepts/converge.md)
231
+ - [Durable runs](../concepts/durable-runs.md)
232
+ - [ADR-0056](../reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md):
233
+ the Handoff, and one Kit version for each Instance.
234
+ - [ADR-0072](../reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md): the
235
+ docs in the Kit, and the block in `AGENTS.md`.
236
+ - [ADR-0069](../reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md): an
237
+ Assembly names its Kit version, and the Orchestrator refuses any other.
238
+ - [ADR-0030](../reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md): a run whose Machine has
239
+ a different shape.
240
+ - [Mirror the Kit images](mirror-the-kit-images.md)
@@ -0,0 +1,208 @@
1
+ ---
2
+ title: Use a hosted provider or a gateway
3
+ description: Give your Agents a model from a hosted provider, directly or through a gateway.
4
+ ---
5
+
6
+ # Use a hosted provider or a gateway
7
+
8
+ Give the [Agents](../reference/glossary.md#agent) of your [Instance](../reference/glossary.md#instance) a model from a
9
+ hosted provider, such as Anthropic, directly or through a gateway.
10
+
11
+ The [Harness](../reference/glossary.md#harness) has a model catalog. The catalog knows the providers, their models, and
12
+ the limits of each model. An Agent names a catalog model as `<provider>/<modelId>`, such as `anthropic/<modelId>`. The
13
+ config needs no provider entry for it. It needs only the key.
14
+
15
+ ## Hold the provider's key
16
+
17
+ Add the key to the `secrets` list of `jr2.config.ts`:
18
+
19
+ ```ts
20
+ import { defineConfig } from "@jr2/orchestrator";
21
+
22
+ export default defineConfig({
23
+ git: {
24
+ // The credentials that the cluster uses to clone and push. The token comes from JR2_GIT_TOKEN in .env.
25
+ credentials: [{ match: "*", token: "JR2_GIT_TOKEN", sshKey: "jr2-git-ssh" }],
26
+ },
27
+ // The model key. jr2 up gives it only to the Custodian of each pod whose Agents use Anthropic.
28
+ secrets: [{ name: "ANTHROPIC_API_KEY", value: process.env.ANTHROPIC_API_KEY }],
29
+ });
30
+ ```
31
+
32
+ Put the value in `.env`:
33
+
34
+ ```sh
35
+ ANTHROPIC_API_KEY=<your key>
36
+ ```
37
+
38
+ The `name` of the entry is the env var that the provider reads. When an Agent names a model of that provider, the key is
39
+ a [Held secret](../reference/glossary.md#held-secret) in the pod of the Agent. The Harness container holds only its
40
+ [Stand-in](../reference/glossary.md#stand-in). The [Custodian](../reference/glossary.md#custodian) of the pod puts the
41
+ key into the requests to the provider.
42
+
43
+ You do not say which pods get the key. jr2 finds them from the models that the Agents of each pod name.
44
+
45
+ The name tells jr2 the provider and its host. For a key that goes to one host, `hosts` can stay out: the key then goes
46
+ to that host only. Some of these names are:
47
+
48
+ | Name | Provider | Host |
49
+ | -------------------- | ------------ | ----------------------------------- |
50
+ | `ANTHROPIC_API_KEY` | `anthropic` | `api.anthropic.com` |
51
+ | `OPENAI_API_KEY` | `openai` | `api.openai.com` |
52
+ | `GEMINI_API_KEY` | `google` | `generativelanguage.googleapis.com` |
53
+ | `MISTRAL_API_KEY` | `mistral` | `api.mistral.ai` |
54
+ | `OPENROUTER_API_KEY` | `openrouter` | `openrouter.ai` |
55
+
56
+ Some providers have no single host, because the address has a region or an account in it. Examples are
57
+ `AWS_BEARER_TOKEN_BEDROCK`, `AZURE_OPENAI_API_KEY` and `GOOGLE_CLOUD_API_KEY`. For these, add the hosts to the entry,
58
+ such as `hosts: ["<resource host>"]`.
59
+
60
+ To keep the value in a Kubernetes Secret that you manage, write `valueFrom` in place of `value`:
61
+ `valueFrom: { secretKeyRef: { name: "<secret>", key: "<key>" } }`. See [`secrets`](../reference/config.md#secrets) for
62
+ each field.
63
+
64
+ Run `jr2 up`:
65
+
66
+ ```sh
67
+ jr2 up
68
+ ```
69
+
70
+ For an Instance whose Agent has only the [Menu](../reference/glossary.md#menu) and uses Anthropic, you see these lines:
71
+
72
+ ```text
73
+ …
74
+ secret ANTHROPIC_API_KEY: Held in the Instance Harness
75
+ the Instance Harness: Custodian holds ANTHROPIC_API_KEY (provider)
76
+ held secret ANTHROPIC_API_KEY → api.anthropic.com (literal)
77
+ provider: checking anthropic/claude-haiku-5-5 on the Instance Harness, through a Custodian that holds ANTHROPIC_API_KEY for api.anthropic.com
78
+ provider: the check pod has up to 5 min to start, then up to 6 min for its model
79
+ provider: the check pod is not running yet — custodian: PodInitializing
80
+ provider: anthropic/claude-haiku-5-5 reachable, and it completed a tool call
81
+ …
82
+ ```
83
+
84
+ For an Agent in a [Workspace](../reference/glossary.md#workspace), the line names its
85
+ [Workflow](../reference/glossary.md#workflow): `Workspace of workflow "<workflow>"`. For a Workspace inside a different
86
+ Machine, the label continues with its route, such as ` → "<state>"`.
87
+
88
+ Before `jr2 up` applies the operator and the Instance, it checks each catalog model that an Agent names. A pod in the
89
+ cluster asks the provider for one tool call, through a Custodian that holds the key, as a
90
+ [Turn](../reference/glossary.md#turn) asks. When the model id or the key is wrong, `jr2 up` stops with
91
+ `error: provider preflight failed for model "<model>"`. The Instance, its Assembly and the operator do not change.
92
+ [Fix a failed converge](fix-a-failed-converge.md#rules) gives the full error.
93
+
94
+ ## Send the calls through a gateway
95
+
96
+ A gateway, such as LiteLLM, serves the API of a provider at a different address. The catalog keeps every fact about the
97
+ models. Only the address of the calls changes.
98
+
99
+ Change the `secrets` entry: read its value from `GATEWAY_API_KEY`, and add `paths`. Then add the gateway to
100
+ [`harness.catalog`](../reference/config.md#harness-catalog), under the id of the provider:
101
+
102
+ ```ts
103
+ import { defineConfig } from "@jr2/orchestrator";
104
+
105
+ export default defineConfig({
106
+ git: {
107
+ // The credentials that the cluster uses to clone and push. The token comes from JR2_GIT_TOKEN in .env.
108
+ credentials: [{ match: "*", token: "JR2_GIT_TOKEN", sshKey: "jr2-git-ssh" }],
109
+ },
110
+ // The gateway's key, held under the name that the provider reads. With no hosts, it goes to the host of the
111
+ // gateway below. paths keeps it away from the gateway's other routes.
112
+ secrets: [{ name: "ANTHROPIC_API_KEY", value: process.env.GATEWAY_API_KEY, paths: ["/v1/messages"] }],
113
+ harness: {
114
+ // Each call of an anthropic/<model> Agent goes to the gateway, not to api.anthropic.com.
115
+ catalog: { anthropic: { baseUrl: process.env.GATEWAY_URL ?? "" } },
116
+ },
117
+ });
118
+ ```
119
+
120
+ Put the address and the key of the gateway in `.env`:
121
+
122
+ ```sh
123
+ GATEWAY_URL=https://<gateway>
124
+ GATEWAY_API_KEY=<gateway key>
125
+ ```
126
+
127
+ Obey these conditions:
128
+
129
+ - `baseUrl` is the whole base URL that the provider's API adds its paths to. For `anthropic`, it is `https://<gateway>`,
130
+ and the API adds `/v1/messages`. For `openai`, it is `https://<gateway>/v1`.
131
+ - `baseUrl` is `https://`, because the Custodian sends a key over TLS only.
132
+ - The gateway serves each model under its catalog id. The Harness sends the catalog id, not a name that you choose.
133
+ - The key has the name that the provider reads, here `ANTHROPIC_API_KEY`. With no `hosts`, the key goes to the host of
134
+ `baseUrl`, not to `api.anthropic.com`.
135
+
136
+ `paths` limits the key to the path prefixes that the Agents use. A gateway key can often reach admin routes too, such as
137
+ a route that makes new keys. An Agent could take a new key out of the pod. Thus give a gateway key `paths`.
138
+
139
+ When the certificate of the gateway comes from a private CA, name the CA in
140
+ [`harness.caBundle`](../reference/config.md#harness-cabundle). The guide
141
+ [Use a local model](use-a-local-model.md#change-the-provider) shows `caBundle`.
142
+
143
+ Run `jr2 up` again:
144
+
145
+ ```sh
146
+ jr2 up
147
+ ```
148
+
149
+ The key now goes to the gateway:
150
+
151
+ ```text
152
+ …
153
+ held secret ANTHROPIC_API_KEY → <gateway> (literal)
154
+ provider: checking anthropic/claude-haiku-5-5 on the Instance Harness, through a Custodian that holds ANTHROPIC_API_KEY for <gateway>
155
+ …
156
+ provider: anthropic/claude-haiku-5-5 reachable, and it completed a tool call
157
+ …
158
+ ```
159
+
160
+ `<gateway>` is the host of `GATEWAY_URL`. When its port is not 443, the port follows the host, such as `<gateway>:8443`.
161
+
162
+ A gateway that serves its own model names, or only `/v1/chat/completions`, is not a catalog provider. Declare it as a
163
+ custom provider, with `harness.provider` and `apiKey`. The guide
164
+ [Use a local model](use-a-local-model.md#serve-over-tls-with-a-key) shows how.
165
+
166
+ ## Rules
167
+
168
+ `jr2 up` prints each refusal after `error: `.
169
+
170
+ - `jr2 up` refuses an empty value: `secrets[<i>].value is empty — set <NAME> in .env (ADR-0059)`.
171
+ - `jr2 up` refuses a key that a pod gets, but that has no value. A `.env` variable that is not set reads as no value:
172
+ `secrets[<i>] needs exactly one of value or valueFrom — <NAME> has neither, which is what an unset .env variable reads as: set <NAME> in .env, or reference a Secret with valueFrom: { secretKeyRef: { name, key } } (ADR-0059)`.
173
+ - `jr2 up` refuses a key with no `hosts` when its name has no single host:
174
+ `secrets[<i>].hosts is absent, and <NAME> has no single default host — name where the value may go: hosts: ["gateway.example.com"] (ADR-0059)`.
175
+ - `jr2 up` refuses `hosts` that leave out the host to which an Agent's calls go:
176
+ `secrets[<i>].hosts leaves out <host>, where pi sends every "<provider>/…" turn an Agent here names — each would arrive with the Stand-in and fail with 401. Add it, or drop hosts to take that default (ADR-0059)`.
177
+ - `jr2 up` refuses a model key in `harness.env`, because the Agent can read that env:
178
+ `harness.env[<i>] sets <NAME>, a model key the Agent could read and take out of the pod — hold it instead: secrets: [<entry>] (ADR-0059)`.
179
+ - `jr2 up` refuses a Secret or a ConfigMap that `harness.envFrom` names, when it carries a model key. `<kind>` is
180
+ `Secret` or `ConfigMap`:
181
+ `harness.envFrom[<i>] loads <kind> "<name>", which carries <NAME> — a model key the Agent could read. Hold it instead: secrets: [{ name: "<NAME>", valueFrom: { secretKeyRef: { name: "<secret>", key: "<NAME>" } } }], and drop the key from that <kind> (ADR-0059)`.
182
+ - `jr2 up` refuses a `valueFrom` that names a Secret that does not exist:
183
+ `secrets[<i>].valueFrom names Secret "<name>", which does not exist in the instance's namespace — create it first: kubectl create secret generic <name> --from-literal=<key>=... (ADR-0019, ADR-0059)`.
184
+ - `jr2 up` refuses a `harness.catalog` key that is not a catalog provider with a known key:
185
+ `harness.catalog.<id>: "<id>" is not a pi catalog provider jr2 knows a key for — the catalog ids are <ids> (ADR-0059)`.
186
+ - `jr2 up` refuses a gateway address that is not `https://`:
187
+ `harness.catalog.<id>.baseUrl must be an https:// URL — the Custodian carries TLS only (ADR-0059). Read it from .env: catalog: { anthropic: { baseUrl: process.env.LITELLM_URL ?? "" } }`.
188
+ - `jr2 up` warns about a key that no pod gets:
189
+ `warning: secrets[<i>] (<NAME>) is named by nothing; goes nowhere — no workspace() lists it, no Agent's provider reads it, and no Effect names it (ADR-0059, ADR-0068)`.
190
+ - A credential that signs each request, such as `AWS_ACCESS_KEY_ID`, cannot be a Held secret. `jr2 up` warns when
191
+ `harness.env` sets one. Send the calls through a gateway that holds the credential, and hold the key of the gateway:
192
+ `warning: harness.env sets <NAME>: a signing credential cannot be held (a Stand-in cannot be swapped into a signature), so the Agent can read it — route the provider through a gateway that holds it, and hold the gateway's key instead (ADR-0059)`.
193
+ - The Harness refuses a model that is not in the catalog when it admits the Turn:
194
+ `harness admission failed (400): agent "<agent>": model "<provider>/<modelId>" resolves to nothing — not in pi's catalog, and no custom provider "<provider>" is configured (ADR-0018)`.
195
+
196
+ ## Read next
197
+
198
+ - [Secrets and trust](../concepts/secrets-and-trust.md): Held secrets, Stand-ins and the Custodian.
199
+ - [Connect a model](../get-started/connect-a-model.md): the tutorial step that adds the Anthropic key.
200
+ - [Use a local model](use-a-local-model.md): a model that you serve yourself.
201
+ - [`secrets`](../reference/config.md#secrets) and [`harness.catalog`](../reference/config.md#harness-catalog) in the
202
+ `jr2.config.ts` Reference.
203
+ - [ADR-0059](../reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md): the Custodian
204
+ holds the keys, and a catalog provider can move to a gateway.
205
+ - [ADR-0068](../reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md): one `secrets`
206
+ list, and a secret goes where something names it.
207
+ - [ADR-0018](../reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md): an Agent names
208
+ its model.