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