@jr2/orchestrator 0.4.1 → 0.6.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 (361) 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 +478 -0
  10. package/docs/concepts/architecture.md +243 -0
  11. package/docs/concepts/charts.md +146 -0
  12. package/docs/concepts/composition.md +357 -0
  13. package/docs/concepts/converge.md +257 -0
  14. package/docs/concepts/durable-runs.md +189 -0
  15. package/docs/concepts/effects.md +658 -0
  16. package/docs/concepts/gates.md +208 -0
  17. package/docs/concepts/machines-and-workflows.md +298 -0
  18. package/docs/concepts/pools-and-sources.md +230 -0
  19. package/docs/concepts/secrets-and-trust.md +306 -0
  20. package/docs/concepts/the-menu.md +381 -0
  21. package/docs/concepts/workspaces.md +756 -0
  22. package/docs/get-started/a-model-decides.md +563 -0
  23. package/docs/get-started/an-agent-in-a-sandbox.md +383 -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 +993 -0
  27. package/docs/get-started/install.md +130 -0
  28. package/docs/guides/add-tools-to-the-sandbox.md +308 -0
  29. package/docs/guides/answer-a-gate.md +304 -0
  30. package/docs/guides/bind-open-parts.md +224 -0
  31. package/docs/guides/cancel-a-run.md +146 -0
  32. package/docs/guides/clean-up.md +206 -0
  33. package/docs/guides/cut-a-worktree.md +560 -0
  34. package/docs/guides/fix-a-failed-converge.md +361 -0
  35. package/docs/guides/give-the-cluster-git-credentials.md +222 -0
  36. package/docs/guides/iterate-on-a-machine-on-kind.md +190 -0
  37. package/docs/guides/let-an-agent-write-a-chart.md +230 -0
  38. package/docs/guides/look-inside-a-sandbox.md +177 -0
  39. package/docs/guides/mirror-the-kit-images.md +176 -0
  40. package/docs/guides/move-from-kind-to-a-shared-cluster.md +318 -0
  41. package/docs/guides/open-the-console.md +91 -0
  42. package/docs/guides/publish-a-machine-as-an-npm-package.md +350 -0
  43. package/docs/guides/push-and-sign-a-branch.md +532 -0
  44. package/docs/guides/run-a-chart-by-name.md +270 -0
  45. package/docs/guides/run-a-command-or-call-a-url.md +587 -0
  46. package/docs/guides/run-one-worker-per-item.md +322 -0
  47. package/docs/guides/set-an-agents-access-and-dials.md +420 -0
  48. package/docs/guides/size-a-workspace.md +217 -0
  49. package/docs/guides/start-a-run-from-a-run.md +237 -0
  50. package/docs/guides/start-a-run.md +207 -0
  51. package/docs/guides/upgrade-the-kit-version.md +240 -0
  52. package/docs/guides/use-a-hosted-provider.md +214 -0
  53. package/docs/guides/use-a-local-model.md +313 -0
  54. package/docs/guides/watch-a-run.md +349 -0
  55. package/docs/guides/write-a-workflow.md +318 -0
  56. package/docs/index.md +44 -0
  57. package/docs/llms.txt +237 -0
  58. package/docs/reference/authoring-surface/agent.md +151 -0
  59. package/docs/reference/authoring-surface/answer.md +156 -0
  60. package/docs/reference/authoring-surface/arg.md +82 -0
  61. package/docs/reference/authoring-surface/basic.md +62 -0
  62. package/docs/reference/authoring-surface/bearer.md +53 -0
  63. package/docs/reference/authoring-surface/branchname.md +15 -0
  64. package/docs/reference/authoring-surface/chartschema.md +23 -0
  65. package/docs/reference/authoring-surface/chartschemafor.md +48 -0
  66. package/docs/reference/authoring-surface/command.md +206 -0
  67. package/docs/reference/authoring-surface/customize.md +64 -0
  68. package/docs/reference/authoring-surface/defineconfig.md +41 -0
  69. package/docs/reference/authoring-surface/defineevent.md +114 -0
  70. package/docs/reference/authoring-surface/dispatch.md +126 -0
  71. package/docs/reference/authoring-surface/fail.md +96 -0
  72. package/docs/reference/authoring-surface/file.md +142 -0
  73. package/docs/reference/authoring-surface/frompick.md +277 -0
  74. package/docs/reference/authoring-surface/http.md +259 -0
  75. package/docs/reference/authoring-surface/isfailure.md +58 -0
  76. package/docs/reference/authoring-surface/isready.md +14 -0
  77. package/docs/reference/authoring-surface/jr2setup.md +237 -0
  78. package/docs/reference/authoring-surface/open.md +105 -0
  79. package/docs/reference/authoring-surface/openbody.md +86 -0
  80. package/docs/reference/authoring-surface/paramsof.md +143 -0
  81. package/docs/reference/authoring-surface/pool.md +186 -0
  82. package/docs/reference/authoring-surface/push.md +130 -0
  83. package/docs/reference/authoring-surface/readyof.md +21 -0
  84. package/docs/reference/authoring-surface/secret.md +139 -0
  85. package/docs/reference/authoring-surface/sentby.md +83 -0
  86. package/docs/reference/authoring-surface/source.md +51 -0
  87. package/docs/reference/authoring-surface/text.md +62 -0
  88. package/docs/reference/authoring-surface/type-agentdeclaration.md +27 -0
  89. package/docs/reference/authoring-surface/type-agentdefinition.md +80 -0
  90. package/docs/reference/authoring-surface/type-agentlogic.md +15 -0
  91. package/docs/reference/authoring-surface/type-agentslots.md +15 -0
  92. package/docs/reference/authoring-surface/type-answeraction.md +12 -0
  93. package/docs/reference/authoring-surface/type-anyframepath.md +14 -0
  94. package/docs/reference/authoring-surface/type-anyworktreepath.md +15 -0
  95. package/docs/reference/authoring-surface/type-arg.md +19 -0
  96. package/docs/reference/authoring-surface/type-argnames.md +12 -0
  97. package/docs/reference/authoring-surface/type-bindactors.md +14 -0
  98. package/docs/reference/authoring-surface/type-binding.md +61 -0
  99. package/docs/reference/authoring-surface/type-bindingof.md +12 -0
  100. package/docs/reference/authoring-surface/type-bodyacceptsdoor.md +15 -0
  101. package/docs/reference/authoring-surface/type-bodyacceptsslots.md +17 -0
  102. package/docs/reference/authoring-surface/type-ceilings.md +41 -0
  103. package/docs/reference/authoring-surface/type-chainlink.md +19 -0
  104. package/docs/reference/authoring-surface/type-chartaction.md +46 -0
  105. package/docs/reference/authoring-surface/type-chartagent.md +28 -0
  106. package/docs/reference/authoring-surface/type-chartevent.md +20 -0
  107. package/docs/reference/authoring-surface/type-chartguard.md +20 -0
  108. package/docs/reference/authoring-surface/type-chartinvoke.md +28 -0
  109. package/docs/reference/authoring-surface/type-chartjson.md +14 -0
  110. package/docs/reference/authoring-surface/type-chartstate.md +46 -0
  111. package/docs/reference/authoring-surface/type-charttext.md +40 -0
  112. package/docs/reference/authoring-surface/type-charttransition.md +22 -0
  113. package/docs/reference/authoring-surface/type-charttransitions.md +14 -0
  114. package/docs/reference/authoring-surface/type-chartvalue.md +15 -0
  115. package/docs/reference/authoring-surface/type-childat.md +12 -0
  116. package/docs/reference/authoring-surface/type-childslots.md +12 -0
  117. package/docs/reference/authoring-surface/type-commandenv.md +15 -0
  118. package/docs/reference/authoring-surface/type-commandinput.md +20 -0
  119. package/docs/reference/authoring-surface/type-commandoptions.md +56 -0
  120. package/docs/reference/authoring-surface/type-commandoutput.md +122 -0
  121. package/docs/reference/authoring-surface/type-customize.md +111 -0
  122. package/docs/reference/authoring-surface/type-dispatchdefinition.md +39 -0
  123. package/docs/reference/authoring-surface/type-dispatchinput.md +14 -0
  124. package/docs/reference/authoring-surface/type-dispatchopenparts.md +14 -0
  125. package/docs/reference/authoring-surface/type-dispatchoutput.md +72 -0
  126. package/docs/reference/authoring-surface/type-doorlessinput.md +19 -0
  127. package/docs/reference/authoring-surface/type-duration.md +15 -0
  128. package/docs/reference/authoring-surface/type-effectbinding.md +93 -0
  129. package/docs/reference/authoring-surface/type-effectlogic.md +12 -0
  130. package/docs/reference/authoring-surface/type-envopenparts.md +14 -0
  131. package/docs/reference/authoring-surface/type-eventaudience.md +27 -0
  132. package/docs/reference/authoring-surface/type-eventdef.md +45 -0
  133. package/docs/reference/authoring-surface/type-eventfrom.md +16 -0
  134. package/docs/reference/authoring-surface/type-eventsemantics.md +26 -0
  135. package/docs/reference/authoring-surface/type-execoutcome.md +34 -0
  136. package/docs/reference/authoring-surface/type-failslot.md +14 -0
  137. package/docs/reference/authoring-surface/type-failure.md +19 -0
  138. package/docs/reference/authoring-surface/type-failureinput.md +20 -0
  139. package/docs/reference/authoring-surface/type-filebody.md +37 -0
  140. package/docs/reference/authoring-surface/type-framepath.md +14 -0
  141. package/docs/reference/authoring-surface/type-frominput.md +14 -0
  142. package/docs/reference/authoring-surface/type-hostinjectedinput.md +56 -0
  143. package/docs/reference/authoring-surface/type-httpdefinition.md +104 -0
  144. package/docs/reference/authoring-surface/type-httpfileinput.md +20 -0
  145. package/docs/reference/authoring-surface/type-httpinput.md +12 -0
  146. package/docs/reference/authoring-surface/type-httpmethod.md +14 -0
  147. package/docs/reference/authoring-surface/type-httpopenparts.md +12 -0
  148. package/docs/reference/authoring-surface/type-httpoutput.md +95 -0
  149. package/docs/reference/authoring-surface/type-httprequestparts.md +33 -0
  150. package/docs/reference/authoring-surface/type-jr2config.md +126 -0
  151. package/docs/reference/authoring-surface/type-lateroutcome.md +21 -0
  152. package/docs/reference/authoring-surface/type-lends.md +38 -0
  153. package/docs/reference/authoring-surface/type-logicat.md +12 -0
  154. package/docs/reference/authoring-surface/type-markedif.md +12 -0
  155. package/docs/reference/authoring-surface/type-mergedactors.md +12 -0
  156. package/docs/reference/authoring-surface/type-namedsecret.md +25 -0
  157. package/docs/reference/authoring-surface/type-namestart.md +77 -0
  158. package/docs/reference/authoring-surface/type-noslotworkspaceoptions.md +27 -0
  159. package/docs/reference/authoring-surface/type-notworktreekeys.md +12 -0
  160. package/docs/reference/authoring-surface/type-openbodydeclaration.md +40 -0
  161. package/docs/reference/authoring-surface/type-openbodylogic.md +14 -0
  162. package/docs/reference/authoring-surface/type-openbodyoutput.md +42 -0
  163. package/docs/reference/authoring-surface/type-openbodyslot.md +18 -0
  164. package/docs/reference/authoring-surface/type-opencommandinput.md +22 -0
  165. package/docs/reference/authoring-surface/type-openeffect.md +12 -0
  166. package/docs/reference/authoring-surface/type-openeffectslots.md +12 -0
  167. package/docs/reference/authoring-surface/type-openof.md +12 -0
  168. package/docs/reference/authoring-surface/type-opensecret.md +23 -0
  169. package/docs/reference/authoring-surface/type-opensecretmark.md +12 -0
  170. package/docs/reference/authoring-surface/type-permissivenoslotworkspaceoptions.md +26 -0
  171. package/docs/reference/authoring-surface/type-permissiveworkspaceoptions.md +27 -0
  172. package/docs/reference/authoring-surface/type-poolmachine.md +28 -0
  173. package/docs/reference/authoring-surface/type-poolnextinput.md +22 -0
  174. package/docs/reference/authoring-surface/type-poolspec.md +60 -0
  175. package/docs/reference/authoring-surface/type-pushinput.md +34 -0
  176. package/docs/reference/authoring-surface/type-pushoptions.md +79 -0
  177. package/docs/reference/authoring-surface/type-pushoutput.md +149 -0
  178. package/docs/reference/authoring-surface/type-pushwireoutput.md +12 -0
  179. package/docs/reference/authoring-surface/type-quantity.md +14 -0
  180. package/docs/reference/authoring-surface/type-reached.md +12 -0
  181. package/docs/reference/authoring-surface/type-reposlot.md +70 -0
  182. package/docs/reference/authoring-surface/type-reposlotsof.md +16 -0
  183. package/docs/reference/authoring-surface/type-sandboxoptions.md +84 -0
  184. package/docs/reference/authoring-surface/type-secret.md +25 -0
  185. package/docs/reference/authoring-surface/type-sender.md +19 -0
  186. package/docs/reference/authoring-surface/type-sentbyguards.md +12 -0
  187. package/docs/reference/authoring-surface/type-size.md +85 -0
  188. package/docs/reference/authoring-surface/type-slothandles.md +24 -0
  189. package/docs/reference/authoring-surface/type-sourcenextresult.md +17 -0
  190. package/docs/reference/authoring-surface/type-sourcespec.md +44 -0
  191. package/docs/reference/authoring-surface/type-syncstate.md +12 -0
  192. package/docs/reference/authoring-surface/type-text.md +19 -0
  193. package/docs/reference/authoring-surface/type-textpart.md +24 -0
  194. package/docs/reference/authoring-surface/type-thinkinglevel.md +39 -0
  195. package/docs/reference/authoring-surface/type-toparameterizedobject.md +14 -0
  196. package/docs/reference/authoring-surface/type-toprovidedactor.md +14 -0
  197. package/docs/reference/authoring-surface/type-unknown.md +21 -0
  198. package/docs/reference/authoring-surface/type-usercontainer.md +77 -0
  199. package/docs/reference/authoring-surface/type-withoutemptyindex.md +20 -0
  200. package/docs/reference/authoring-surface/type-workflowevent.md +46 -0
  201. package/docs/reference/authoring-surface/type-workspaceaccess.md +16 -0
  202. package/docs/reference/authoring-surface/type-workspaced.md +115 -0
  203. package/docs/reference/authoring-surface/type-workspacehandles.md +22 -0
  204. package/docs/reference/authoring-surface/type-workspacemachine.md +29 -0
  205. package/docs/reference/authoring-surface/type-workspaceof.md +13 -0
  206. package/docs/reference/authoring-surface/type-workspaceoptions.md +27 -0
  207. package/docs/reference/authoring-surface/type-worktreefound.md +16 -0
  208. package/docs/reference/authoring-surface/type-worktreeinput.md +56 -0
  209. package/docs/reference/authoring-surface/type-worktreekey.md +14 -0
  210. package/docs/reference/authoring-surface/type-worktreeoptions.md +29 -0
  211. package/docs/reference/authoring-surface/type-worktreeoutput.md +45 -0
  212. package/docs/reference/authoring-surface/type-worktreepath.md +16 -0
  213. package/docs/reference/authoring-surface/type-worktreeready.md +37 -0
  214. package/docs/reference/authoring-surface/type-worktreerefused.md +21 -0
  215. package/docs/reference/authoring-surface/workspace.md +287 -0
  216. package/docs/reference/authoring-surface/worktree.md +71 -0
  217. package/docs/reference/authoring-surface.md +217 -0
  218. package/docs/reference/cli.md +433 -0
  219. package/docs/reference/config.md +765 -0
  220. package/docs/reference/decisions/0001-operator-owned-generic-sandbox.md +114 -0
  221. package/docs/reference/decisions/0002-duplex-streaming-actor.md +117 -0
  222. package/docs/reference/decisions/0004-worktree-provisioning-model.md +130 -0
  223. package/docs/reference/decisions/0005-sandbox-pod-composition.md +240 -0
  224. package/docs/reference/decisions/0006-agent-control-surface.md +50 -0
  225. package/docs/reference/decisions/0007-durable-machine-state.md +109 -0
  226. package/docs/reference/decisions/0008-orchestrator-as-deployed-app.md +60 -0
  227. package/docs/reference/decisions/0009-cli-and-instance-interface.md +275 -0
  228. package/docs/reference/decisions/0010-bdd-acceptance-tests.md +160 -0
  229. package/docs/reference/decisions/0011-workflow-defined-events.md +141 -0
  230. package/docs/reference/decisions/0012-workspace-wrapper-machine.md +103 -0
  231. package/docs/reference/decisions/0013-the-agent-reaches-its-machine-through-a-container-it-cannot-read.md +175 -0
  232. package/docs/reference/decisions/0014-observation-is-open-run-state-is-not.md +95 -0
  233. package/docs/reference/decisions/0015-authoring-surface-absorbs-the-mechanism.md +271 -0
  234. package/docs/reference/decisions/0016-agent-turn-mechanics-are-internal.md +126 -0
  235. package/docs/reference/decisions/0017-pool-over-a-source-port.md +71 -0
  236. package/docs/reference/decisions/0018-instance-agents-are-definitions-jr2-assembles-the-harness.md +111 -0
  237. package/docs/reference/decisions/0019-one-converging-command-against-the-current-context.md +287 -0
  238. package/docs/reference/decisions/0020-private-ca-trust-is-a-named-concept.md +60 -0
  239. package/docs/reference/decisions/0021-workspace-continuity-is-a-lease-that-answers-back.md +101 -0
  240. package/docs/reference/decisions/0022-observation-is-a-level-triggered-feed.md +103 -0
  241. package/docs/reference/decisions/0023-the-harness-prints-the-conversation.md +175 -0
  242. package/docs/reference/decisions/0024-an-agents-turn-ends-with-the-state-that-asked-for-it.md +436 -0
  243. package/docs/reference/decisions/0025-cancel-ends-a-run-stop-parks-it.md +65 -0
  244. package/docs/reference/decisions/0026-a-turn-that-is-over-is-never-prompted.md +62 -0
  245. package/docs/reference/decisions/0027-the-harness-is-jr2s-own-server-flue-retires-the-wire-stays.md +245 -0
  246. package/docs/reference/decisions/0028-what-an-agent-may-do-to-the-workspace-is-part-of-its-definition.md +90 -0
  247. package/docs/reference/decisions/0029-a-menu-is-fixed-for-a-conversation-and-a-turn-is-told-its-allowed-picks.md +154 -0
  248. package/docs/reference/decisions/0030-a-snapshot-names-the-machine-it-was-written-under.md +100 -0
  249. package/docs/reference/decisions/0031-menu-only-agents-run-on-the-instance-harness.md +193 -0
  250. package/docs/reference/decisions/0032-the-console-unlocks-with-the-instance-token.md +61 -0
  251. package/docs/reference/decisions/0033-a-machine-declares-the-input-that-starts-it.md +126 -0
  252. package/docs/reference/decisions/0034-the-console-renders-with-preact-and-the-server-erases-the-types.md +57 -0
  253. package/docs/reference/decisions/0035-a-runaway-turn-is-ended-rerolled-once-then-a-fault.md +92 -0
  254. package/docs/reference/decisions/0036-a-turn-compacts-its-own-context-mid-flight.md +138 -0
  255. package/docs/reference/decisions/0037-an-instance-builds-its-sandbox-images-jr2-injects-the-harness.md +196 -0
  256. package/docs/reference/decisions/0038-jr2-up-builds-every-image-it-deploys.md +170 -0
  257. package/docs/reference/decisions/0039-image-garbage-collects-by-reachability.md +115 -0
  258. package/docs/reference/decisions/0041-a-build-the-host-already-holds-is-not-spent-again.md +64 -0
  259. package/docs/reference/decisions/0042-ready-is-not-routable-an-admission-retries-its-connection.md +142 -0
  260. package/docs/reference/decisions/0043-the-kit-is-tested-as-installed-a-local-registry-stands-in-for-npm.md +170 -0
  261. package/docs/reference/decisions/0044-kit-images-live-at-a-canonical-home-a-self-host-mirrors-it.md +85 -0
  262. package/docs/reference/decisions/0045-the-platform-joins-the-image-address-and-the-cluster-chooses-it.md +82 -0
  263. package/docs/reference/decisions/0046-a-converge-failure-carries-its-diagnosis.md +34 -0
  264. package/docs/reference/decisions/0047-the-git-ssh-key-source-is-the-users-choice.md +47 -0
  265. package/docs/reference/decisions/0048-the-orchestrator-boots-without-its-repos.md +36 -0
  266. package/docs/reference/decisions/0049-a-machine-carries-its-parts-and-composes-by-invoke.md +126 -0
  267. package/docs/reference/decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md +73 -0
  268. package/docs/reference/decisions/0051-a-repo-is-a-slot-on-the-workspace-and-a-cache-on-the-node.md +238 -0
  269. package/docs/reference/decisions/0052-a-sandbox-lands-where-an-ordinary-pod-lands-and-the-cache-follows-it.md +86 -0
  270. package/docs/reference/decisions/0053-a-fetch-inside-the-pod-asks-the-node-cache-and-the-cache-asks-the-remote.md +123 -0
  271. package/docs/reference/decisions/0054-the-kit-ships-machines-and-a-shipped-machine-leaves-its-parts-open.md +126 -0
  272. package/docs/reference/decisions/0055-a-release-is-a-pushed-tag-and-the-publish-guard-is-the-credential.md +107 -0
  273. package/docs/reference/decisions/0056-a-global-jr2-hands-off-to-the-instances-own-and-an-instance-has-one-kit-version.md +62 -0
  274. package/docs/reference/decisions/0057-a-turn-is-its-frame-its-dials-and-whether-it-continues.md +152 -0
  275. package/docs/reference/decisions/0058-a-harness-answers-the-orchestrator-alone.md +108 -0
  276. package/docs/reference/decisions/0059-a-harness-holds-stand-ins-and-the-custodian-holds-the-keys.md +427 -0
  277. package/docs/reference/decisions/0060-a-workspace-states-its-size-and-jr2-reserves-all-of-it.md +111 -0
  278. package/docs/reference/decisions/0061-a-memory-kill-ends-the-agents-processes-not-the-harness.md +83 -0
  279. package/docs/reference/decisions/0062-jr2-briefs-the-agent-on-its-seat-never-on-its-task.md +239 -0
  280. package/docs/reference/decisions/0063-the-orchestrator-watches-the-cluster.md +82 -0
  281. package/docs/reference/decisions/0064-a-workspace-waits-for-capacity.md +79 -0
  282. package/docs/reference/decisions/0065-a-persist-survives-a-crash-and-history-is-a-week.md +65 -0
  283. package/docs/reference/decisions/0066-a-model-tier-runs-a-real-model-and-a-change-to-what-it-reads-runs-the-tier.md +552 -0
  284. package/docs/reference/decisions/0067-an-effect-is-an-actor-slot-and-runs-at-most-once-unless-marked-idempotent.md +458 -0
  285. package/docs/reference/decisions/0068-an-effector-holds-an-effects-secrets-and-signs-its-wire.md +475 -0
  286. package/docs/reference/decisions/0069-the-orchestrator-is-a-kit-image-and-an-instance-publishes-its-assembly.md +180 -0
  287. package/docs/reference/decisions/0070-a-machine-lends-its-parts-to-a-chart.md +334 -0
  288. package/docs/reference/decisions/0071-a-run-starts-a-run-through-a-dispatch-effect.md +183 -0
  289. package/docs/reference/decisions/0072-the-docs-ship-inside-the-kit-and-an-instances-agents-md-indexes-them.md +144 -0
  290. package/docs/reference/decisions/0073-a-machine-fails-a-run-with-fail-and-an-uncaught-failure-ends-it-failed.md +122 -0
  291. package/docs/reference/decisions/0074-an-unrouted-mechanism-event-is-refused-at-load-and-faults-the-run.md +76 -0
  292. package/docs/reference/decisions/0075-a-machine-cuts-a-worktree-and-the-workspace-only-clones.md +295 -0
  293. package/docs/reference/decisions/0076-an-agents-control-credential-lives-only-where-no-workspace-code-runs.md +320 -0
  294. package/docs/reference/decisions/0077-jr2-requires-landlock-on-every-sandbox-node.md +79 -0
  295. package/docs/reference/decisions.md +86 -0
  296. package/docs/reference/glossary.md +687 -0
  297. package/docs/reference/http-api.md +1386 -0
  298. package/docs/reference/machines.md +189 -0
  299. package/docs/reference/mechanism-events.md +72 -0
  300. package/docs/why.md +207 -0
  301. package/package.json +5 -3
  302. package/src/actor.ts +694 -106
  303. package/src/agent.ts +114 -38
  304. package/src/ambient.ts +3 -4
  305. package/src/assembly-checks.ts +189 -7
  306. package/src/cause.ts +234 -0
  307. package/src/chart.ts +345 -46
  308. package/src/charts.ts +43 -8
  309. package/src/config.ts +440 -178
  310. package/src/custodian.lua +17 -5
  311. package/src/custodian.ts +325 -99
  312. package/src/customize.ts +199 -49
  313. package/src/dispatch-effect.ts +945 -0
  314. package/src/door-compat.ts +217 -0
  315. package/src/durability.ts +11 -4
  316. package/src/effect-checks.ts +50 -3
  317. package/src/effect.ts +641 -128
  318. package/src/effector-wire.ts +165 -13
  319. package/src/fail.ts +222 -0
  320. package/src/harness-client.ts +587 -50
  321. package/src/harness-env.ts +33 -0
  322. package/src/held-secrets.ts +125 -16
  323. package/src/holds.ts +3 -0
  324. package/src/http-effect.ts +556 -58
  325. package/src/http.ts +480 -30
  326. package/src/index.ts +74 -82
  327. package/src/instance.ts +68 -8
  328. package/src/internal.ts +85 -0
  329. package/src/kube-client.ts +6 -3
  330. package/src/machine-doc.ts +24 -7
  331. package/src/mechanism-routes.ts +168 -0
  332. package/src/model-keys.generated.ts +53 -0
  333. package/src/model-keys.ts +42 -58
  334. package/src/names.ts +19 -6
  335. package/src/notices.ts +483 -41
  336. package/src/open-body.ts +242 -40
  337. package/src/open-effect.ts +81 -8
  338. package/src/open.ts +90 -6
  339. package/src/parts.ts +213 -30
  340. package/src/party.ts +101 -2
  341. package/src/pick.ts +497 -11
  342. package/src/pool.ts +282 -50
  343. package/src/registration.ts +133 -12
  344. package/src/repo-identity.ts +7 -3
  345. package/src/repos.ts +22 -3
  346. package/src/run-host.ts +665 -45
  347. package/src/run-output.ts +38 -0
  348. package/src/sandbox-effect.ts +457 -71
  349. package/src/sandbox-kube.ts +66 -17
  350. package/src/secret-placement.ts +59 -17
  351. package/src/server.ts +3 -0
  352. package/src/setup.ts +325 -62
  353. package/src/size.ts +121 -9
  354. package/src/snapshot-store.ts +54 -10
  355. package/src/stub-harness.ts +44 -16
  356. package/src/timers.ts +14 -1
  357. package/src/tokens.ts +107 -32
  358. package/src/vocabulary.ts +88 -14
  359. package/src/wire.ts +100 -26
  360. package/src/workspace.ts +771 -238
  361. package/src/worktree.ts +249 -0
@@ -0,0 +1,765 @@
1
+ ---
2
+ title: jr2.config.ts
3
+ description: "Every field of jr2.config.ts: its type, whether it is required, its default, and what it does."
4
+ ---
5
+
6
+ # jr2.config.ts
7
+
8
+ An Instance's config is the default export of its `jr2.config.ts`: a `JR2Config`, written with `defineConfig`. Each field below has its path, as in `git.credentials[].match`, where `[]` is each entry of a list and `<name>` is each key of a map.
9
+
10
+ The shape of `jr2.config.ts`: the deployment facts of an Instance, which a Machine cannot carry.
11
+ It holds the Instance's name, its secrets, how the cluster authenticates to Repos, what the
12
+ Harness can reach, where Sandboxes run, and where images go. It names no Repo, no model and no
13
+ Sandbox Image: a Machine names those itself.
14
+
15
+ Every field is optional, and an Instance can run with no `jr2.config.ts`. Write the file as
16
+ `export default defineConfig({ … })`. When the config loads, a file with no default export is
17
+ refused: `` <file> has no default export (use `export default defineConfig({…})`) ``. The load also
18
+ checks the shape of `git.credentials`, `secrets`, `harness.catalog` and `priorityClasses`. It
19
+ checks that `sandbox` is an object, and checks its `resources`. Each refusal names the field.
20
+ `jr2 up` checks the rest.
21
+
22
+ **Example**
23
+
24
+ ```ts
25
+ import { defineConfig, type JR2Config } from "@jr2/orchestrator";
26
+
27
+ const harness: JR2Config["harness"] = {
28
+ provider: {
29
+ id: "vllm",
30
+ api: "openai-completions",
31
+ baseUrl: process.env.VLLM_URL ?? "",
32
+ models: { "Qwen/Qwen3.6-35B-A3B": { contextWindow: 131072, maxTokens: 16384 } },
33
+ },
34
+ };
35
+
36
+ export default defineConfig({ name: "my-instance", harness });
37
+ ```
38
+
39
+ **See also**
40
+
41
+ - [Connect a model](../get-started/connect-a-model.md)
42
+ - [Secrets and trust](../concepts/secrets-and-trust.md)
43
+ - [ADR-0050: What code names, config declares; what the CLI names, discovery finds](decisions/0050-what-code-names-config-declares-what-the-cli-names-discovery-finds.md)
44
+
45
+ Fields: [`name`](#name), [`secrets`](#secrets), [`git`](#git), [`harness`](#harness), [`sandbox`](#sandbox), [`priorityClasses`](#priorityclasses), [`registry`](#registry), [`kitRegistry`](#kitregistry), [`platforms`](#platforms), [`operator`](#operator).
46
+
47
+ <a id="name"></a>
48
+
49
+ ## `name`
50
+
51
+ - Type: `string`
52
+ - Required: no
53
+ - Default: the name of the Instance folder
54
+
55
+ The Instance's name. Its Kubernetes namespace is this name (`-n` overrides it), and
56
+ `jr2 up` labels every object that it owns with it.
57
+
58
+ <a id="secrets"></a>
59
+
60
+ ## `secrets`
61
+
62
+ - Type: `readonly SecretEntry[]`
63
+ - Required: no
64
+
65
+ Every secret of the Instance, in one list. A secret goes where something names it. A Held
66
+ secret goes where a `workspace()` lists it under `secrets` or an Agent's provider reads it. An
67
+ Effect secret goes where an Effect names it with `secret("name")`. Its `hosts` is a Held
68
+ secret's binding, never its placement: an entry that nothing names goes nowhere. A model API
69
+ key goes here, never in `harness.env`. See `SecretEntry`. Each entry is checked when the
70
+ config loads: `<file> at secrets[<i>]<path>: <problem>`, followed by the shape of an entry.
71
+
72
+ <a id="secrets-name"></a>
73
+
74
+ ### `secrets[].name`
75
+
76
+ - Type: `string`
77
+ - Required: yes
78
+
79
+ As a Held secret, the name of its Stand-in: the file the Harness reads it from, the env var
80
+ that the engine reads a model key from, and the env var of the Agent's programs when the
81
+ `workspace()` lists it under `secrets`. As an Effect secret, the name that `secret("<name>")` names, and the name of the
82
+ Effector's file. For a Held secret, it must match `[A-Z_][A-Z0-9_]*`:
83
+ `secrets[<i>].name "<name>" is not an env var name ([A-Z_][A-Z0-9_]*)`. It must not start with
84
+ `JR2_` and must not be a proxy or trust variable of the kit:
85
+ `secrets[<i>].name <NAME> is the kit's — JR2_ names and the proxy and trust variables belong to the mechanism`.
86
+ One name, one entry: `secrets[<i>].name <NAME> is held twice`.
87
+
88
+ <a id="secrets-value"></a>
89
+
90
+ ### `secrets[].value`
91
+
92
+ - Type: `string`
93
+ - Required: no
94
+
95
+ The value, usually read from `process.env` (`.env`). `jr2 up` writes it only into the Secrets
96
+ of the containers that hold it. Write exactly one of `value` and `valueFrom`:
97
+ `secrets[<i>] needs exactly one of value or valueFrom`. A `.env` variable that is not set reads
98
+ as no value, and an empty one is refused: `secrets[<i>].value is empty — set <NAME> in .env`.
99
+
100
+ <a id="secrets-valuefrom"></a>
101
+
102
+ ### `secrets[].valueFrom`
103
+
104
+ - Type: `object`
105
+ - Required: no
106
+
107
+ Or a key of a Secret that you manage (Sealed Secrets, External Secrets):
108
+ `{ secretKeyRef: { name, key } }`. `jr2 up` checks that the Secret and the key exist. Each
109
+ container that holds the secret mounts that one key as a file, and no other container does.
110
+
111
+ <a id="secrets-valuefrom-secretkeyref"></a>
112
+
113
+ ### `secrets[].valueFrom.secretKeyRef`
114
+
115
+ - Type: `object`
116
+ - Required: yes
117
+
118
+ The Secret and the key in it that hold the value.
119
+
120
+ <a id="secrets-valuefrom-secretkeyref-name"></a>
121
+
122
+ ### `secrets[].valueFrom.secretKeyRef.name`
123
+
124
+ - Type: `string`
125
+ - Required: yes
126
+
127
+ The name of the Secret.
128
+
129
+ <a id="secrets-valuefrom-secretkeyref-key"></a>
130
+
131
+ ### `secrets[].valueFrom.secretKeyRef.key`
132
+
133
+ - Type: `string`
134
+ - Required: yes
135
+
136
+ The key in the Secret that holds the value.
137
+
138
+ <a id="secrets-hosts"></a>
139
+
140
+ ### `secrets[].hosts`
141
+
142
+ - Type: `readonly string[]`
143
+ - Required: no
144
+
145
+ Where the value may go as a Held secret. Each entry is `host`, `host:port`, or an `https://`
146
+ URL, of which only the host and port count. Write exact DNS names or IP addresses, with no
147
+ wildcards. The port default is 443. A known model key, such as `ANTHROPIC_API_KEY`, may leave
148
+ it out: it then goes to the one host that its provider calls. Any other Held secret must name
149
+ its hosts: `secrets[<i>].hosts is absent, and <NAME> has no single default host`.
150
+
151
+ <a id="secrets-headers"></a>
152
+
153
+ ### `secrets[].headers`
154
+
155
+ - Type: `readonly string[]`
156
+ - Required: no
157
+ - Default: `["authorization", "x-api-key", "x-goog-api-key", "api-key"]`
158
+
159
+ The request headers in which the Custodian puts the value in place of the Stand-in,
160
+ lowercase. A header
161
+ that frames or routes the request is refused:
162
+ `secrets[<i>].headers[<j>] "<header>" cannot carry a held secret`.
163
+
164
+ <a id="secrets-paths"></a>
165
+
166
+ ### `secrets[].paths`
167
+
168
+ - Type: `readonly string[]`
169
+ - Required: no
170
+ - Default: every path
171
+
172
+ The path prefixes to which the value may be sent, such as `/v1/messages`. Each starts with
173
+ `/`. Narrow it for a gateway key that can reach admin routes, such as a
174
+ LiteLLM key that can make new keys. The Agent could take away a key made that way.
175
+
176
+ <a id="git"></a>
177
+
178
+ ## `git`
179
+
180
+ - Type: `GitConfig`
181
+ - Required: no
182
+
183
+ How the cluster authenticates to Repos, and the fence that a per-run url must pass. It is not
184
+ a list of Repos: a Machine names its Repos in the Repo Slots of its `workspace()`. See
185
+ `GitConfig`.
186
+
187
+ <a id="git-credentials"></a>
188
+
189
+ ### `git.credentials`
190
+
191
+ - Type: `readonly GitCredential[]`
192
+ - Required: no
193
+
194
+ The credential entries, matched by prefix on the Repo identity. The longest `match` wins; on a
195
+ tie, the first entry in the list wins.
196
+
197
+ The list is also a fence. A per-run url, which comes from the run input, must match an entry,
198
+ or the Sandbox refuses it when it attaches the Repo:
199
+ `Sandbox "<name>" refuses the per-run repo <url> for slot "<slot>": no git.credentials entry matches "<identity>"`.
200
+ Thus a run cannot spend this cluster's credentials against any host. A url that a Machine
201
+ binds needs no entry. When no entry matches it, it clones with no credential.
202
+
203
+ Each entry is checked when the config loads:
204
+ `<file> at git.credentials[<i>]<path>: <problem>`, followed by the shape of an entry.
205
+
206
+ <a id="git-credentials-match"></a>
207
+
208
+ ### `git.credentials[].match`
209
+
210
+ - Type: `string`
211
+ - Required: yes
212
+
213
+ The Repos this entry is for: a prefix of a Repo's identity, such as `github.com/ourorg/`, or
214
+ `*` for every Repo. The identity of a Repo is its host and path with no scheme, user or `.git`.
215
+ When more than one entry matches, the longest `match` wins; on a tie, the first entry in the
216
+ list wins.
217
+
218
+ <a id="git-credentials-token"></a>
219
+
220
+ ### `git.credentials[].token`
221
+
222
+ - Type: `string`
223
+ - Required: no
224
+
225
+ For an `https://` url: the name of the env var that holds a token, read from the shell or
226
+ `.env` when `jr2 up` runs. `jr2 up` writes the value into a Secret (`jr2-git-<hash>`) that only
227
+ the Repo cache agent reads. The Agent never sees it.
228
+
229
+ <a id="git-credentials-sshkey"></a>
230
+
231
+ ### `git.credentials[].sshKey`
232
+
233
+ - Type: `string`
234
+ - Required: no
235
+
236
+ For an ssh url: the name of a Secret that you create. It holds a deploy key under the Flux
237
+ key names `identity`, `identity.pub` and `known_hosts`.
238
+
239
+ <a id="git-credentials-push"></a>
240
+
241
+ ### `git.credentials[].push`
242
+
243
+ - Type: `object`
244
+ - Required: no
245
+ - Default: the clone credential pushes
246
+
247
+ The credential that a `push()` Effect uses, when it is not the clone credential. Write
248
+ `{ sshKey }` or `{ token }`. An entry with no credential
249
+ admits a clone and never a push. When the push finds no usable credential, it is refused, for
250
+ example: `no git.credentials entry matches "<identity>" — a push spends the entry its url
251
+ matches`, or `git.credentials entry "<match>" holds no credential a push over <scheme> can
252
+ spend`.
253
+
254
+ It is one of these objects:
255
+
256
+ - Form 1: `sshKey`
257
+ - `sshKey`, `string`: For an ssh url: the name of a Secret that you create, with the same keys as the entry's `sshKey`.
258
+ - Form 2: `token`
259
+ - `token`, `string`: For an `https://` url: the name of the env var that holds the push token, read as for the entry's `token`.
260
+
261
+ <a id="git-credentials-sign"></a>
262
+
263
+ ### `git.credentials[].sign`
264
+
265
+ - Type: `object`
266
+ - Required: no
267
+
268
+ The key that a `push({ sign: true })` signs with, and the committer it signs as:
269
+ `{ sshKey, name, email }` or `{ gpgKey, name, email }`. `sshKey` names a Secret with
270
+ `identity`. `gpgKey` names a Secret with `private.asc` and no passphrase. jr2 never signs with
271
+ the clone or push key, so name the signing key here. The email must belong to the forge account
272
+ that holds the key, or the forge shows the signature as unverified. A signed push without it is
273
+ refused: `signed, and git.credentials entry "<match>" holds no sign field`.
274
+
275
+ It is one of these objects:
276
+
277
+ - Form 1: `sshKey`, `name`, `email`
278
+ - `sshKey`, `string`: The name of a Secret that you create, which holds the ssh signing key under `identity`.
279
+ - `name`, `string`: The committer's name on the signed commit.
280
+ - `email`, `string`: The committer's email. It must belong to the forge account that holds the key.
281
+ - Form 2: `gpgKey`, `name`, `email`
282
+ - `gpgKey`, `string`: The name of a Secret that you create, which holds the GPG signing key under `private.asc`, with no passphrase.
283
+ - `name`, `string`: The committer's name on the signed commit.
284
+ - `email`, `string`: The committer's email. It must belong to the forge account that holds the key.
285
+
286
+ <a id="git-credentials-committer"></a>
287
+
288
+ ### `git.credentials[].committer`
289
+
290
+ - Type: `object`
291
+ - Required: no
292
+
293
+ Who commits an unsigned `push({ squash: true })`: `{ name, email }`. The squashed commit is
294
+ new, so it needs a committer. Its date comes from the Effector's clock, and its author stays
295
+ the Agent. A signed push is committed by the signer, so it does not read this field. A squashed
296
+ push with neither field is refused: `squashed without sign, and git.credentials entry "<match>"
297
+ holds neither sign nor committer`.
298
+
299
+ <a id="git-credentials-committer-name"></a>
300
+
301
+ ### `git.credentials[].committer.name`
302
+
303
+ - Type: `string`
304
+ - Required: yes
305
+
306
+ The committer's name on the squashed commit.
307
+
308
+ <a id="git-credentials-committer-email"></a>
309
+
310
+ ### `git.credentials[].committer.email`
311
+
312
+ - Type: `string`
313
+ - Required: yes
314
+
315
+ The committer's email on the squashed commit.
316
+
317
+ <a id="harness"></a>
318
+
319
+ ## `harness`
320
+
321
+ - Type: `HarnessConfig`
322
+ - Required: no
323
+
324
+ What the Harness can reach: a custom model provider, gateways for catalog providers, env
325
+ vars, and CAs. See `HarnessConfig`.
326
+
327
+ <a id="harness-provider"></a>
328
+
329
+ ### `harness.provider`
330
+
331
+ - Type: `HarnessProvider`
332
+ - Required: no
333
+ - Default: none; the Agents use catalog providers only
334
+
335
+ A custom model provider, such as a vLLM or Ollama endpoint. See `HarnessProvider`.
336
+
337
+ <a id="harness-provider-id"></a>
338
+
339
+ ### `harness.provider.id`
340
+
341
+ - Type: `string`
342
+ - Required: yes
343
+
344
+ The provider id that model names start with: `vllm` in `vllm/Qwen/Qwen3-32B`. It must not
345
+ also be a key of `harness.catalog`:
346
+ `harness.catalog.<id>: "<id>" is also harness.provider.id — a custom provider owns its own baseUrl`.
347
+
348
+ <a id="harness-provider-api"></a>
349
+
350
+ ### `harness.provider.api`
351
+
352
+ - Type: `string`
353
+ - Required: yes
354
+
355
+ The wire protocol. The only value is `"openai-completions"`, which most OpenAI-compatible
356
+ endpoints speak, such as vLLM and Ollama. `jr2 up` refuses any other value before it builds or
357
+ applies anything:
358
+ `refusing: harness.provider.api is "<api>" — the Harness speaks: openai-completions (ADR-0018)`.
359
+
360
+ <a id="harness-provider-baseurl"></a>
361
+
362
+ ### `harness.provider.baseUrl`
363
+
364
+ - Type: `string`
365
+ - Required: yes
366
+
367
+ The endpoint's URL. The pods must reach it: `localhost` never works, and a LAN address works
368
+ on kind. It changes between deployments, so read it from `process.env` (`.env`). `jr2 up`
369
+ checks from inside the cluster that the endpoint answers.
370
+
371
+ <a id="harness-provider-apikey"></a>
372
+
373
+ ### `harness.provider.apiKey`
374
+
375
+ - Type: `string`
376
+ - Required: no
377
+ - Default: none, for an endpoint that needs no key
378
+
379
+ The API key, when the endpoint needs one. Read it from `process.env`. It is a Held secret,
380
+ `JR2_PROVIDER_API_KEY`: `jr2 up` gives the value to the Custodian only, bound to the host of
381
+ `baseUrl`, and the Harness process holds only its secret Stand-in. Thus `baseUrl` must be
382
+ `https://` when you set it:
383
+ `harness.provider.apiKey is set, and harness.provider.baseUrl is not https://`.
384
+
385
+ <a id="harness-provider-contextwindow"></a>
386
+
387
+ ### `harness.provider.contextWindow`
388
+
389
+ - Type: `number`
390
+ - Required: no
391
+
392
+ The context window, in tokens, of each model of this provider that `models` does not set.
393
+ Set it here or in `models`: a limit that nothing sets is 0, and then Compaction has no context
394
+ budget.
395
+
396
+ <a id="harness-provider-maxtokens"></a>
397
+
398
+ ### `harness.provider.maxTokens`
399
+
400
+ - Type: `number`
401
+ - Required: no
402
+ - Default: no limit is sent
403
+
404
+ The most output tokens in one completion, for each model of this provider that `models` does
405
+ not set.
406
+
407
+ <a id="harness-provider-models"></a>
408
+
409
+ ### `harness.provider.models`
410
+
411
+ - Type: `Record<string, HarnessProviderModel>`
412
+ - Required: no
413
+
414
+ Token limits for each model, keyed by the model id after the provider prefix: the key for
415
+ `vllm/Qwen/Qwen3-32B` is `"Qwen/Qwen3-32B"`. A limit set here wins over the provider's.
416
+
417
+ <a id="harness-provider-models-name-contextwindow"></a>
418
+
419
+ ### `harness.provider.models.<name>.contextWindow`
420
+
421
+ - Type: `number`
422
+ - Required: no
423
+ - Default: the provider's `contextWindow`
424
+
425
+ The model's context window, in tokens (vLLM: `max_model_len`).
426
+
427
+ <a id="harness-provider-models-name-maxtokens"></a>
428
+
429
+ ### `harness.provider.models.<name>.maxTokens`
430
+
431
+ - Type: `number`
432
+ - Required: no
433
+ - Default: the provider's `maxTokens`
434
+
435
+ The most output tokens in one completion.
436
+
437
+ <a id="harness-catalog"></a>
438
+
439
+ ### `harness.catalog`
440
+
441
+ - Type: `Readonly<Record<string, CatalogReach>>`
442
+ - Required: no
443
+ - Default: each provider's own endpoint
444
+
445
+ Catalog providers whose calls go to another endpoint, such as a gateway, keyed by the catalog
446
+ provider id: `anthropic`, `openai`, and so on. See `CatalogReach`. A key that is not a
447
+ catalog provider with a known model key is refused:
448
+ `harness.catalog.<id>: "<id>" is not a pi catalog provider jr2 knows a key for`.
449
+
450
+ <a id="harness-catalog-name-baseurl"></a>
451
+
452
+ ### `harness.catalog.<name>.baseUrl`
453
+
454
+ - Type: `string`
455
+ - Required: yes
456
+
457
+ The whole base URL that the provider's API adds its paths to: `https://litellm.corp.example`
458
+ for `anthropic`, which adds `/v1/messages`; `https://litellm.corp.example/v1` for `openai`. It
459
+ must be `https://`: `harness.catalog.<id>.baseUrl must be an https:// URL`. It changes between
460
+ deployments, so read it from `process.env` (`.env`).
461
+
462
+ <a id="harness-env"></a>
463
+
464
+ ### `harness.env`
465
+
466
+ - Type: `readonly HarnessEnvVar[]`
467
+ - Required: no
468
+
469
+ Env vars for the Harness container. The Agent can read every one of them, so do not put a
470
+ credential here. A known model key is refused here. Put it in the top-level `secrets` list.
471
+ The Harness process gets each one, except a name that loads code from a path, such as
472
+ `NODE_OPTIONS` or `LD_PRELOAD`, and `HOME`, which is its own; the Agent's programs get each
473
+ one. A name that starts with `JR2_` is jr2's own, and is refused. A credential file that the
474
+ Harness process reads, such as `AWS_CONFIG_FILE`, is refused in a folder that the Agent's code
475
+ writes (`/work`, `/tmp`, `/home/jr2`), and gives a warning anywhere else.
476
+ See `HarnessEnvVar`.
477
+
478
+ <a id="harness-env-name"></a>
479
+
480
+ ### `harness.env[].name`
481
+
482
+ - Type: `string`
483
+ - Required: yes
484
+
485
+ The env var's name. A known model key name, such as `ANTHROPIC_API_KEY`, is refused:
486
+ `harness.env[<i>] sets <NAME>, a model key the Agent could read and take out of the pod — hold it instead`.
487
+
488
+ <a id="harness-env-value"></a>
489
+
490
+ ### `harness.env[].value`
491
+
492
+ - Type: `string`
493
+ - Required: no
494
+
495
+ The value, usually read from `process.env`. `jr2 up` writes it into a Secret of the Instance.
496
+ Write `value` or `valueFrom`.
497
+
498
+ <a id="harness-env-valuefrom"></a>
499
+
500
+ ### `harness.env[].valueFrom`
501
+
502
+ - Type: `Record<string, unknown>`
503
+ - Required: no
504
+
505
+ Or a Kubernetes `valueFrom` reference, such as `{ secretKeyRef: { name, key } }`, given to the
506
+ pod as it is. A reference to a Secret of the kit is refused:
507
+ `harness.env[<i>] (<NAME>) reads Secret "<name>", which is the kit's and never the Harness's`.
508
+
509
+ <a id="harness-envfrom"></a>
510
+
511
+ ### `harness.envFrom`
512
+
513
+ - Type: `readonly HarnessEnvFromSource[]`
514
+ - Required: no
515
+
516
+ Secrets and ConfigMaps that you manage, whose keys all become env vars of the Harness
517
+ process and of the Agent's programs, as `env` does. In the container's spec each key has the
518
+ prefix `JR2_ENVFROM_`, so that the Harness can tell jr2's names from the image's; the Harness
519
+ removes it. A key that starts with `JR2_` is refused: `jr2 up` refuses it, and the Harness does
520
+ not start with one. See `HarnessEnvFromSource`.
521
+
522
+ <a id="harness-envfrom-prefix"></a>
523
+
524
+ ### `harness.envFrom[].prefix`
525
+
526
+ - Type: `string`
527
+ - Required: no
528
+ - Default: none
529
+
530
+ Text put before each key's name, as Kubernetes does.
531
+
532
+ <a id="harness-envfrom-secretref"></a>
533
+
534
+ ### `harness.envFrom[].secretRef`
535
+
536
+ - Type: `object`
537
+ - Required: no
538
+
539
+ A Secret that you manage, by name: `{ name }`. `jr2 up` checks that it exists.
540
+
541
+ <a id="harness-envfrom-secretref-name"></a>
542
+
543
+ ### `harness.envFrom[].secretRef.name`
544
+
545
+ - Type: `string`
546
+ - Required: yes
547
+
548
+ The name of the Secret.
549
+
550
+ <a id="harness-envfrom-configmapref"></a>
551
+
552
+ ### `harness.envFrom[].configMapRef`
553
+
554
+ - Type: `object`
555
+ - Required: no
556
+
557
+ A ConfigMap that you manage, by name: `{ name }`.
558
+
559
+ <a id="harness-envfrom-configmapref-name"></a>
560
+
561
+ ### `harness.envFrom[].configMapRef.name`
562
+
563
+ - Type: `string`
564
+ - Required: yes
565
+
566
+ The name of the ConfigMap.
567
+
568
+ <a id="harness-cabundle"></a>
569
+
570
+ ### `harness.caBundle`
571
+
572
+ - Type: `string`
573
+ - Required: no
574
+
575
+ A path to a PEM CA bundle, relative to the Instance folder. An example is the CA of an
576
+ internal endpoint in front of a LAN vLLM. Commit the file: CA certificates are public. `jr2 up`
577
+ puts it in the `jr2-ca` ConfigMap and uses it when it checks the provider. The Harness
578
+ container trusts it, and so does the Custodian when it verifies a host that a Held secret is
579
+ bound to.
580
+
581
+ <a id="sandbox"></a>
582
+
583
+ ## `sandbox`
584
+
585
+ - Type: `SandboxConfig`
586
+ - Required: no
587
+ - Default: a Sandbox runs wherever an ordinary pod runs, at the kit's Size
588
+
589
+ Which nodes are Sandbox nodes, and the Size of a Workspace that states none. See `SandboxConfig`.
590
+
591
+ <a id="sandbox-nodeselector"></a>
592
+
593
+ ### `sandbox.nodeSelector`
594
+
595
+ - Type: `Readonly<Record<string, string>>`
596
+ - Required: no
597
+ - Default: none
598
+
599
+ The pod's `nodeSelector`: a Sandbox node must have every one of these labels.
600
+
601
+ <a id="sandbox-tolerations"></a>
602
+
603
+ ### `sandbox.tolerations`
604
+
605
+ - Type: `readonly Toleration[]`
606
+ - Required: no
607
+ - Default: none
608
+
609
+ The pod's `tolerations`, as you write them. jr2 adds no `tolerationSeconds`.
610
+ Thus a tolerated `NoExecute` taint keeps a Sandbox on its node while its Lease is renewed.
611
+
612
+ <a id="sandbox-tolerations-key"></a>
613
+
614
+ ### `sandbox.tolerations[].key`
615
+
616
+ - Type: `string`
617
+ - Required: no
618
+
619
+ The taint key. Leave it out, with `operator: "Exists"`, to tolerate every taint.
620
+
621
+ <a id="sandbox-tolerations-operator"></a>
622
+
623
+ ### `sandbox.tolerations[].operator`
624
+
625
+ - Type: `"Exists" | "Equal"`
626
+ - Required: no
627
+ - Default: `"Equal"`
628
+
629
+ `"Equal"` matches a taint whose value is `value`; `"Exists"` matches any value.
630
+
631
+ <a id="sandbox-tolerations-value"></a>
632
+
633
+ ### `sandbox.tolerations[].value`
634
+
635
+ - Type: `string`
636
+ - Required: no
637
+
638
+ The taint value, for `operator: "Equal"`.
639
+
640
+ <a id="sandbox-tolerations-effect"></a>
641
+
642
+ ### `sandbox.tolerations[].effect`
643
+
644
+ - Type: `"NoSchedule" | "PreferNoSchedule" | "NoExecute"`
645
+ - Required: no
646
+ - Default: every effect
647
+
648
+ The taint effect to tolerate: `"NoSchedule"`, `"PreferNoSchedule"` or `"NoExecute"`.
649
+
650
+ <a id="sandbox-tolerations-tolerationseconds"></a>
651
+
652
+ ### `sandbox.tolerations[].tolerationSeconds`
653
+
654
+ - Type: `number`
655
+ - Required: no
656
+ - Default: the pod stays
657
+
658
+ For `"NoExecute"`: how many seconds the pod stays on the node after the taint is added.
659
+
660
+ <a id="sandbox-resources"></a>
661
+
662
+ ### `sandbox.resources`
663
+
664
+ - Type: [`Size`](authoring-surface/type-size.md)
665
+ - Required: no
666
+ - Default: the kit default, memory `2Gi` and cpu `1`
667
+
668
+ The Size of a Workspace that states no Size at all: `{ limits: { memory, cpu } }` and nothing
669
+ else. The kit default fills a field that it leaves out. It never changes a Size that a Machine
670
+ states: to change that, use `customize(machine, { resources })`. jr2 reserves the whole Size and enforces the cpu limit. See
671
+ [`Size`](authoring-surface/type-size.md) for the refusals, such as
672
+ `<file> at sandbox.resources.requests is not accepted`.
673
+
674
+ <a id="priorityclasses"></a>
675
+
676
+ ## `priorityClasses`
677
+
678
+ - Type: `PriorityClasses`
679
+ - Required: no
680
+
681
+ Existing PriorityClasses to use in place of the two that `jr2 up` creates. See
682
+ `PriorityClasses`.
683
+
684
+ <a id="priorityclasses-control"></a>
685
+
686
+ ### `priorityClasses.control`
687
+
688
+ - Type: `string`
689
+ - Required: no
690
+ - Default: `jr2-control`, which `jr2 up` creates
691
+
692
+ An existing PriorityClass for the Orchestrator, the operator and the Repo cache agent.
693
+
694
+ <a id="priorityclasses-sandbox"></a>
695
+
696
+ ### `priorityClasses.sandbox`
697
+
698
+ - Type: `string`
699
+ - Required: no
700
+ - Default: `jr2-sandbox`, which `jr2 up` creates
701
+
702
+ An existing PriorityClass for the Sandboxes and the Instance Harness.
703
+
704
+ <a id="registry"></a>
705
+
706
+ ## `registry`
707
+
708
+ - Type: `string`
709
+ - Required: no
710
+ - Default: none; `jr2 up` loads the images into the kind cluster
711
+
712
+ The image registry prefix to which `jr2 up` pushes the images that it builds, such as
713
+ `registry.example.com/team`. It changes between deployments, so read it from `process.env`
714
+ (`.env`). On a cluster that is
715
+ not kind, `jr2 up` then refuses:
716
+ `` context <context> is not a kind cluster and no `registry` is configured ``.
717
+
718
+ <a id="kitregistry"></a>
719
+
720
+ ## `kitRegistry`
721
+
722
+ - Type: `string`
723
+ - Required: no
724
+ - Default: none; the cluster pulls from the canonical home, `ghcr.io/snapwich/jr2-harness:<version>` and the others
725
+
726
+ The registry from which this cluster pulls the published Kit images: a mirror for a cluster
727
+ that is self-hosted, air-gapped, or mirror-only. Set, the cluster pulls
728
+ the same tags from `<kitRegistry>/jr2-harness:<version>`. Fill the mirror with
729
+ `jr2 kit push <registry>`; `jr2 up` never pushes to it. Read it from `process.env` (`.env`).
730
+
731
+ <a id="platforms"></a>
732
+
733
+ ## `platforms`
734
+
735
+ - Type: `readonly string[]`
736
+ - Required: no
737
+ - Default: the platforms of the cluster's schedulable nodes that the kit releases images for
738
+
739
+ The platforms for which `jr2 up` builds its images, as docker platform strings, such as
740
+ `["linux/arm64"]`. `jr2 up` reports a node platform that it skips.
741
+
742
+ Set it when the nodes cannot tell. One case is a node group that scales up from zero. Another
743
+ is a set of nodes that need no image, such as an amd64 GPU group beside arm64 nodes. When you
744
+ set it, it replaces the default. It adds to nothing and removes from nothing. The kit releases
745
+ images for `linux/amd64` and `linux/arm64` only, so `jr2 up` refuses any other:
746
+ `` `platforms` names <platforms> — the kit releases images for linux/amd64, linux/arm64 and nothing else ``.
747
+
748
+ <a id="operator"></a>
749
+
750
+ ## `operator`
751
+
752
+ - Type: `object`
753
+ - Required: no
754
+
755
+ Settings of the operator layer, for kit development.
756
+
757
+ <a id="operator-manage"></a>
758
+
759
+ ### `operator.manage`
760
+
761
+ - Type: `boolean`
762
+ - Required: no
763
+ - Default: `true`
764
+
765
+ `false`: `jr2 up` does not converge the operator, and you run its controller yourself.