@kitman-sh/sdk 0.8.0 → 0.10.52

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 (63) hide show
  1. package/dist/build/index.js +531 -116
  2. package/dist/{chunk-36jhc745.js → chunk-tcbgb4wm.js} +1841 -1574
  3. package/dist/{chunk-160ww64c.js → chunk-zvzw3zs4.js} +939 -535
  4. package/dist/loop/index.js +117 -3
  5. package/dist/program/index.js +10 -6
  6. package/package.json +6 -6
  7. package/types/packages/core/src/agent-capabilities.d.ts +6 -0
  8. package/types/packages/core/src/agent-environment.d.ts +32 -216
  9. package/types/packages/core/src/agent-sandbox-policy.d.ts +17 -3
  10. package/types/packages/core/src/change-request-review.d.ts +20 -5
  11. package/types/packages/core/src/change-request.d.ts +33 -208
  12. package/types/packages/core/src/crypto.d.ts +2 -0
  13. package/types/packages/core/src/index.d.ts +8 -4
  14. package/types/packages/core/src/{package-declarations.d.ts → kit-declarations.d.ts} +84 -180
  15. package/types/packages/core/src/kit-install.d.ts +130 -0
  16. package/types/packages/core/src/kit-setup.d.ts +316 -0
  17. package/types/packages/core/src/kit.d.ts +302 -1444
  18. package/types/packages/core/src/loop-layers.d.ts +33 -4
  19. package/types/packages/core/src/loop.d.ts +325 -55
  20. package/types/packages/core/src/marketplace.d.ts +51 -10
  21. package/types/packages/core/src/my-teams.d.ts +135 -20
  22. package/types/packages/core/src/network-host.d.ts +41 -0
  23. package/types/packages/core/src/notification.d.ts +8 -0
  24. package/types/packages/core/src/npm-registry.d.ts +65 -0
  25. package/types/packages/core/src/proposal.d.ts +0 -76
  26. package/types/packages/core/src/push.d.ts +68 -0
  27. package/types/packages/core/src/question-recommendation.d.ts +28 -0
  28. package/types/packages/core/src/redaction.d.ts +15 -3
  29. package/types/packages/core/src/resource-claim.d.ts +79 -0
  30. package/types/packages/core/src/run-display.d.ts +7 -1
  31. package/types/packages/core/src/run-graph.d.ts +1 -1
  32. package/types/packages/core/src/run-launch.d.ts +15 -2
  33. package/types/packages/core/src/run-queue.d.ts +28 -0
  34. package/types/packages/core/src/runner-eligibility.d.ts +21 -2
  35. package/types/packages/core/src/runner.d.ts +46 -15
  36. package/types/packages/core/src/secret.d.ts +18 -1
  37. package/types/packages/core/src/step-brief.d.ts +21 -7
  38. package/types/packages/core/src/sync-kit.d.ts +8 -0
  39. package/types/packages/core/src/task-detail.d.ts +15 -2
  40. package/types/packages/core/src/task.d.ts +9 -0
  41. package/types/packages/core/src/transcript.d.ts +24 -4
  42. package/types/packages/core/src/trust-panel.d.ts +1 -1
  43. package/types/packages/core/src/waiting-on.d.ts +14 -0
  44. package/types/packages/core/src/work-unit.d.ts +339 -8
  45. package/types/packages/live/src/rpc/runner-client.d.ts +1229 -566
  46. package/types/packages/live/src/rpc/runner-group.d.ts +2851 -441
  47. package/types/packages/sdk/src/build/index.d.ts +45 -9
  48. package/types/packages/sdk/src/loop/activities.d.ts +382 -2
  49. package/types/packages/sdk/src/loop/claims.d.ts +57 -0
  50. package/types/packages/sdk/src/loop/config.d.ts +38 -31
  51. package/types/packages/sdk/src/loop/continuing.d.ts +22 -0
  52. package/types/packages/sdk/src/loop/define.d.ts +30 -5
  53. package/types/packages/sdk/src/loop/evidence.d.ts +18 -3
  54. package/types/packages/sdk/src/loop/index.d.ts +4 -0
  55. package/types/packages/sdk/src/loop/measure.d.ts +132 -0
  56. package/types/packages/sdk/src/loop/plan.d.ts +2 -2
  57. package/types/packages/sdk/src/loop/steps.d.ts +127 -17
  58. package/types/packages/sdk/src/loop/sync.d.ts +53 -0
  59. package/types/packages/sdk/src/loop/test-loop.d.ts +25 -5
  60. package/types/packages/sdk/src/program/engine.d.ts +116 -17
  61. package/types/packages/sdk/src/program/host.d.ts +200 -38
  62. package/types/packages/core/src/engineering-resources.d.ts +0 -24
  63. package/types/packages/core/src/package.d.ts +0 -369
@@ -1,283 +1,406 @@
1
1
  // @bun
2
2
  import {
3
- AgentSandboxNetwork,
4
3
  Numeric,
5
4
  isWholeNumber,
6
5
  guard,
7
6
  Id,
8
7
  Timestamp,
9
- LoopStepOutput,
10
- StepBrief,
11
8
  LoopManifest,
9
+ capabilitiesOf2,
12
10
  ManifestInvalid2,
13
11
  loopManifest2,
12
+ questionAdvice,
14
13
  StepFailed2,
15
- agentWorkDeferred2,
16
14
  answerDeferred2,
17
15
  childDeferred2,
18
16
  eventDeferred2,
19
17
  verifyDeferred2,
18
+ ResourceName,
19
+ claimDeferred2,
20
+ letGoDeferred2,
21
+ WorkUnitRepoBinding,
22
+ ProgramWorkUnit,
23
+ ApprovedCheck,
24
+ MeasurePlan2,
25
+ WorkUnitClaimResult,
26
+ WorkUnitClaimInput,
27
+ WorkUnitHeartbeatInput,
28
+ WorkUnitHeartbeatResult,
29
+ WorkUnitReleaseInput,
30
+ WorkUnitCompletion,
31
+ measureDeferred2,
20
32
  loopWorkflow2,
21
33
  executeLoop2,
22
34
  LoopCheckError2,
23
35
  checkLoop2
24
- } from "./chunk-36jhc745.js";
25
- // packages/core/src/repo-binding.ts
36
+ } from "./chunk-tcbgb4wm.js";
37
+ // packages/core/src/agent-environment.ts
26
38
  import * as Schema from "effect/Schema";
27
- var ForgeKinds = ["github", "gitlab", "forgejo", "gitea", "gitee", "bitbucket", "azure-devops"];
28
- var ForgeKind = Schema.Literals(ForgeKinds);
29
- var RepoBindingProviders = [...ForgeKinds, "generic_git"];
30
- var RepoBindingPathPrefixPattern = "^(?!/)(?!.*\\\\)(?!.*(?:^|/)\\.\\.?(?:/|$))(?!.*//)\\S+$";
31
- var RepoBindingProvider = Schema.Literals(RepoBindingProviders);
32
- var RepoBindingStatus = Schema.Union([Schema.Literal("active"), Schema.Literal("disabled")]);
33
- var RepoBindingCredentialProviderType = Schema.Union([
34
- Schema.Literal("env"),
35
- Schema.Literal("file"),
36
- Schema.Literal("exec")
39
+ var AgentEnvironmentPolicy = Schema.Union([Schema.Literal("recommended"), Schema.Literal("required")]);
40
+ var AgentHarnessId = Schema.Union([
41
+ Schema.Literal("opencode"),
42
+ Schema.Literal("claude-code"),
43
+ Schema.Literal("codex"),
44
+ Schema.Literal("pi")
37
45
  ]);
38
- var RepoBindingAccessMode = Schema.Union([
39
- Schema.Literal("local_checkout"),
40
- Schema.Literal("managed_clone"),
41
- Schema.Literal("runner_secret_provider")
46
+ var Sha256 = Schema.String.check(Schema.isPattern(new RegExp("^[a-fA-F0-9]{64}$", "u")));
47
+ var relativePathPattern = "^(?!/)(?!.*\\\\)(?!.*//)(?!.*(?:^|/)\\.\\.?($|/)).+$";
48
+ var SourcePath = Schema.String.check(Schema.isMinLength(1), Schema.isPattern(new RegExp(relativePathPattern, "u")));
49
+ var SkillSource = Schema.Union([
50
+ Schema.Struct({
51
+ kind: Schema.Literal("skills_sh"),
52
+ slug: Schema.String.check(Schema.isMinLength(1)),
53
+ version: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
54
+ }),
55
+ Schema.Struct({
56
+ kind: Schema.Literal("kitman"),
57
+ skillId: Schema.optionalKey(Id),
58
+ name: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1))),
59
+ contentMarkdown: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1))),
60
+ files: Schema.optionalKey(Schema.Record(SourcePath, Schema.String))
61
+ }),
62
+ Schema.Struct({
63
+ kind: Schema.Literal("git"),
64
+ url: Schema.String.check(Schema.isMinLength(1)),
65
+ ref: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1))),
66
+ path: Schema.optionalKey(SourcePath),
67
+ sha256: Schema.optionalKey(Sha256)
68
+ }),
69
+ Schema.Struct({
70
+ kind: Schema.Literal("package"),
71
+ packageName: Schema.String.check(Schema.isMinLength(1)),
72
+ version: Schema.String.check(Schema.isMinLength(1)),
73
+ path: Schema.optionalKey(SourcePath),
74
+ sha256: Schema.optionalKey(Sha256)
75
+ }),
76
+ Schema.Struct({ kind: Schema.Literal("url"), url: Schema.String.check(Schema.isMinLength(1)), sha256: Sha256 }),
77
+ Schema.Struct({ kind: Schema.Literal("local_path"), path: Schema.String.check(Schema.isMinLength(1)) })
42
78
  ]);
43
- var RepoBindingCredentialRef = Schema.Union([
44
- Schema.Struct({ kind: Schema.Literal("none") }),
45
- Schema.Struct({ kind: Schema.Literal("local_env"), envName: Schema.String.check(Schema.isMinLength(1)) }),
79
+ var PluginSource = Schema.Union([
46
80
  Schema.Struct({
81
+ kind: Schema.Literal("package"),
82
+ packageName: Schema.String.check(Schema.isMinLength(1)),
83
+ version: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
84
+ }),
85
+ Schema.Struct({
86
+ kind: Schema.Literal("git"),
87
+ url: Schema.String.check(Schema.isMinLength(1)),
88
+ ref: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
89
+ }),
90
+ Schema.Struct({
91
+ kind: Schema.Literal("url"),
92
+ url: Schema.String.check(Schema.isMinLength(1)),
93
+ sha256: Schema.String.check(Schema.isPattern(new RegExp("^[a-fA-F0-9]{64}$", "u")))
94
+ }),
95
+ Schema.Struct({ kind: Schema.Literal("local_path"), path: Schema.String.check(Schema.isMinLength(1)) })
96
+ ]);
97
+ var McpServerTransport = Schema.Union([
98
+ Schema.Struct({
99
+ kind: Schema.Literal("stdio"),
100
+ command: Schema.String.check(Schema.isMinLength(1)),
101
+ args: Schema.optionalKey(Schema.Array(Schema.String)),
102
+ env: Schema.optionalKey(Schema.Record(Schema.String, Schema.String))
103
+ }),
104
+ Schema.Struct({
105
+ kind: Schema.Literal("streamable_http"),
106
+ url: Schema.String.check(Schema.isMinLength(1)),
107
+ headers: Schema.optionalKey(Schema.Record(Schema.String, Schema.String))
108
+ })
109
+ ]);
110
+ var ProviderAuthRef = Schema.Union([
111
+ Schema.Struct({
112
+ provider: Schema.String.check(Schema.isMinLength(1)),
113
+ policy: AgentEnvironmentPolicy,
114
+ kind: Schema.Literal("existing_harness_login"),
115
+ accountHint: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
116
+ }),
117
+ Schema.Struct({
118
+ provider: Schema.String.check(Schema.isMinLength(1)),
119
+ policy: AgentEnvironmentPolicy,
120
+ kind: Schema.Literal("local_env"),
121
+ envName: Schema.String.check(Schema.isMinLength(1))
122
+ }),
123
+ Schema.Struct({
124
+ provider: Schema.String.check(Schema.isMinLength(1)),
125
+ policy: AgentEnvironmentPolicy,
47
126
  kind: Schema.Literal("runner_secret"),
48
- runnerSecretName: Schema.String.check(Schema.isMinLength(1)),
49
- providerType: RepoBindingCredentialProviderType
127
+ runnerSecretName: Schema.String.check(Schema.isMinLength(1))
50
128
  }),
51
- Schema.Struct({ kind: Schema.Literal("ssh_agent") })
129
+ Schema.Struct({
130
+ provider: Schema.String.check(Schema.isMinLength(1)),
131
+ policy: AgentEnvironmentPolicy,
132
+ kind: Schema.Literal("managed_oauth"),
133
+ grantId: Schema.optionalKey(Id)
134
+ })
52
135
  ]);
53
- var RepoBinding = Schema.Struct({
54
- id: Id,
55
- workspaceId: Id,
56
- teamId: Schema.optionalKey(Id),
57
- provider: RepoBindingProvider,
58
- host: Schema.String.check(Schema.isMinLength(1)),
59
- owner: Schema.String.check(Schema.isMinLength(1)),
136
+ var RunnerSecretSource = Schema.Union([
137
+ Schema.Struct({ kind: Schema.Literal("env"), envName: Schema.String.check(Schema.isMinLength(1)) }),
138
+ Schema.Struct({ kind: Schema.Literal("file"), pathRef: Schema.String.check(Schema.isMinLength(1)) }),
139
+ Schema.Struct({ kind: Schema.Literal("exec"), commandRef: Schema.String.check(Schema.isMinLength(1)) })
140
+ ]);
141
+ var RunnerSecretRef = Schema.Struct({
60
142
  name: Schema.String.check(Schema.isMinLength(1)),
61
- repositoryUrl: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1))),
62
- pathPrefix: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1), Schema.isPattern(new RegExp(RepoBindingPathPrefixPattern, "u")))),
63
- defaultTargetBranch: Schema.String.check(Schema.isMinLength(1)),
64
- expectedBranch: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1))),
65
- expectedCommitSha: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1))),
66
- credentialRefs: Schema.Array(RepoBindingCredentialRef),
67
- status: RepoBindingStatus,
68
- webhook: Schema.optionalKey(Schema.Struct({
69
- status: Schema.Literals(["active", "missing", "unavailable"]),
70
- message: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(240)))
71
- })),
72
- createdAt: Timestamp,
73
- updatedAt: Timestamp
143
+ policy: AgentEnvironmentPolicy,
144
+ source: RunnerSecretSource,
145
+ capabilities: Schema.optionalKey(Schema.Array(Schema.String.check(Schema.isMinLength(1))))
74
146
  });
75
- var RepoBindingCreate = Schema.Struct({
76
- teamId: Schema.optionalKey(Id),
77
- provider: RepoBindingProvider,
78
- host: Schema.String.check(Schema.isMinLength(1)),
79
- owner: Schema.String.check(Schema.isMinLength(1)),
147
+ var Patterns = Schema.Array(Schema.String.check(Schema.isMinLength(1)));
148
+ var AgentSkillRequirement = Schema.Struct({
80
149
  name: Schema.String.check(Schema.isMinLength(1)),
81
- repositoryUrl: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1))),
82
- pathPrefix: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1), Schema.isPattern(new RegExp(RepoBindingPathPrefixPattern, "u")))),
83
- defaultTargetBranch: Schema.String.check(Schema.isMinLength(1)),
84
- expectedBranch: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1))),
85
- expectedCommitSha: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1))),
86
- credentialRefs: Schema.optionalKey(Schema.Array(RepoBindingCredentialRef))
150
+ policy: AgentEnvironmentPolicy,
151
+ source: SkillSource,
152
+ appliesTo: Schema.optionalKey(Schema.Struct({ dependencies: Schema.optionalKey(Patterns), files: Schema.optionalKey(Patterns) }))
87
153
  });
88
- var RepoBindingTargetOverride = Schema.Struct({
89
- targetBranch: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
154
+ var AgentPluginRequirement = Schema.Struct({
155
+ name: Schema.String.check(Schema.isMinLength(1)),
156
+ policy: AgentEnvironmentPolicy,
157
+ sources: Schema.NonEmptyArray(PluginSource)
90
158
  });
91
- var RepoBindingList = Schema.Struct({ items: Schema.Array(RepoBinding) });
92
- var RunnerRepoBindingCapability = Schema.Struct({
93
- repoBindingId: Id,
94
- provider: RepoBindingProvider,
95
- host: Schema.String.check(Schema.isMinLength(1)),
96
- accessModes: Schema.Array(RepoBindingAccessMode),
97
- credentialProviderTypes: Schema.Array(RepoBindingCredentialProviderType),
98
- authenticated: Schema.Boolean,
99
- canPush: Schema.optionalKey(Schema.Boolean)
159
+ var AgentMcpServerRequirement = Schema.Struct({
160
+ name: Schema.String.check(Schema.isMinLength(1)),
161
+ policy: AgentEnvironmentPolicy,
162
+ transport: McpServerTransport
100
163
  });
101
-
102
- // packages/core/src/work-unit.ts
103
- import * as Schema2 from "effect/Schema";
104
- import * as Struct3 from "effect/Struct";
105
- var WorkUnitLease = Schema2.Struct({
106
- leaseOwnerId: Id,
107
- runnerReplicaId: Id,
108
- leaseId: Id,
109
- attempt: Schema2.Int.check(Schema2.isGreaterThanOrEqualTo(1)),
110
- fencingToken: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(240), Schema2.isPattern(new RegExp("^[A-Za-z0-9._:-]+$", "u"))),
111
- capacitySlot: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(240)),
112
- leaseExpiresAt: Timestamp,
113
- lastHeartbeatAt: Timestamp
164
+ var AgentHarnessSetting = Schema.Struct({
165
+ harness: AgentHarnessId,
166
+ key: Schema.String.check(Schema.isMinLength(1)),
167
+ policy: AgentEnvironmentPolicy,
168
+ value: Schema.Unknown
114
169
  });
115
- var WorkUnitLeaseProjection = Schema2.Struct(Struct3.map(WorkUnitLease.fields, Schema2.optionalKey));
116
- var WorkUnitRepoBinding = Schema2.Struct({
117
- id: Id,
118
- provider: RepoBindingProvider,
119
- host: Schema2.String.check(Schema2.isMinLength(1)),
120
- owner: Schema2.String.check(Schema2.isMinLength(1)),
121
- name: Schema2.String.check(Schema2.isMinLength(1)),
122
- repositoryUrl: Schema2.optionalKey(Schema2.String.check(Schema2.isMinLength(1))),
123
- pathPrefix: Schema2.optionalKey(Schema2.String.check(Schema2.isMinLength(1))),
124
- defaultTargetBranch: Schema2.String.check(Schema2.isMinLength(1)),
125
- expectedBranch: Schema2.optionalKey(Schema2.String.check(Schema2.isMinLength(1))),
126
- expectedCommitSha: Schema2.optionalKey(Schema2.String.check(Schema2.isMinLength(1)))
170
+ var AgentRuntimeConstraint = Schema.Struct({
171
+ key: Schema.String.check(Schema.isMinLength(1)),
172
+ policy: AgentEnvironmentPolicy,
173
+ value: Schema.Unknown
127
174
  });
128
- var WorkUnitLeaseInput = Schema2.Struct({
129
- leaseOwnerId: Id,
130
- runnerReplicaId: Id,
131
- leaseId: Id,
132
- attempt: Schema2.Int.check(Schema2.isGreaterThanOrEqualTo(1)),
133
- fencingToken: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(240), Schema2.isPattern(new RegExp("^[A-Za-z0-9._:-]+$", "u"))),
134
- capacitySlot: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(240))
175
+ var AgentPermissionRequirement = Schema.Struct({
176
+ key: Schema.String.check(Schema.isMinLength(1)),
177
+ policy: AgentEnvironmentPolicy,
178
+ value: Schema.Unknown
135
179
  });
136
- var WorkUnitStatus = Schema2.Union([
137
- Schema2.Literal("pending"),
138
- Schema2.Literal("claimed"),
139
- Schema2.Literal("running"),
140
- Schema2.Literal("waiting"),
141
- Schema2.Literal("blocked"),
142
- Schema2.Literal("completed"),
143
- Schema2.Literal("failed"),
144
- Schema2.Literal("canceled"),
145
- Schema2.Literal("expired")
146
- ]);
147
- var LoopCheckout = Schema2.Union([Schema2.Literal("none"), Schema2.Literal("read"), Schema2.Literal("write")]);
148
- var StorageOrigin = Schema2.optionalKey(Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(2048)));
149
- var AgentStepWorkUnit = Schema2.Struct({
150
- kind: Schema2.Literal("agent_step"),
151
- id: Id,
152
- teamId: Schema2.optionalKey(Id),
153
- runId: Id,
154
- stepKey: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(240)),
155
- attempt: Schema2.Int.check(Schema2.isGreaterThanOrEqualTo(1)),
156
- lease: WorkUnitLease,
157
- brief: StepBrief,
158
- stepCredential: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(512)),
159
- checkout: LoopCheckout,
160
- repoBinding: Schema2.optionalKey(WorkUnitRepoBinding),
161
- branch: Schema2.optionalKey(Schema2.String.check(Schema2.isMinLength(1))),
162
- baseRevision: Schema2.optionalKey(Schema2.String.check(Schema2.isMinLength(1))),
163
- network: Schema2.optionalKey(AgentSandboxNetwork),
164
- sandbox: Schema2.optionalKey(Schema2.Literal("docker")),
165
- secrets: Schema2.optionalKey(Schema2.Record(Schema2.String, Schema2.String)),
166
- runBaseRevision: Schema2.optionalKey(Schema2.String.check(Schema2.isMinLength(1))),
167
- storageOrigin: StorageOrigin
180
+ var AgentHookRequirement = Schema.Struct({
181
+ name: Schema.String.check(Schema.isMinLength(1)),
182
+ event: Schema.String.check(Schema.isMinLength(1)),
183
+ policy: AgentEnvironmentPolicy,
184
+ command: Schema.String.check(Schema.isMinLength(1)),
185
+ args: Schema.optionalKey(Schema.Array(Schema.String)),
186
+ timeoutMs: Schema.optionalKey(Schema.Finite.check(Schema.isGreaterThanOrEqualTo(1)))
168
187
  });
169
- var RunJournal = Schema2.Struct({
170
- activities: Schema2.Record(Schema2.String, Schema2.Unknown),
171
- deferreds: Schema2.Record(Schema2.String, Schema2.Unknown)
188
+ var AgentSandboxPolicyRequirement = Schema.Struct({
189
+ key: Schema.String.check(Schema.isMinLength(1)),
190
+ policy: AgentEnvironmentPolicy,
191
+ value: Schema.Unknown
172
192
  });
173
- var OrchestrationWorkUnit = Schema2.Struct({
174
- kind: Schema2.Literal("orchestration"),
175
- id: Id,
176
- teamId: Schema2.optionalKey(Id),
177
- runId: Id,
178
- loopDigest: Schema2.String.check(Schema2.isMinLength(64), Schema2.isMaxLength(64), Schema2.isPattern(new RegExp("^[a-f0-9]{64}$", "u"))),
179
- input: Schema2.Unknown,
180
- granted: Schema2.Array(Schema2.String),
181
- lease: WorkUnitLease,
182
- journal: RunJournal,
183
- network: Schema2.optionalKey(AgentSandboxNetwork),
184
- storageOrigin: StorageOrigin,
185
- program: Schema2.Struct({
186
- loopId: Schema2.String.check(Schema2.isMinLength(1)),
187
- credential: Schema2.String.check(Schema2.isMinLength(1))
188
- })
193
+ var AgentEnvironmentFragment = Schema.Struct({
194
+ skills: Schema.optionalKey(Schema.Array(AgentSkillRequirement)),
195
+ plugins: Schema.optionalKey(Schema.Array(AgentPluginRequirement)),
196
+ mcpServers: Schema.optionalKey(Schema.Array(AgentMcpServerRequirement)),
197
+ harnessSettings: Schema.optionalKey(Schema.Array(AgentHarnessSetting)),
198
+ providerAuthRefs: Schema.optionalKey(Schema.Array(ProviderAuthRef)),
199
+ runnerSecretRefs: Schema.optionalKey(Schema.Array(RunnerSecretRef)),
200
+ permissions: Schema.optionalKey(Schema.Array(AgentPermissionRequirement)),
201
+ hooks: Schema.optionalKey(Schema.Array(AgentHookRequirement)),
202
+ runtimeConstraints: Schema.optionalKey(Schema.Array(AgentRuntimeConstraint)),
203
+ sandboxPolicyRequirements: Schema.optionalKey(Schema.Array(AgentSandboxPolicyRequirement))
189
204
  });
190
- var ProgramWorkUnit = OrchestrationWorkUnit.mapFields(Struct3.omit(["program"]));
191
- var ApprovedCheck = Schema2.Struct({
192
- name: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(120), Schema2.isPattern(new RegExp("^[A-Za-z0-9][A-Za-z0-9._:-]*$", "u"))),
193
- command: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(2000)),
194
- workingDirectory: Schema2.optionalKey(Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(500)))
205
+ var AgentModelPreference = Schema.Struct({
206
+ harness: AgentHarnessId,
207
+ profileRef: Schema.String.check(Schema.isMinLength(1)),
208
+ provider: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1))),
209
+ model: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
195
210
  });
196
- var VerificationWorkUnit = Schema2.Struct({
197
- kind: Schema2.Literal("verification"),
198
- id: Id,
199
- teamId: Schema2.optionalKey(Id),
200
- runId: Id,
201
- stepKey: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(240)),
202
- lease: WorkUnitLease,
203
- repoBinding: WorkUnitRepoBinding,
204
- revision: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(240)),
205
- checks: Schema2.Array(ApprovedCheck).check(Schema2.isMinLength(1), Schema2.isMaxLength(50)),
206
- storageOrigin: StorageOrigin
211
+ var UserAgentPreferences = Schema.Struct({
212
+ userId: Schema.optionalKey(Id),
213
+ defaultHarness: Schema.optionalKey(AgentHarnessId),
214
+ modelPreferences: Schema.optionalKey(Schema.Array(AgentModelPreference))
215
+ });
216
+ var AgentKitSourceFields = {
217
+ kitRef: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(240))),
218
+ kitVersion: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(120))),
219
+ kitSha256: Schema.optionalKey(Schema.String.check(Schema.isMinLength(64), Schema.isMaxLength(64), Schema.isPattern(new RegExp("^[a-fA-F0-9]{64}$", "u")))),
220
+ kitActivationId: Schema.optionalKey(Id),
221
+ kitActivationType: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(80)))
222
+ };
223
+ var AgentEnvironmentSource = Schema.Union([
224
+ Schema.Struct({
225
+ kind: Schema.Literal("built_in"),
226
+ label: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
227
+ }),
228
+ Schema.Struct({
229
+ kind: Schema.Literal("user_preferences"),
230
+ userId: Id,
231
+ label: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
232
+ }),
233
+ Schema.Struct({
234
+ kind: Schema.Literal("user_kit"),
235
+ userId: Id,
236
+ kitId: Id,
237
+ ...AgentKitSourceFields,
238
+ label: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
239
+ }),
240
+ Schema.Struct({
241
+ kind: Schema.Literal("agent_sync_profile"),
242
+ profileId: Schema.optionalKey(Id),
243
+ userId: Id,
244
+ label: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
245
+ }),
246
+ Schema.Struct({
247
+ kind: Schema.Literal("device_local"),
248
+ label: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
249
+ }),
250
+ Schema.Struct({
251
+ kind: Schema.Literal("workspace_kit"),
252
+ kitId: Id,
253
+ ...AgentKitSourceFields,
254
+ label: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
255
+ }),
256
+ Schema.Struct({
257
+ kind: Schema.Literal("team_default_kit"),
258
+ teamId: Id,
259
+ kitId: Id,
260
+ ...AgentKitSourceFields,
261
+ label: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
262
+ }),
263
+ Schema.Struct({
264
+ kind: Schema.Literal("team_kit"),
265
+ kitId: Id,
266
+ ...AgentKitSourceFields,
267
+ provenance: Schema.optionalKey(Schema.Union([
268
+ Schema.Literal("explicit"),
269
+ Schema.Literal("workspace_default"),
270
+ Schema.Literal("workspace_mandatory")
271
+ ])),
272
+ policyRevision: Schema.optionalKey(Schema.Int.check(Schema.isGreaterThanOrEqualTo(1))),
273
+ label: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
274
+ }),
275
+ Schema.Struct({
276
+ kind: Schema.Literal("marketplace_kit"),
277
+ kitSourceId: Id,
278
+ kitVersionId: Schema.optionalKey(Id),
279
+ kitInstallationId: Schema.optionalKey(Id),
280
+ kitActivationId: Schema.optionalKey(Id),
281
+ label: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
282
+ }),
283
+ Schema.Struct({
284
+ kind: Schema.Literal("step_attempt_override"),
285
+ stepAttemptId: Id,
286
+ label: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
287
+ }),
288
+ Schema.Struct({
289
+ kind: Schema.Literal("command_override"),
290
+ label: Schema.optionalKey(Schema.String.check(Schema.isMinLength(1)))
291
+ })
292
+ ]);
293
+ var ResolvedAgentSkillRequirement = Schema.Struct({
294
+ item: AgentSkillRequirement,
295
+ source: AgentEnvironmentSource
207
296
  });
208
- var WorkUnit = Schema2.Union([OrchestrationWorkUnit, AgentStepWorkUnit, VerificationWorkUnit]);
209
- var WorkUnitClaimResult = Schema2.Struct({ workUnit: Schema2.optionalKey(WorkUnit) });
210
- var WorkUnitClaimInput = Schema2.Struct({
211
- teamId: Schema2.optionalKey(Id),
212
- runnerReplicaId: Id,
213
- capacitySlot: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(240)),
214
- idempotencyKey: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(240)),
215
- leaseDurationSeconds: Schema2.optionalKey(Schema2.Int.check(Schema2.isGreaterThanOrEqualTo(1), Schema2.isLessThanOrEqualTo(3600)))
297
+ var ResolvedAgentPluginRequirement = Schema.Struct({
298
+ item: AgentPluginRequirement,
299
+ source: AgentEnvironmentSource
216
300
  });
217
- var WorkUnitHeartbeatInput = Schema2.Struct({
218
- workUnitId: Id,
219
- lease: WorkUnitLeaseInput,
220
- leaseDurationSeconds: Schema2.optionalKey(Schema2.Int.check(Schema2.isGreaterThanOrEqualTo(1), Schema2.isLessThanOrEqualTo(3600)))
301
+ var ResolvedAgentMcpServerRequirement = Schema.Struct({
302
+ item: AgentMcpServerRequirement,
303
+ source: AgentEnvironmentSource
221
304
  });
222
- var WorkUnitHeartbeatResult = Schema2.Struct({
223
- settled: Schema2.Boolean,
224
- outputSubmitted: Schema2.optionalKey(Schema2.Boolean)
305
+ var ResolvedAgentHarnessSetting = Schema.Struct({ item: AgentHarnessSetting, source: AgentEnvironmentSource });
306
+ var ResolvedProviderAuthRef = Schema.Struct({ item: ProviderAuthRef, source: AgentEnvironmentSource });
307
+ var ResolvedRunnerSecretRef = Schema.Struct({ item: RunnerSecretRef, source: AgentEnvironmentSource });
308
+ var ResolvedAgentPermissionRequirement = Schema.Struct({
309
+ item: AgentPermissionRequirement,
310
+ source: AgentEnvironmentSource
225
311
  });
226
- var WorkUnitReleaseInput = Schema2.Struct({
227
- workUnitId: Id,
228
- lease: WorkUnitLeaseInput
312
+ var ResolvedAgentHookRequirement = Schema.Struct({ item: AgentHookRequirement, source: AgentEnvironmentSource });
313
+ var ResolvedAgentRuntimeConstraint = Schema.Struct({
314
+ item: AgentRuntimeConstraint,
315
+ source: AgentEnvironmentSource
229
316
  });
230
- var CheckEvidence = Schema2.Struct({
231
- name: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(120)),
232
- command: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(2000)),
233
- status: Schema2.Union([Schema2.Literal("passed"), Schema2.Literal("failed")]),
234
- exitCode: Schema2.optionalKey(Schema2.Int),
235
- durationMs: Schema2.Int.check(Schema2.isGreaterThanOrEqualTo(0)),
236
- outputTail: Schema2.String.check(Schema2.isMaxLength(8000)),
237
- fileIds: Schema2.optionalKey(Schema2.Array(Schema2.String).check(Schema2.isMaxLength(51)))
317
+ var ResolvedAgentSandboxPolicyRequirement = Schema.Struct({
318
+ item: AgentSandboxPolicyRequirement,
319
+ source: AgentEnvironmentSource
238
320
  });
239
- var TreeEvidence = Schema2.Struct({
240
- revision: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(240)),
241
- tree: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(120)),
242
- checks: Schema2.Array(CheckEvidence).check(Schema2.isMaxLength(50))
321
+ var AgentEnvironment = Schema.Struct({
322
+ harness: AgentHarnessId,
323
+ skills: Schema.Array(ResolvedAgentSkillRequirement),
324
+ plugins: Schema.Array(ResolvedAgentPluginRequirement),
325
+ mcpServers: Schema.Array(ResolvedAgentMcpServerRequirement),
326
+ harnessSettings: Schema.Array(ResolvedAgentHarnessSetting),
327
+ providerAuthRefs: Schema.Array(ResolvedProviderAuthRef),
328
+ runnerSecretRefs: Schema.Array(ResolvedRunnerSecretRef),
329
+ permissions: Schema.Array(ResolvedAgentPermissionRequirement),
330
+ hooks: Schema.Array(ResolvedAgentHookRequirement),
331
+ runtimeConstraints: Schema.Array(ResolvedAgentRuntimeConstraint),
332
+ sandboxPolicyRequirements: Schema.Array(ResolvedAgentSandboxPolicyRequirement),
333
+ warnings: Schema.Array(Schema.String)
243
334
  });
244
- var VerificationEvidence = Schema2.Struct({ head: TreeEvidence, baseline: Schema2.optionalKey(TreeEvidence) });
245
- var BoundaryChange = Schema2.Struct({
246
- kind: Schema2.Literal("change"),
247
- changedPaths: Schema2.Array(Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(4096))).check(Schema2.isMaxLength(1000)),
248
- omittedPaths: Schema2.Int.check(Schema2.isGreaterThanOrEqualTo(0)),
249
- files: Schema2.Array(Schema2.Struct({
250
- path: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(4096)),
251
- excerpt: Schema2.String.check(Schema2.isMaxLength(250000)),
252
- redacted: Schema2.Boolean,
253
- truncated: Schema2.Boolean
254
- })).check(Schema2.isMaxLength(20)),
255
- truncated: Schema2.Boolean
335
+ var KitMarketplaceAgentEnvironmentSyncStates = ["ready", "needs_sync", "blocked"];
336
+ var KitMarketplaceAgentEnvironmentEffectKinds = [
337
+ "skill",
338
+ "plugin",
339
+ "mcp_server",
340
+ "harness_setting",
341
+ "provider_auth_ref",
342
+ "runner_secret_ref",
343
+ "permission",
344
+ "hook",
345
+ "runtime_constraint",
346
+ "sandbox_policy_requirement"
347
+ ];
348
+ var KitMarketplaceAgentEnvironmentMaterializerRequirements = [
349
+ "config_writer",
350
+ "provider_auth",
351
+ "runner_secret",
352
+ "bun",
353
+ "sandbox_policy"
354
+ ];
355
+ var KitMarketplaceAgentEnvironmentEffect = Schema.Struct({
356
+ kind: Schema.Literals(KitMarketplaceAgentEnvironmentEffectKinds),
357
+ name: Schema.String.check(Schema.isMinLength(1)),
358
+ policy: AgentEnvironmentPolicy,
359
+ source: AgentEnvironmentSource,
360
+ materializerRequirements: Schema.Array(Schema.Literals(KitMarketplaceAgentEnvironmentMaterializerRequirements))
256
361
  });
257
- var WorkUnitOutcome = Schema2.Struct({
258
- status: Schema2.Union([
259
- Schema2.Literal("completed"),
260
- Schema2.Literal("failed"),
261
- Schema2.Literal("blocked"),
262
- Schema2.Literal("canceled")
263
- ]),
264
- result: Schema2.optionalKey(LoopStepOutput),
265
- revision: Schema2.optionalKey(Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(120))),
266
- evidence: Schema2.optionalKey(VerificationEvidence),
267
- boundary: Schema2.optionalKey(BoundaryChange),
268
- failureSummary: Schema2.optionalKey(Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(4000)))
362
+ var KitMarketplaceAgentEnvironmentSyncPreview = Schema.Struct({
363
+ state: Schema.Literals(KitMarketplaceAgentEnvironmentSyncStates),
364
+ agentEnvironment: AgentEnvironment,
365
+ effects: Schema.Array(KitMarketplaceAgentEnvironmentEffect),
366
+ blockers: Schema.Array(Schema.String),
367
+ drift: Schema.Array(Schema.String)
269
368
  });
270
- var WorkUnitCompletion = Schema2.Struct({
271
- workUnitId: Id,
272
- lease: WorkUnitLeaseInput,
273
- idempotencyKey: Schema2.String.check(Schema2.isMinLength(1), Schema2.isMaxLength(240)),
274
- outcome: WorkUnitOutcome
369
+ var AgentEnvironmentSyncPlanStatuses = ["ready", "needs_apply", "blocked"];
370
+ var AgentEnvironmentSyncPlanItemKinds = [
371
+ "skill",
372
+ "plugin",
373
+ "mcp_server",
374
+ "harness_setting",
375
+ "provider_auth_ref",
376
+ "runner_secret_ref",
377
+ "permission",
378
+ "hook",
379
+ "runtime_constraint",
380
+ "sandbox_policy_requirement"
381
+ ];
382
+ var AgentEnvironmentSyncPlanApplyModes = ["automatic", "manual", "verify_only"];
383
+ var AgentEnvironmentSyncPlanItem = Schema.Struct({
384
+ kind: Schema.Literals(AgentEnvironmentSyncPlanItemKinds),
385
+ name: Schema.String.check(Schema.isMinLength(1)),
386
+ policy: AgentEnvironmentPolicy,
387
+ source: AgentEnvironmentSource,
388
+ materializerRequirements: Schema.Array(Schema.Literals(KitMarketplaceAgentEnvironmentMaterializerRequirements)),
389
+ applyMode: Schema.Literals(AgentEnvironmentSyncPlanApplyModes)
390
+ });
391
+ var AgentEnvironmentSyncPlan = Schema.Struct({
392
+ status: Schema.Literals(AgentEnvironmentSyncPlanStatuses),
393
+ targetHarness: AgentHarnessId,
394
+ agentEnvironment: AgentEnvironment,
395
+ items: Schema.Array(AgentEnvironmentSyncPlanItem),
396
+ blockers: Schema.Array(Schema.String),
397
+ drift: Schema.Array(Schema.String)
275
398
  });
276
399
  // packages/core/src/run-file.ts
277
- import * as Schema4 from "effect/Schema";
400
+ import * as Schema3 from "effect/Schema";
278
401
 
279
402
  // packages/core/src/storage.ts
280
- import * as Schema3 from "effect/Schema";
403
+ import * as Schema2 from "effect/Schema";
281
404
  var units = ["B", "KiB", "MiB", "GiB", "TiB"];
282
405
  var formatBytes = (bytes) => {
283
406
  const exponent = Math.min(units.length - 1, Math.floor(Math.log(Math.max(bytes, 1)) / Math.log(1024)));
@@ -289,16 +412,16 @@ var storageLimitWords = {
289
412
  run: (filesPerRun) => `${filesPerRun} files per Run`
290
413
  };
291
414
  var maxRunFileRetentionDays = 3650;
292
- var RunFileRetentionDays = Schema3.NullOr(Schema3.Int.check(Schema3.isGreaterThanOrEqualTo(1), Schema3.isLessThanOrEqualTo(maxRunFileRetentionDays)));
293
- var WorkspaceStorageSettings = Schema3.Struct({
294
- usedBytes: Schema3.Int,
295
- quotaBytes: Schema3.Int,
296
- byPurpose: Schema3.Struct({ runFile: Schema3.Int, taskAsset: Schema3.Int, checkpoint: Schema3.Int }),
297
- limits: Schema3.Struct({ fileBytes: Schema3.Int, filesPerRun: Schema3.Int }),
415
+ var RunFileRetentionDays = Schema2.NullOr(Schema2.Int.check(Schema2.isGreaterThanOrEqualTo(1), Schema2.isLessThanOrEqualTo(maxRunFileRetentionDays)));
416
+ var WorkspaceStorageSettings = Schema2.Struct({
417
+ usedBytes: Schema2.Int,
418
+ quotaBytes: Schema2.Int,
419
+ byPurpose: Schema2.Struct({ runFile: Schema2.Int, taskAsset: Schema2.Int, checkpoint: Schema2.Int }),
420
+ limits: Schema2.Struct({ fileBytes: Schema2.Int, filesPerRun: Schema2.Int }),
298
421
  runFileRetentionDays: RunFileRetentionDays
299
422
  });
300
- var WorkspaceStorageUpdate = Schema3.Struct({ runFileRetentionDays: RunFileRetentionDays });
301
- var WorkspaceStorageSaved = Schema3.Struct({ ...WorkspaceStorageSettings.fields, willExpire: Schema3.Int });
423
+ var WorkspaceStorageUpdate = Schema2.Struct({ runFileRetentionDays: RunFileRetentionDays });
424
+ var WorkspaceStorageSaved = Schema2.Struct({ ...WorkspaceStorageSettings.fields, willExpire: Schema2.Int });
302
425
 
303
426
  // packages/core/src/run-file.ts
304
427
  var RunFileRefusalReasons = ["type", "too_large", "too_many", "quota", "name_taken"];
@@ -317,10 +440,10 @@ var runFileRefusalWords = (refusal) => {
317
440
  }
318
441
  };
319
442
 
320
- class RunFileRefused extends Schema4.TaggedError()("RunFileRefused", {
321
- reason: Schema4.Literals(RunFileRefusalReasons),
322
- limit: Schema4.optionalKey(Schema4.Int),
323
- actual: Schema4.optionalKey(Schema4.Int)
443
+ class RunFileRefused extends Schema3.TaggedError()("RunFileRefused", {
444
+ reason: Schema3.Literals(RunFileRefusalReasons),
445
+ limit: Schema3.optionalKey(Schema3.Int),
446
+ actual: Schema3.optionalKey(Schema3.Int)
324
447
  }) {
325
448
  get message() {
326
449
  return runFileRefusalWords(this);
@@ -356,72 +479,72 @@ var RunFileStatuses = [
356
479
  "removed",
357
480
  "expired"
358
481
  ];
359
- var RunFileRecord = Schema4.Struct({
360
- id: Schema4.String,
361
- runId: Schema4.String,
362
- step: Schema4.String,
363
- name: Schema4.String,
364
- caption: Schema4.optionalKey(Schema4.String),
365
- contentType: Schema4.String,
366
- kind: Schema4.Literals(RunFileKinds),
367
- byteSize: Schema4.Int,
368
- sha256: Schema4.String,
369
- status: Schema4.Literals(RunFileStatuses)
482
+ var RunFileRecord = Schema3.Struct({
483
+ id: Schema3.String,
484
+ runId: Schema3.String,
485
+ step: Schema3.String,
486
+ name: Schema3.String,
487
+ caption: Schema3.optionalKey(Schema3.String),
488
+ contentType: Schema3.String,
489
+ kind: Schema3.Literals(RunFileKinds),
490
+ byteSize: Schema3.Int,
491
+ sha256: Schema3.String,
492
+ status: Schema3.Literals(RunFileStatuses)
370
493
  });
371
494
  var RunFileMakers = ["program", "agent", "check"];
372
- var RunFileView = Schema4.Struct({
373
- id: Schema4.String,
374
- runId: Schema4.String,
375
- step: Schema4.String,
376
- stepAttemptId: Schema4.optionalKey(Schema4.String),
377
- verificationId: Schema4.optionalKey(Schema4.String),
378
- madeBy: Schema4.Literals(RunFileMakers),
379
- name: Schema4.String,
380
- caption: Schema4.optionalKey(Schema4.String),
381
- kind: Schema4.Literals(RunFileKinds),
382
- contentType: Schema4.String,
383
- byteSize: Schema4.Int,
384
- sha256: Schema4.String,
385
- status: Schema4.Literals(RunFileStatuses),
386
- reason: Schema4.optionalKey(Schema4.String),
387
- limit: Schema4.optionalKey(Schema4.Int),
388
- actual: Schema4.optionalKey(Schema4.Int),
389
- removedBy: Schema4.optionalKey(Schema4.String),
390
- removedAt: Schema4.optionalKey(Timestamp),
495
+ var RunFileView = Schema3.Struct({
496
+ id: Schema3.String,
497
+ runId: Schema3.String,
498
+ step: Schema3.String,
499
+ stepAttemptId: Schema3.optionalKey(Schema3.String),
500
+ verificationId: Schema3.optionalKey(Schema3.String),
501
+ madeBy: Schema3.Literals(RunFileMakers),
502
+ name: Schema3.String,
503
+ caption: Schema3.optionalKey(Schema3.String),
504
+ kind: Schema3.Literals(RunFileKinds),
505
+ contentType: Schema3.String,
506
+ byteSize: Schema3.Int,
507
+ sha256: Schema3.String,
508
+ status: Schema3.Literals(RunFileStatuses),
509
+ reason: Schema3.optionalKey(Schema3.String),
510
+ limit: Schema3.optionalKey(Schema3.Int),
511
+ actual: Schema3.optionalKey(Schema3.Int),
512
+ removedBy: Schema3.optionalKey(Schema3.String),
513
+ removedAt: Schema3.optionalKey(Timestamp),
391
514
  createdAt: Timestamp
392
515
  });
393
- var RunFileList = Schema4.Union([
394
- Schema4.Struct({ files: Schema4.Array(RunFileView) }),
395
- Schema4.Struct({ count: Schema4.Int })
516
+ var RunFileList = Schema3.Union([
517
+ Schema3.Struct({ files: Schema3.Array(RunFileView) }),
518
+ Schema3.Struct({ count: Schema3.Int })
396
519
  ]);
397
- var RunFileUrlsRequest = Schema4.Struct({
398
- ids: Schema4.Array(Id).check(Schema4.isMinLength(1), Schema4.isMaxLength(200)),
399
- use: Schema4.Literals(["view", "download"])
520
+ var RunFileUrlsRequest = Schema3.Struct({
521
+ ids: Schema3.Array(Id).check(Schema3.isMinLength(1), Schema3.isMaxLength(200)),
522
+ use: Schema3.Literals(["view", "download"])
400
523
  });
401
- var RunFileRemoveRequest = Schema4.Struct({
402
- note: Schema4.optionalKey(Schema4.String.check(Schema4.isMaxLength(500)))
524
+ var RunFileRemoveRequest = Schema3.Struct({
525
+ note: Schema3.optionalKey(Schema3.String.check(Schema3.isMaxLength(500)))
403
526
  });
404
- var RunFileUrl = Schema4.Struct({ id: Schema4.String, url: Schema4.String, expiresAt: Timestamp });
405
- var RunFileUrls = Schema4.Struct({ urls: Schema4.Array(RunFileUrl) });
527
+ var RunFileUrl = Schema3.Struct({ id: Schema3.String, url: Schema3.String, expiresAt: Timestamp });
528
+ var RunFileUrls = Schema3.Struct({ urls: Schema3.Array(RunFileUrl) });
406
529
  var PresignedRequest = {
407
- url: Schema4.String,
408
- headers: Schema4.optionalKey(Schema4.Record(Schema4.String, Schema4.String)),
409
- expiresAt: Schema4.String
530
+ url: Schema3.String,
531
+ headers: Schema3.optionalKey(Schema3.Record(Schema3.String, Schema3.String)),
532
+ expiresAt: Schema3.String
410
533
  };
411
- var RunFilePartUrl = Schema4.Struct({ partNumber: Schema4.Int, ...PresignedRequest });
412
- var RunFileUpload = Schema4.Union([
413
- Schema4.Struct({ kind: Schema4.Literal("single"), ...PresignedRequest }),
414
- Schema4.Struct({ kind: Schema4.Literal("multipart"), partSize: Schema4.Int, parts: Schema4.Array(RunFilePartUrl) })
534
+ var RunFilePartUrl = Schema3.Struct({ partNumber: Schema3.Int, ...PresignedRequest });
535
+ var RunFileUpload = Schema3.Union([
536
+ Schema3.Struct({ kind: Schema3.Literal("single"), ...PresignedRequest }),
537
+ Schema3.Struct({ kind: Schema3.Literal("multipart"), partSize: Schema3.Int, parts: Schema3.Array(RunFilePartUrl) })
415
538
  ]);
416
- var UploadedRunFilePart = Schema4.Struct({ partNumber: Schema4.Int, etag: Schema4.String });
417
- var StepRunFileRequest = Schema4.Struct({
418
- name: Schema4.String.check(Schema4.isMinLength(1), Schema4.isMaxLength(255)),
419
- caption: Schema4.optionalKey(Schema4.String.check(Schema4.isMaxLength(1000))),
420
- contentType: Schema4.String.check(Schema4.isMinLength(1), Schema4.isMaxLength(255)),
421
- byteSize: Schema4.Int.check(Schema4.isGreaterThanOrEqualTo(0)),
422
- sha256: Schema4.String.check(Schema4.isPattern(/^[0-9a-f]{64}$/))
539
+ var UploadedRunFilePart = Schema3.Struct({ partNumber: Schema3.Int, etag: Schema3.String });
540
+ var StepRunFileRequest = Schema3.Struct({
541
+ name: Schema3.String.check(Schema3.isMinLength(1), Schema3.isMaxLength(255)),
542
+ caption: Schema3.optionalKey(Schema3.String.check(Schema3.isMaxLength(1000))),
543
+ contentType: Schema3.String.check(Schema3.isMinLength(1), Schema3.isMaxLength(255)),
544
+ byteSize: Schema3.Int.check(Schema3.isGreaterThanOrEqualTo(0)),
545
+ sha256: Schema3.String.check(Schema3.isPattern(/^[0-9a-f]{64}$/))
423
546
  });
424
- var RunFileSlotted = Schema4.Struct({ file: RunFileRecord, upload: Schema4.optionalKey(RunFileUpload) });
547
+ var RunFileSlotted = Schema3.Struct({ file: RunFileRecord, upload: Schema3.optionalKey(RunFileUpload) });
425
548
  // packages/core/src/crypto.ts
426
549
  import { createHash, createHmac, createSign, randomBytes, timingSafeEqual } from "crypto";
427
550
  function digestSha256(data, encoding) {
@@ -430,6 +553,12 @@ function digestSha256(data, encoding) {
430
553
  hash.update(part);
431
554
  return hash.digest(encoding);
432
555
  }
556
+ function digestSha512(data, encoding) {
557
+ return createHash("sha512").update(data).digest(encoding);
558
+ }
559
+ function digestWith(algorithm, data, encoding) {
560
+ return createHash(algorithm).update(data).digest(encoding);
561
+ }
433
562
  function sha256Hasher() {
434
563
  const hash = createHash("sha256");
435
564
  return {
@@ -440,97 +569,115 @@ function sha256Hasher() {
440
569
  };
441
570
  }
442
571
  // packages/core/src/transcript.ts
443
- import * as Schema5 from "effect/Schema";
444
- var Text = Schema5.String.check(Schema5.isMaxLength(200000));
445
- var AgentEvent = Schema5.Union([
446
- Schema5.Struct({ kind: Schema5.Literal("message"), role: Schema5.Literals(["assistant", "user"]), text: Text }),
447
- Schema5.Struct({
448
- kind: Schema5.Literal("tool_call"),
449
- callId: Schema5.String,
450
- name: Schema5.String.check(Schema5.isMinLength(1), Schema5.isMaxLength(240)),
451
- arguments: Schema5.Json
572
+ import * as Schema4 from "effect/Schema";
573
+ var Text = Schema4.String.check(Schema4.isMaxLength(200000));
574
+ var AgentEvent = Schema4.Union([
575
+ Schema4.Struct({ kind: Schema4.Literal("message"), role: Schema4.Literals(["assistant", "user"]), text: Text }),
576
+ Schema4.Struct({
577
+ kind: Schema4.Literal("tool_call"),
578
+ callId: Schema4.String,
579
+ name: Schema4.String.check(Schema4.isMinLength(1), Schema4.isMaxLength(240)),
580
+ arguments: Schema4.Json
452
581
  }),
453
- Schema5.Struct({
454
- kind: Schema5.Literal("tool_result"),
455
- callId: Schema5.String,
582
+ Schema4.Struct({
583
+ kind: Schema4.Literal("tool_result"),
584
+ callId: Schema4.String,
456
585
  output: Text,
457
- isError: Schema5.optionalKey(Schema5.Boolean)
586
+ isError: Schema4.optionalKey(Schema4.Boolean)
458
587
  }),
459
- Schema5.Struct({
460
- kind: Schema5.Literal("file"),
461
- path: Schema5.String.check(Schema5.isMinLength(1), Schema5.isMaxLength(4096)),
462
- change: Schema5.Literals(["read", "changed"])
588
+ Schema4.Struct({
589
+ kind: Schema4.Literal("file"),
590
+ path: Schema4.String.check(Schema4.isMinLength(1), Schema4.isMaxLength(4096)),
591
+ change: Schema4.Literals(["read", "changed"])
463
592
  }),
464
- Schema5.Struct({ kind: Schema5.Literal("question"), text: Text }),
465
- Schema5.Struct({
466
- kind: Schema5.Literal("answer"),
467
- callId: Schema5.optionalKey(Schema5.String),
468
- questionId: Schema5.optionalKey(Schema5.String),
593
+ Schema4.Struct({ kind: Schema4.Literal("question"), text: Text }),
594
+ Schema4.Struct({
595
+ kind: Schema4.Literal("answer"),
596
+ callId: Schema4.optionalKey(Schema4.String),
597
+ questionId: Schema4.optionalKey(Schema4.String),
469
598
  text: Text
470
599
  }),
471
- Schema5.Struct({ kind: Schema5.Literal("steer"), messageId: Id, text: Text }),
472
- Schema5.Struct({
473
- kind: Schema5.Literal("lifecycle"),
474
- state: Schema5.Literals(["started", "resumed", "finished", "failed", "canceled"])
600
+ Schema4.Struct({ kind: Schema4.Literal("steer"), messageId: Id, text: Text }),
601
+ Schema4.Struct({
602
+ kind: Schema4.Literal("secret_refused"),
603
+ reference: Schema4.optionalKey(Schema4.String.check(Schema4.isMinLength(1), Schema4.isMaxLength(300))),
604
+ host: Schema4.String.check(Schema4.isMaxLength(300)),
605
+ reason: Schema4.String.check(Schema4.isMaxLength(500))
606
+ }),
607
+ Schema4.Struct({
608
+ kind: Schema4.Literal("lifecycle"),
609
+ state: Schema4.Literals(["started", "resumed", "parked", "finished", "failed", "canceled"])
475
610
  })
476
611
  ]);
477
- var TranscriptAppendEntry = Schema5.Struct({
478
- sequence: Schema5.Int.check(Schema5.isGreaterThanOrEqualTo(1)),
612
+ var TranscriptAppendEntry = Schema4.Struct({
613
+ sequence: Schema4.Int.check(Schema4.isGreaterThanOrEqualTo(1)),
479
614
  event: AgentEvent
480
615
  });
481
- var TranscriptEntry = Schema5.Struct({
616
+ var TranscriptEntry = Schema4.Struct({
482
617
  stepAttemptId: Id,
483
- sequence: Schema5.Int.check(Schema5.isGreaterThanOrEqualTo(1)),
618
+ sequence: Schema4.Int.check(Schema4.isGreaterThanOrEqualTo(1)),
484
619
  event: AgentEvent,
485
620
  createdAt: Timestamp
486
621
  });
487
- var TranscriptPage = Schema5.Struct({
488
- items: Schema5.Array(TranscriptEntry),
489
- next: Schema5.optionalKey(Schema5.Int),
490
- previous: Schema5.optionalKey(Schema5.Int)
622
+ var TranscriptPage = Schema4.Struct({
623
+ items: Schema4.Array(TranscriptEntry),
624
+ next: Schema4.optionalKey(Schema4.Int),
625
+ previous: Schema4.optionalKey(Schema4.Int)
491
626
  });
492
- var TranscriptRetention = Schema5.Struct({
493
- days: Schema5.NullOr(Schema5.Int.check(Schema5.isGreaterThanOrEqualTo(1)))
627
+ var TranscriptRetention = Schema4.Struct({
628
+ days: Schema4.NullOr(Schema4.Int.check(Schema4.isGreaterThanOrEqualTo(1)))
494
629
  });
495
630
  var MaxTranscriptSearchLimit = 50;
496
- var TranscriptSearchQuery = Schema5.Struct({
497
- q: Schema5.String.check(Schema5.isMinLength(1), Schema5.isMaxLength(200)),
498
- limit: Schema5.optionalKey(Numeric.check(isWholeNumber, Schema5.isGreaterThanOrEqualTo(1), Schema5.isLessThanOrEqualTo(MaxTranscriptSearchLimit)))
631
+ var TranscriptSearchQuery = Schema4.Struct({
632
+ q: Schema4.String.check(Schema4.isMinLength(1), Schema4.isMaxLength(200)),
633
+ limit: Schema4.optionalKey(Numeric.check(isWholeNumber, Schema4.isGreaterThanOrEqualTo(1), Schema4.isLessThanOrEqualTo(MaxTranscriptSearchLimit)))
499
634
  });
500
- var TranscriptSearchHit = Schema5.Struct({
635
+ var TranscriptSearchHit = Schema4.Struct({
501
636
  runId: Id,
502
- loop: Schema5.String,
503
- task: Schema5.optionalKey(Schema5.Struct({ id: Id, key: Schema5.String, title: Schema5.String })),
637
+ loop: Schema4.String,
638
+ task: Schema4.optionalKey(Schema4.Struct({ id: Id, key: Schema4.String, title: Schema4.String })),
504
639
  stepAttemptId: Id,
505
- node: Schema5.optionalKey(Schema5.String),
506
- step: Schema5.String,
507
- attempt: Schema5.Int,
508
- agent: Schema5.optionalKey(Schema5.String),
640
+ node: Schema4.optionalKey(Schema4.String),
641
+ step: Schema4.String,
642
+ attempt: Schema4.Int,
643
+ agent: Schema4.optionalKey(Schema4.String),
509
644
  ranAt: Timestamp,
510
- sequence: Schema5.Int,
511
- matches: Schema5.Int,
512
- excerpt: Schema5.String
645
+ sequence: Schema4.Int,
646
+ matches: Schema4.Int,
647
+ excerpt: Schema4.String
513
648
  });
514
- var TranscriptSearchResult = Schema5.Struct({
515
- items: Schema5.Array(TranscriptSearchHit),
516
- total: Schema5.Int
649
+ var TranscriptSearchResult = Schema4.Struct({
650
+ items: Schema4.Array(TranscriptSearchHit),
651
+ total: Schema4.Int
517
652
  });
518
653
  // packages/core/src/run-journal.ts
519
654
  import * as Effect from "effect/Effect";
520
655
  import * as Exit from "effect/Exit";
521
- import * as Schema6 from "effect/Schema";
656
+ import * as Schema5 from "effect/Schema";
522
657
  var journalEntryMaxBytes = 256 * 1024;
523
- var JournalExit = Schema6.toCodecJson(Schema6.Exit(Schema6.Json, Schema6.Json, Schema6.Defect()));
524
- var encodeJournalExit = (exit) => Schema6.encodeUnknownEffect(JournalExit)(Exit.map(exit, (value) => value ?? null));
525
- var decodeJournalExit = Schema6.decodeUnknownEffect(JournalExit);
526
- var JournalStepFailed = Schema6.TaggedStruct("StepFailed", { step: Schema6.String, reason: Schema6.String });
527
- var JournalChildFailed = Schema6.TaggedStruct("ChildFailed", {
528
- step: Schema6.String,
529
- loop: Schema6.String,
530
- reason: Schema6.String
658
+ var JournalExit = Schema5.toCodecJson(Schema5.Exit(Schema5.Json, Schema5.Json, Schema5.Defect()));
659
+ var encodeJournalExit = (exit) => Schema5.encodeUnknownEffect(JournalExit)(Exit.map(exit, (value) => value ?? null));
660
+ var decodeJournalExit = Schema5.decodeUnknownEffect(JournalExit);
661
+ var JournalStepFailed = Schema5.TaggedStruct("StepFailed", { step: Schema5.String, reason: Schema5.String });
662
+ var JournalChildFailed = Schema5.TaggedStruct("ChildFailed", {
663
+ step: Schema5.String,
664
+ loop: Schema5.String,
665
+ reason: Schema5.String
531
666
  });
532
- var JournalWaitTimedOut = Schema6.TaggedStruct("WaitTimedOut", { step: Schema6.String, event: Schema6.String });
667
+ var JournalWaitTimedOut = Schema5.TaggedStruct("WaitTimedOut", { step: Schema5.String, event: Schema5.String });
533
668
  var journalEntryBytes = (entry) => new TextEncoder().encode(JSON.stringify(entry)).byteLength;
669
+ // packages/core/src/kit-setup.ts
670
+ import * as Schema6 from "effect/Schema";
671
+ var KitSetup = Schema6.Struct({
672
+ ...AgentEnvironmentFragment.fields,
673
+ instructions: Schema6.optionalKey(Schema6.String.check(Schema6.isMinLength(1)))
674
+ });
675
+ var SetupFile = Schema6.Union([
676
+ Schema6.Struct({ utf8: Schema6.String }),
677
+ Schema6.Struct({ base64: Schema6.String })
678
+ ]);
679
+ var SetupArchive = Schema6.Struct({ setup: KitSetup, files: Schema6.Record(Schema6.String, SetupFile) });
680
+ var kitmanMcpServer = "kitman";
534
681
  // packages/sdk/src/program/engine.ts
535
682
  import * as Cause from "effect/Cause";
536
683
  import * as Clock from "effect/Clock";
@@ -544,6 +691,7 @@ import * as Layer from "effect/Layer";
544
691
  import * as Option from "effect/Option";
545
692
  import { isPlatformError } from "effect/PlatformError";
546
693
  import * as Schema8 from "effect/Schema";
694
+ import * as SchemaIssue from "effect/SchemaIssue";
547
695
  import * as Stream from "effect/Stream";
548
696
  import * as HttpClient from "effect/http/HttpClient";
549
697
  import * as HttpClientRequest from "effect/http/HttpClientRequest";
@@ -553,7 +701,7 @@ import * as HttpClientResponse from "effect/http/HttpClientResponse";
553
701
  import * as Schema7 from "effect/Schema";
554
702
  import { Rpc, RpcGroup, RpcMiddleware } from "effect/rpc";
555
703
  var RunnerHeaders = { runnerId: "x-kitman-runner-id", protocolVersion: "x-kitman-rpc-protocol" };
556
- var RunnerRpcProtocolVersion = 4;
704
+ var RunnerRpcProtocolVersion = 5;
557
705
 
558
706
  class RunnerRpcError extends Schema7.TaggedError()("RunnerRpcError", {
559
707
  code: Schema7.String,
@@ -630,7 +778,7 @@ var ProgramOutcome = Schema7.Union([
630
778
  Schema7.Struct({ status: Schema7.Literal("failed"), failureSummary: Schema7.String })
631
779
  ]);
632
780
 
633
- class RunnerRpcs extends RpcGroup.make(Rpc.make("Claim", {
781
+ class RunnerReplicaRpcs extends RpcGroup.make(Rpc.make("Claim", {
634
782
  payload: WorkUnitClaimInput,
635
783
  success: WorkUnitClaimResult,
636
784
  error: RunnerRpcError
@@ -644,7 +792,70 @@ class RunnerRpcs extends RpcGroup.make(Rpc.make("Claim", {
644
792
  }), Rpc.make("Release", {
645
793
  payload: WorkUnitReleaseInput,
646
794
  error: RunnerRpcError
647
- }), Rpc.make("RecordActivity", {
795
+ }), Rpc.make("Signals", {
796
+ payload: { runnerReplicaId: Schema7.String },
797
+ success: RunnerSignal,
798
+ error: RunnerRpcError,
799
+ stream: true
800
+ }), Rpc.make("ReportSteer", {
801
+ payload: { workUnitId: Schema7.String, messageId: Schema7.String, delivered: Schema7.Boolean },
802
+ success: Schema7.Void,
803
+ error: RunnerRpcError
804
+ }), Rpc.make("AppendTranscript", {
805
+ payload: { workUnitId: Schema7.String, entries: Schema7.Array(TranscriptAppendEntry).check(Schema7.isMaxLength(100)) },
806
+ success: Schema7.Void,
807
+ error: RunnerRpcError
808
+ }), Rpc.make("CreateCheckpointFile", {
809
+ payload: { lease: ProgramLease, byteSize: Schema7.Int, sha256: Schema7.String },
810
+ success: Schema7.Struct({ file: RunFileRecord, upload: Schema7.optional(RunFileUpload) }),
811
+ error: Schema7.Union([RunnerRpcError, RunFileRefused])
812
+ }), Rpc.make("CheckpointFileParts", {
813
+ payload: { lease: ProgramLease, fileId: Schema7.String, partNumbers: Schema7.Array(Schema7.Int) },
814
+ success: Schema7.Struct({ parts: Schema7.Array(RunFilePartUrl) }),
815
+ error: RunnerRpcError
816
+ }), Rpc.make("CompleteCheckpointFile", {
817
+ payload: { lease: ProgramLease, fileId: Schema7.String, parts: Schema7.optional(Schema7.Array(UploadedRunFilePart)) },
818
+ success: RunFileRecord,
819
+ error: RunnerRpcError
820
+ }), Rpc.make("SaveCheckpoint", {
821
+ payload: { lease: ProgramLease, checkpoint: StepCheckpoint },
822
+ success: Schema7.Void,
823
+ error: RunnerRpcError
824
+ }), Rpc.make("ResumeCheckpoint", {
825
+ payload: { lease: ProgramLease },
826
+ success: Schema7.UndefinedOr(ResumedCheckpoint),
827
+ error: RunnerRpcError
828
+ }), Rpc.make("SettledCheckpoints", {
829
+ success: Schema7.Array(Schema7.Struct({
830
+ stepAttemptId: Schema7.String,
831
+ ref: Schema7.optionalKey(Schema7.String),
832
+ repoBinding: Schema7.optionalKey(WorkUnitRepoBinding)
833
+ })),
834
+ error: RunnerRpcError
835
+ }), Rpc.make("ForgetCheckpoints", {
836
+ payload: { stepAttemptIds: Schema7.Array(Schema7.String) },
837
+ success: Schema7.Void,
838
+ error: RunnerRpcError
839
+ }), Rpc.make("GitCredential", {
840
+ payload: { repoBindingId: Schema7.String },
841
+ success: Schema7.UndefinedOr(Schema7.Struct({ username: Schema7.String, password: Schema7.String })),
842
+ error: RunnerRpcError
843
+ }), Rpc.make("Bundle", {
844
+ payload: { digest: Schema7.String },
845
+ success: Schema7.Struct({ bundle: Schema7.String }),
846
+ error: RunnerRpcError
847
+ }), Rpc.make("SettledRuns", {
848
+ payload: { runIds: Schema7.Array(Schema7.String) },
849
+ success: Schema7.Array(Schema7.String),
850
+ error: RunnerRpcError
851
+ }), Rpc.make("KnownEvidence", {
852
+ payload: { lease: ProgramLease, trees: Schema7.Array(Schema7.String) },
853
+ success: Schema7.Array(Schema7.Struct({ tree: Schema7.String, name: Schema7.String, command: Schema7.String })),
854
+ error: RunnerRpcError
855
+ })).middleware(RunnerAuthentication) {
856
+ }
857
+
858
+ class RunnerJournalRpcs extends RpcGroup.make(Rpc.make("RecordActivity", {
648
859
  payload: { lease: ProgramLease, name: Schema7.String, attempt: Schema7.Int, exit: Schema7.Json },
649
860
  error: RunnerRpcError
650
861
  }), Rpc.make("DeferredDone", {
@@ -653,13 +864,22 @@ class RunnerRpcs extends RpcGroup.make(Rpc.make("Claim", {
653
864
  }), Rpc.make("ScheduleClock", {
654
865
  payload: { lease: ProgramLease, name: Schema7.String, deferredName: Schema7.String, durationMillis: Schema7.Int },
655
866
  error: RunnerRpcError
656
- }), Rpc.make("PutQuestion", {
867
+ }), Rpc.make("Suspend", { payload: { lease: ProgramLease }, error: RunnerRpcError }), Rpc.make("FinishProgram", { payload: { lease: ProgramLease, outcome: ProgramOutcome }, error: RunnerRpcError })).middleware(RunnerAuthentication) {
868
+ }
869
+
870
+ class RunnerCapabilityRpcs extends RpcGroup.make(Rpc.make("PutQuestion", {
657
871
  payload: {
658
872
  lease: ProgramLease,
659
873
  step: Schema7.String,
660
874
  prompt: Schema7.String,
661
875
  options: Schema7.optional(Schema7.Array(Schema7.String)),
876
+ optionDescriptions: Schema7.optional(Schema7.Record(Schema7.String, Schema7.String)),
877
+ recommended: Schema7.optional(Schema7.String),
878
+ recommendationReason: Schema7.optional(Schema7.String),
879
+ informationOnly: Schema7.optional(Schema7.Boolean),
662
880
  verification: Schema7.optional(SuggestedVerification),
881
+ default: Schema7.optional(Schema7.String),
882
+ timeoutMillis: Schema7.optional(Schema7.Finite),
663
883
  deferredName: Schema7.String
664
884
  },
665
885
  success: Schema7.Struct({ questionId: Schema7.String }),
@@ -672,8 +892,11 @@ class RunnerRpcs extends RpcGroup.make(Rpc.make("Claim", {
672
892
  role: Schema7.String,
673
893
  agentId: Schema7.String,
674
894
  prompt: Schema7.String,
895
+ skill: Schema7.optionalKey(Schema7.String.check(Schema7.isMinLength(1))),
675
896
  outputSchema: Schema7.Json,
676
- secrets: Schema7.optionalKey(Schema7.Array(Schema7.String))
897
+ secrets: Schema7.optionalKey(Schema7.Array(Schema7.String)),
898
+ timeoutMillis: Schema7.optionalKey(Schema7.Int),
899
+ mergeTarget: Schema7.optionalKey(Schema7.String.check(Schema7.isMinLength(1)))
677
900
  },
678
901
  success: Schema7.Struct({ stepAttemptId: Schema7.String }),
679
902
  error: RunnerRpcError
@@ -683,14 +906,17 @@ class RunnerRpcs extends RpcGroup.make(Rpc.make("Claim", {
683
906
  step: Schema7.String,
684
907
  deferredName: Schema7.String,
685
908
  revision: Schema7.optionalKey(Schema7.String),
686
- checks: Schema7.optional(Schema7.Array(Schema7.String))
909
+ checks: Schema7.optional(Schema7.Array(Schema7.String)),
910
+ suggested: Schema7.optionalKey(Schema7.Array(ApprovedCheck)),
911
+ measure: Schema7.optionalKey(Schema7.Struct({
912
+ base: Schema7.optionalKey(Schema7.String),
913
+ plan: MeasurePlan2,
914
+ samples: Schema7.Int,
915
+ calibrate: Schema7.Boolean
916
+ }))
687
917
  },
688
918
  success: Schema7.Struct({ verificationId: Schema7.String }),
689
919
  error: RunnerRpcError
690
- }), Rpc.make("KnownEvidence", {
691
- payload: { lease: ProgramLease, trees: Schema7.Array(Schema7.String) },
692
- success: Schema7.Array(Schema7.Struct({ tree: Schema7.String, name: Schema7.String, command: Schema7.String })),
693
- error: RunnerRpcError
694
920
  }), Rpc.make("AwaitEvent", {
695
921
  payload: {
696
922
  lease: ProgramLease,
@@ -698,7 +924,22 @@ class RunnerRpcs extends RpcGroup.make(Rpc.make("Claim", {
698
924
  deferredName: Schema7.String,
699
925
  event: Schema7.String,
700
926
  filter: Schema7.optional(Schema7.Record(Schema7.String, Schema7.Union([EventFilterValue, Schema7.Array(EventFilterValue)]))),
701
- timeoutMillis: Schema7.Int
927
+ timeoutMillis: Schema7.Int,
928
+ since: Schema7.optionalKey(Schema7.String),
929
+ or: Schema7.optionalKey(Schema7.Array(Schema7.Struct({
930
+ event: Schema7.String,
931
+ filter: Schema7.optionalKey(Schema7.Record(Schema7.String, Schema7.Union([EventFilterValue, Schema7.Array(EventFilterValue)]))),
932
+ since: Schema7.optionalKey(Schema7.String)
933
+ })))
934
+ },
935
+ error: RunnerRpcError
936
+ }), Rpc.make("ClaimResource", {
937
+ payload: {
938
+ lease: ProgramLease,
939
+ step: Schema7.String,
940
+ deferredName: Schema7.String,
941
+ resource: ResourceName,
942
+ action: Schema7.Literals(["claim", "take_over", "let_go"])
702
943
  },
703
944
  error: RunnerRpcError
704
945
  }), Rpc.make("AdmitChild", {
@@ -723,26 +964,6 @@ class RunnerRpcs extends RpcGroup.make(Rpc.make("Claim", {
723
964
  },
724
965
  success: Schema7.Struct({ artifactId: Schema7.String }),
725
966
  error: RunnerRpcError
726
- }), Rpc.make("CreateRunFile", {
727
- payload: {
728
- lease: ProgramLease,
729
- step: Schema7.String,
730
- name: Schema7.String,
731
- caption: Schema7.optional(Schema7.String),
732
- contentType: Schema7.String,
733
- byteSize: Schema7.Int,
734
- sha256: Schema7.String
735
- },
736
- success: Schema7.Struct({ file: RunFileRecord, upload: Schema7.optional(RunFileUpload) }),
737
- error: Schema7.Union([RunnerRpcError, RunFileRefused])
738
- }), Rpc.make("RunFileParts", {
739
- payload: { lease: ProgramLease, fileId: Schema7.String, partNumbers: Schema7.Array(Schema7.Int) },
740
- success: Schema7.Struct({ parts: Schema7.Array(RunFilePartUrl) }),
741
- error: RunnerRpcError
742
- }), Rpc.make("CompleteRunFile", {
743
- payload: { lease: ProgramLease, fileId: Schema7.String, parts: Schema7.optional(Schema7.Array(UploadedRunFilePart)) },
744
- success: RunFileRecord,
745
- error: RunnerRpcError
746
967
  }), Rpc.make("RecordNote", {
747
968
  payload: {
748
969
  lease: ProgramLease,
@@ -756,7 +977,14 @@ class RunnerRpcs extends RpcGroup.make(Rpc.make("Claim", {
756
977
  lease: ProgramLease,
757
978
  step: Schema7.String,
758
979
  effect: Schema7.Union([
759
- Schema7.Struct({ kind: Schema7.Literal("post_comment"), changeRequestId: Schema7.String, body: Schema7.String }),
980
+ Schema7.Struct({
981
+ kind: Schema7.Literal("post_comment"),
982
+ changeRequestId: Schema7.String,
983
+ body: Schema7.String,
984
+ threadId: Schema7.optionalKey(Schema7.String),
985
+ summary: Schema7.optionalKey(Schema7.String),
986
+ anchors: Schema7.optionalKey(Schema7.Array(Schema7.Struct({ file: Schema7.String, line: Schema7.Int, body: Schema7.String })))
987
+ }),
760
988
  Schema7.Struct({
761
989
  kind: Schema7.Literal("change_request"),
762
990
  title: Schema7.String,
@@ -772,14 +1000,33 @@ class RunnerRpcs extends RpcGroup.make(Rpc.make("Claim", {
772
1000
  },
773
1001
  success: Schema7.UndefinedOr(Schema7.Struct({ id: Schema7.String, number: Schema7.String, url: Schema7.String })),
774
1002
  error: RunnerRpcError
1003
+ }), Rpc.make("AlertTask", {
1004
+ payload: {
1005
+ lease: ProgramLease,
1006
+ step: Schema7.String,
1007
+ fingerprint: Schema7.String,
1008
+ title: Schema7.String,
1009
+ windowHours: Schema7.Int,
1010
+ resolved: Schema7.optionalKey(Schema7.Boolean),
1011
+ priority: Schema7.optionalKey(Schema7.Literals(["urgent", "high", "medium", "low"]))
1012
+ },
1013
+ success: Schema7.Struct({
1014
+ taskId: Schema7.optionalKey(Schema7.String),
1015
+ created: Schema7.Boolean,
1016
+ resolved: Schema7.optionalKey(Schema7.Boolean),
1017
+ joined: Schema7.optionalKey(Schema7.Struct({ kind: Schema7.Literals(["run", "recent"]), runId: Schema7.String }))
1018
+ }),
1019
+ error: RunnerRpcError
775
1020
  }), Rpc.make("ReadTranscripts", {
776
1021
  payload: { lease: ProgramLease, step: Schema7.String, days: Schema7.Int },
777
1022
  success: Schema7.Struct({
778
1023
  runs: Schema7.Array(Schema7.Struct({
779
1024
  runId: Schema7.String,
780
1025
  loopId: Schema7.String,
1026
+ status: Schema7.optionalKey(Schema7.Literals(["completed", "failed", "canceled", "expired"])),
781
1027
  teamId: Schema7.optionalKey(Schema7.String),
782
1028
  failure: Schema7.optionalKey(Schema7.String),
1029
+ retried: Schema7.optionalKey(Schema7.Boolean),
783
1030
  entries: Schema7.Array(Schema7.Struct({
784
1031
  stepAttemptId: Schema7.String,
785
1032
  sequence: Schema7.Int,
@@ -789,6 +1036,65 @@ class RunnerRpcs extends RpcGroup.make(Rpc.make("Claim", {
789
1036
  }))
790
1037
  }),
791
1038
  error: RunnerRpcError
1039
+ }), Rpc.make("PipelineStatus", {
1040
+ payload: { lease: ProgramLease, step: Schema7.String, changeRequestId: Schema7.String },
1041
+ success: Schema7.Struct({
1042
+ head: Schema7.String,
1043
+ status: Schema7.Literals(["none", "running", "success", "failed", "canceled"]),
1044
+ source: Schema7.Literals(["forge", "reported"]),
1045
+ jobs: Schema7.Array(Schema7.Struct({
1046
+ name: Schema7.String,
1047
+ status: Schema7.Literals(["running", "success", "failed", "skipped"]),
1048
+ url: Schema7.optionalKey(Schema7.String),
1049
+ logTail: Schema7.optionalKey(Schema7.String)
1050
+ })),
1051
+ readAt: Schema7.optionalKey(Schema7.String),
1052
+ runnerChecks: Schema7.optionalKey(Schema7.Array(Schema7.String))
1053
+ }),
1054
+ error: RunnerRpcError
1055
+ }), Rpc.make("ReportPipeline", {
1056
+ payload: { lease: ProgramLease, step: Schema7.String, changeRequestId: Schema7.String, verification: Schema7.String },
1057
+ success: Schema7.Struct({ head: Schema7.String, status: Schema7.Literals(["success", "failed"]) }),
1058
+ error: RunnerRpcError
1059
+ }), Rpc.make("ReviewThreads", {
1060
+ payload: { lease: ProgramLease, step: Schema7.String, changeRequestId: Schema7.String },
1061
+ success: Schema7.Struct({
1062
+ threads: Schema7.Array(Schema7.Struct({
1063
+ id: Schema7.String,
1064
+ path: Schema7.optionalKey(Schema7.String),
1065
+ line: Schema7.optionalKey(Schema7.Int),
1066
+ outdated: Schema7.optionalKey(Schema7.Boolean),
1067
+ comments: Schema7.Array(Schema7.Struct({ author: Schema7.optionalKey(Schema7.String), body: Schema7.String }))
1068
+ }))
1069
+ }),
1070
+ error: RunnerRpcError
1071
+ }), Rpc.make("OpenChangeRequests", {
1072
+ payload: { lease: ProgramLease, step: Schema7.String, authors: Schema7.NonEmptyArray(Schema7.String) },
1073
+ success: Schema7.Struct({
1074
+ changeRequests: Schema7.Array(Schema7.Struct({
1075
+ number: Schema7.String,
1076
+ title: Schema7.String,
1077
+ body: Schema7.String,
1078
+ url: Schema7.String,
1079
+ author: Schema7.String,
1080
+ sourceBranch: Schema7.String,
1081
+ head: Schema7.String
1082
+ }))
1083
+ }),
1084
+ error: RunnerRpcError
1085
+ }), Rpc.make("OwnChangeRequests", {
1086
+ payload: { lease: ProgramLease, step: Schema7.String },
1087
+ success: Schema7.Struct({
1088
+ changeRequests: Schema7.Array(Schema7.Struct({
1089
+ id: Schema7.String,
1090
+ number: Schema7.String,
1091
+ url: Schema7.String,
1092
+ title: Schema7.String,
1093
+ sourceBranch: Schema7.String,
1094
+ body: Schema7.String
1095
+ }))
1096
+ }),
1097
+ error: RunnerRpcError
792
1098
  }), Rpc.make("Propose", {
793
1099
  payload: {
794
1100
  lease: ProgramLease,
@@ -805,11 +1111,16 @@ class RunnerRpcs extends RpcGroup.make(Rpc.make("Claim", {
805
1111
  title: Schema7.String,
806
1112
  description: Schema7.String,
807
1113
  teamId: Schema7.optionalKey(Schema7.String),
1114
+ key: Schema7.optionalKey(Schema7.String),
808
1115
  citations: Schema7.NonEmptyArray(Schema7.Struct({ runId: Schema7.String, stepAttemptId: Schema7.String, sequence: Schema7.Int }))
809
1116
  })
810
1117
  ])
811
1118
  },
812
- success: Schema7.Struct({ kind: Schema7.Literals(["memory", "task"]), id: Schema7.String }),
1119
+ success: Schema7.Struct({
1120
+ kind: Schema7.Literals(["memory", "task"]),
1121
+ id: Schema7.String,
1122
+ matched: Schema7.optionalKey(Schema7.Boolean)
1123
+ }),
813
1124
  error: RunnerRpcError
814
1125
  }), Rpc.make("ReadProject", {
815
1126
  payload: { lease: ProgramLease, step: Schema7.String, projectId: Schema7.String },
@@ -852,13 +1163,14 @@ class RunnerRpcs extends RpcGroup.make(Rpc.make("Claim", {
852
1163
  }), Rpc.make("CreatePlanTasks", {
853
1164
  payload: {
854
1165
  lease: ProgramLease,
1166
+ projectId: Schema7.optionalKey(Schema7.String),
855
1167
  tickets: Schema7.Array(Schema7.Struct({
856
1168
  key: Schema7.String,
857
1169
  title: Schema7.String,
858
1170
  body: Schema7.String,
859
1171
  acceptanceCriteria: Schema7.Array(Schema7.String),
860
1172
  blockedBy: Schema7.Array(Schema7.String),
861
- outcome: Schema7.optionalKey(Schema7.Literals(["feature", "bug", "refactor", "investigation", "docs", "migration"]))
1173
+ outcome: Schema7.optionalKey(Schema7.Literals(["feature", "bug", "refactor", "investigation", "docs", "migration", "performance"]))
862
1174
  }))
863
1175
  },
864
1176
  success: Schema7.Array(Schema7.Struct({ key: Schema7.String, taskId: Schema7.String })),
@@ -868,12 +1180,53 @@ class RunnerRpcs extends RpcGroup.make(Rpc.make("Claim", {
868
1180
  success: Schema7.Struct({ repoBindingId: Schema7.String, branch: Schema7.String, revision: Schema7.String }),
869
1181
  error: RunnerRpcError
870
1182
  }), Rpc.make("MergeChangeRequest", {
871
- payload: { lease: ProgramLease, step: Schema7.String, changeRequestId: Schema7.String },
1183
+ payload: {
1184
+ lease: ProgramLease,
1185
+ step: Schema7.String,
1186
+ changeRequestId: Schema7.String,
1187
+ head: Schema7.optionalKey(Schema7.String)
1188
+ },
872
1189
  success: Schema7.Union([
873
1190
  Schema7.Struct({ status: Schema7.Literal("merged"), revision: Schema7.String }),
874
- Schema7.Struct({ status: Schema7.Literal("conflict") })
1191
+ Schema7.Struct({ status: Schema7.Literal("conflict") }),
1192
+ Schema7.Struct({ status: Schema7.Literal("moved"), head: Schema7.String })
875
1193
  ]),
876
1194
  error: RunnerRpcError
1195
+ }), Rpc.make("ApproveChangeRequest", {
1196
+ payload: {
1197
+ lease: ProgramLease,
1198
+ step: Schema7.String,
1199
+ changeRequestId: Schema7.String,
1200
+ head: Schema7.String,
1201
+ summary: Schema7.String,
1202
+ review: Schema7.optionalKey(Schema7.String),
1203
+ carries: Schema7.optionalKey(Schema7.String)
1204
+ },
1205
+ success: Schema7.Union([
1206
+ Schema7.Struct({ approved: Schema7.Literal(true), reviewId: Schema7.String }),
1207
+ Schema7.Struct({ approved: Schema7.Literal(false), reason: Schema7.String })
1208
+ ]),
1209
+ error: RunnerRpcError
1210
+ }), Rpc.make("CloseChangeRequest", {
1211
+ payload: {
1212
+ lease: ProgramLease,
1213
+ step: Schema7.String,
1214
+ number: Schema7.String,
1215
+ head: Schema7.String,
1216
+ note: Schema7.String
1217
+ },
1218
+ success: Schema7.Struct({ closed: Schema7.Boolean, head: Schema7.optionalKey(Schema7.String) }),
1219
+ error: RunnerRpcError
1220
+ }), Rpc.make("RerunPipeline", {
1221
+ payload: {
1222
+ lease: ProgramLease,
1223
+ step: Schema7.String,
1224
+ changeRequestId: Schema7.optionalKey(Schema7.String),
1225
+ ref: Schema7.optionalKey(Schema7.String),
1226
+ all: Schema7.optionalKey(Schema7.Boolean)
1227
+ },
1228
+ success: Schema7.Struct({ head: Schema7.String, pipelines: Schema7.Int }),
1229
+ error: RunnerRpcError
877
1230
  }), Rpc.make("PublishRelease", {
878
1231
  payload: {
879
1232
  lease: ProgramLease,
@@ -885,64 +1238,37 @@ class RunnerRpcs extends RpcGroup.make(Rpc.make("Claim", {
885
1238
  },
886
1239
  success: Schema7.Struct({ tag: Schema7.String, revision: Schema7.String, url: Schema7.String }),
887
1240
  error: RunnerRpcError
888
- }), Rpc.make("ReportSteer", {
889
- payload: { workUnitId: Schema7.String, messageId: Schema7.String, delivered: Schema7.Boolean },
890
- success: Schema7.Void,
891
- error: RunnerRpcError
892
- }), Rpc.make("AppendTranscript", {
893
- payload: { workUnitId: Schema7.String, entries: Schema7.Array(TranscriptAppendEntry).check(Schema7.isMaxLength(100)) },
894
- success: Schema7.Void,
1241
+ }), Rpc.make("ProgramSecrets", {
1242
+ payload: { lease: ProgramLease },
1243
+ success: Schema7.Record(Schema7.String, Schema7.String),
895
1244
  error: RunnerRpcError
896
- }), Rpc.make("CreateCheckpointFile", {
897
- payload: { lease: ProgramLease, byteSize: Schema7.Int, sha256: Schema7.String },
1245
+ })).middleware(RunnerAuthentication) {
1246
+ }
1247
+
1248
+ class RunnerRunFileRpcs extends RpcGroup.make(Rpc.make("CreateRunFile", {
1249
+ payload: {
1250
+ lease: ProgramLease,
1251
+ step: Schema7.String,
1252
+ name: Schema7.String,
1253
+ caption: Schema7.optional(Schema7.String),
1254
+ contentType: Schema7.String,
1255
+ byteSize: Schema7.Int,
1256
+ sha256: Schema7.String
1257
+ },
898
1258
  success: Schema7.Struct({ file: RunFileRecord, upload: Schema7.optional(RunFileUpload) }),
899
1259
  error: Schema7.Union([RunnerRpcError, RunFileRefused])
900
- }), Rpc.make("CheckpointFileParts", {
1260
+ }), Rpc.make("RunFileParts", {
901
1261
  payload: { lease: ProgramLease, fileId: Schema7.String, partNumbers: Schema7.Array(Schema7.Int) },
902
1262
  success: Schema7.Struct({ parts: Schema7.Array(RunFilePartUrl) }),
903
1263
  error: RunnerRpcError
904
- }), Rpc.make("CompleteCheckpointFile", {
1264
+ }), Rpc.make("CompleteRunFile", {
905
1265
  payload: { lease: ProgramLease, fileId: Schema7.String, parts: Schema7.optional(Schema7.Array(UploadedRunFilePart)) },
906
1266
  success: RunFileRecord,
907
1267
  error: RunnerRpcError
908
- }), Rpc.make("SaveCheckpoint", {
909
- payload: { lease: ProgramLease, checkpoint: StepCheckpoint },
910
- success: Schema7.Void,
911
- error: RunnerRpcError
912
- }), Rpc.make("ResumeCheckpoint", {
913
- payload: { lease: ProgramLease },
914
- success: Schema7.UndefinedOr(ResumedCheckpoint),
915
- error: RunnerRpcError
916
- }), Rpc.make("SettledCheckpoints", {
917
- success: Schema7.Array(Schema7.Struct({
918
- stepAttemptId: Schema7.String,
919
- ref: Schema7.optionalKey(Schema7.String),
920
- repoBinding: Schema7.optionalKey(WorkUnitRepoBinding)
921
- })),
922
- error: RunnerRpcError
923
- }), Rpc.make("ForgetCheckpoints", {
924
- payload: { stepAttemptIds: Schema7.Array(Schema7.String) },
925
- success: Schema7.Void,
926
- error: RunnerRpcError
927
- }), Rpc.make("Bundle", {
928
- payload: { digest: Schema7.String },
929
- success: Schema7.Struct({ bundle: Schema7.String }),
930
- error: RunnerRpcError
931
- }), Rpc.make("SettledRuns", {
932
- payload: { runIds: Schema7.Array(Schema7.String) },
933
- success: Schema7.Array(Schema7.String),
934
- error: RunnerRpcError
935
- }), Rpc.make("ProgramSecrets", {
936
- payload: { lease: ProgramLease },
937
- success: Schema7.Record(Schema7.String, Schema7.String),
938
- error: RunnerRpcError
939
- }), Rpc.make("Suspend", { payload: { lease: ProgramLease }, error: RunnerRpcError }), Rpc.make("FinishProgram", { payload: { lease: ProgramLease, outcome: ProgramOutcome }, error: RunnerRpcError }), Rpc.make("Signals", {
940
- payload: { runnerReplicaId: Schema7.String },
941
- success: RunnerSignal,
942
- error: RunnerRpcError,
943
- stream: true
944
1268
  })).middleware(RunnerAuthentication) {
945
1269
  }
1270
+ var ProgramRpcs = RunnerJournalRpcs.merge(RunnerCapabilityRpcs, RunnerRunFileRpcs);
1271
+ var RunnerRpcs = RunnerReplicaRpcs.merge(RunnerJournalRpcs, RunnerCapabilityRpcs, RunnerRunFileRpcs);
946
1272
 
947
1273
  // packages/sdk/src/program/engine.ts
948
1274
  import { Workflow, WorkflowEngine } from "effect/workflow";
@@ -1044,6 +1370,8 @@ var emptyWorkflow = Workflow.make("kitman-loop/none", { payload: {}, idempotency
1044
1370
  var replayStatuses = new Set([401, 403, 409, 429]);
1045
1371
  var isRunnerRpcError = Schema8.is(RunnerRpcError);
1046
1372
  var isRunFileRefused = Schema8.is(RunFileRefused);
1373
+ var issues = SchemaIssue.makeFormatterStandardSchemaV1();
1374
+ var refusedFields = (issue) => [...new Set(issues(issue).issues.map(({ path }) => (path ?? []).map(String).join(".")))].join(", ");
1047
1375
  var refusedStep2 = (cause) => {
1048
1376
  if (isRunFileRefused(cause))
1049
1377
  return true;
@@ -1051,42 +1379,61 @@ var refusedStep2 = (cause) => {
1051
1379
  return true;
1052
1380
  return isRunnerRpcError(cause) && cause.status >= 400 && cause.status < 500 && !replayStatuses.has(cause.status);
1053
1381
  };
1054
- var requested = (step, request) => request.pipe(Effect2.catch((cause) => refusedStep2(cause) ? Effect2.fail(new StepFailed2({ step, reason: cause.message })) : Effect2.die(new JournalWriteFailed2({ cause }))));
1055
- var runnerHost = (journal) => ({
1056
- putQuestion: (launch) => requested(launch.step, journal.putQuestion({
1382
+ var requested2 = (step, request) => request.pipe(Effect2.catch((cause) => refusedStep2(cause) ? Effect2.fail(new StepFailed2({ step, reason: cause.message })) : Effect2.die(new JournalWriteFailed2({ cause }))), Effect2.catchDefect((defect) => defect instanceof Error && SchemaIssue.isIssue(defect.cause) ? Effect2.fail(new StepFailed2({
1383
+ step,
1384
+ reason: `Kitman cannot take this Step's request: invalid ${refusedFields(defect.cause)}`
1385
+ })) : Effect2.die(defect)));
1386
+ var runnerHost = (capabilities) => ({
1387
+ putQuestion: (launch) => requested2(launch.step, capabilities.putQuestion({
1057
1388
  step: launch.step,
1058
1389
  prompt: launch.prompt,
1059
1390
  deferredName: answerDeferred2(launch.step).name,
1391
+ ...questionAdvice(launch),
1060
1392
  ...launch.options === undefined ? undefined : { options: launch.options },
1061
- ...launch.verification === undefined ? undefined : { verification: launch.verification }
1393
+ ...launch.verification === undefined ? undefined : { verification: launch.verification },
1394
+ ...launch.default === undefined ? undefined : { default: launch.default },
1395
+ ...launch.timeoutMillis === undefined ? undefined : { timeoutMillis: launch.timeoutMillis }
1062
1396
  })).pipe(Effect2.asVoid),
1063
- startVerification: (launch) => requested(launch.step, journal.startVerification({
1397
+ startVerification: (launch) => requested2(launch.step, capabilities.startVerification({
1064
1398
  step: launch.step,
1065
- deferredName: verifyDeferred2(launch.step).name,
1399
+ deferredName: (launch.measure === undefined ? verifyDeferred2 : measureDeferred2)(launch.step).name,
1066
1400
  ...launch.revision === undefined ? undefined : { revision: launch.revision },
1067
- ...launch.checks === undefined ? undefined : { checks: launch.checks }
1401
+ ...launch.checks === undefined ? undefined : { checks: launch.checks },
1402
+ ...launch.suggested === undefined ? undefined : { suggested: launch.suggested },
1403
+ ...launch.measure === undefined ? undefined : { measure: launch.measure }
1068
1404
  })).pipe(Effect2.asVoid),
1069
- startAgentWork: (launch) => requested(launch.step, journal.startAgentStep({
1405
+ startAgentWork: (launch) => requested2(launch.step, capabilities.startAgentStep({
1070
1406
  step: launch.step,
1071
- deferredName: agentWorkDeferred2(launch.step).name,
1407
+ deferredName: launch.deferredName,
1072
1408
  role: launch.role,
1073
1409
  agentId: launch.agent,
1074
1410
  prompt: launch.prompt,
1411
+ ...launch.skill === undefined ? undefined : { skill: launch.skill },
1075
1412
  outputSchema: launch.output,
1076
- ...launch.secrets === undefined ? undefined : { secrets: launch.secrets }
1413
+ ...launch.secrets === undefined ? undefined : { secrets: launch.secrets },
1414
+ ...launch.timeoutMillis === undefined ? undefined : { timeoutMillis: launch.timeoutMillis },
1415
+ ...launch.mergeTarget === undefined ? undefined : { mergeTarget: launch.mergeTarget }
1077
1416
  })).pipe(Effect2.asVoid),
1078
- admitChild: (launch) => requested(launch.step, journal.admitChild({
1417
+ admitChild: (launch) => requested2(launch.step, capabilities.admitChild({
1079
1418
  step: launch.step,
1080
1419
  loop: launch.loop,
1081
1420
  input: launch.input,
1082
1421
  deferredName: childDeferred2(launch.step).name
1083
1422
  })).pipe(Effect2.asVoid),
1084
- awaitEvent: (launch) => requested(launch.step, journal.awaitEvent({
1423
+ claimResource: (launch) => requested2(launch.step, capabilities.claimResource({
1424
+ step: launch.step,
1425
+ deferredName: (launch.action === "let_go" ? letGoDeferred2 : claimDeferred2)(launch.step).name,
1426
+ resource: launch.resource,
1427
+ action: launch.action
1428
+ })),
1429
+ awaitEvent: (launch) => requested2(launch.step, capabilities.awaitEvent({
1085
1430
  step: launch.step,
1086
1431
  deferredName: eventDeferred2(launch.step).name,
1087
1432
  event: launch.event,
1088
1433
  ...launch.filter === undefined ? undefined : { filter: launch.filter },
1089
- timeoutMillis: launch.timeoutMillis
1434
+ timeoutMillis: launch.timeoutMillis,
1435
+ ...launch.since === undefined ? undefined : { since: launch.since },
1436
+ ...launch.or === undefined ? undefined : { or: launch.or }
1090
1437
  }))
1091
1438
  });
1092
1439
  var put2 = (target, contentType, body) => Effect2.gen(function* () {
@@ -1122,8 +1469,8 @@ var uploadRunFile2 = (files, file) => Effect2.gen(function* () {
1122
1469
  return slotted;
1123
1470
  return yield* upload.kind === "single" ? readRange(file.path, 0, byteSize).pipe(Effect2.flatMap((body) => put2(upload, contentType, body)), Effect2.andThen(files.completeRunFile({ fileId: slotted.id }))) : Effect2.flatMap(uploadParts(files, file.path, contentType, slotted.id, upload), (parts) => files.completeRunFile({ fileId: slotted.id, parts }));
1124
1471
  });
1125
- var keepFile = (journal, step, { path, caption }) => Effect2.gen(function* () {
1126
- const kept = yield* uploadRunFile2(journal, { step, name: path.split("/").at(-1) ?? path, path, caption }).pipe(Effect2.catch((cause) => isPlatformError(cause) ? Effect2.fail(new StepFailed2({ step, reason: `Could not read ${path}: ${cause.message}` })) : requested(step, Effect2.fail(cause))));
1472
+ var keepFile = (files, step, { path, caption }) => Effect2.gen(function* () {
1473
+ const kept = yield* uploadRunFile2(files, { step, name: path.split("/").at(-1) ?? path, path, caption }).pipe(Effect2.catch((cause) => isPlatformError(cause) ? Effect2.fail(new StepFailed2({ step, reason: `Could not read ${path}: ${cause.message}` })) : requested2(step, Effect2.fail(cause))));
1127
1474
  if (kept.status !== "available")
1128
1475
  return yield* new StepFailed2({
1129
1476
  step,
@@ -1131,9 +1478,9 @@ var keepFile = (journal, step, { path, caption }) => Effect2.gen(function* () {
1131
1478
  });
1132
1479
  return { id: kept.id };
1133
1480
  });
1134
- var runnerActivities = (journal, services) => ({
1481
+ var runnerActivities = (capabilities, services) => ({
1135
1482
  changeRequest: {
1136
- run: (request, step) => requested(step, journal.performHostEffect({
1483
+ run: (request, step) => requested2(step, capabilities.performHostEffect({
1137
1484
  step,
1138
1485
  effect: {
1139
1486
  kind: "change_request",
@@ -1144,7 +1491,7 @@ var runnerActivities = (journal, services) => ({
1144
1491
  })).pipe(Effect2.filterOrFail((opened) => opened !== undefined, () => new StepFailed2({ step, reason: "Kitman opened no ChangeRequest" })))
1145
1492
  },
1146
1493
  writeBack: {
1147
- run: (request, step) => requested(step, journal.performHostEffect({
1494
+ run: (request, step) => requested2(step, capabilities.performHostEffect({
1148
1495
  step,
1149
1496
  effect: {
1150
1497
  kind: "write_back",
@@ -1154,32 +1501,43 @@ var runnerActivities = (journal, services) => ({
1154
1501
  })).pipe(Effect2.asVoid)
1155
1502
  },
1156
1503
  artifact: {
1157
- run: ({ files, ...request }, step) => requested(step, journal.storeArtifact({
1504
+ run: ({ files, ...request }, step) => requested2(step, capabilities.storeArtifact({
1158
1505
  step,
1159
1506
  ...request,
1160
1507
  ...files === undefined ? undefined : { fileIds: files.map((shown) => shown.id) }
1161
1508
  }))
1162
1509
  },
1163
- file: { run: (request, step) => keepFile(journal, step, request).pipe(Effect2.provideContext(services)) },
1164
- note: { run: (request, step) => requested(step, journal.recordNote({ step, ...request })) },
1510
+ file: { run: (request, step) => keepFile(capabilities, step, request).pipe(Effect2.provideContext(services)) },
1511
+ note: { run: (request, step) => requested2(step, capabilities.recordNote({ step, ...request })) },
1165
1512
  createTasks: {
1166
- run: (request, step) => requested(step, Effect2.map(journal.createPlanTasks(request.tickets), (tasks) => ({ tasks })))
1513
+ run: (request, step) => requested2(step, Effect2.map(capabilities.createPlanTasks(request.tickets, request.projectId), (tasks) => ({ tasks })))
1167
1514
  },
1515
+ alertTask: { run: (request, step) => requested2(step, capabilities.alertTask({ step, ...request })) },
1168
1516
  integrationBranch: {
1169
- run: (request, step) => requested(step, journal.integrationBranch(request.repoBindingId))
1517
+ run: (request, step) => requested2(step, capabilities.integrationBranch(request.repoBindingId))
1170
1518
  },
1171
- transcripts: { run: (request, step) => requested(step, journal.readTranscripts({ step, ...request })) },
1172
- propose: { run: (proposal, step) => requested(step, journal.propose({ step, proposal })) },
1173
- projectActivity: { run: (request, step) => requested(step, journal.readProject({ step, ...request })) },
1174
- draftUpdate: { run: (request, step) => requested(step, journal.draftUpdate({ step, ...request })) },
1519
+ transcripts: { run: (request, step) => requested2(step, capabilities.readTranscripts({ step, ...request })) },
1520
+ changeRequestRead: {
1521
+ pipeline: (request, step) => requested2(step, capabilities.pipelineStatus({ step, ...request })),
1522
+ reviewThreads: (request, step) => requested2(step, capabilities.reviewThreads({ step, ...request })),
1523
+ opened: (request, step) => requested2(step, capabilities.openChangeRequests({ step, ...request })),
1524
+ own: (step) => requested2(step, capabilities.ownChangeRequests({ step }))
1525
+ },
1526
+ propose: { run: (proposal, step) => requested2(step, capabilities.propose({ step, proposal })) },
1527
+ projectActivity: { run: (request, step) => requested2(step, capabilities.readProject({ step, ...request })) },
1528
+ draftUpdate: { run: (request, step) => requested2(step, capabilities.draftUpdate({ step, ...request })) },
1175
1529
  mergeChangeRequest: {
1176
- run: (request, step) => requested(step, journal.mergeChangeRequest({ step, ...request }))
1530
+ run: (request, step) => requested2(step, capabilities.mergeChangeRequest({ step, ...request })),
1531
+ close: (request, step) => requested2(step, capabilities.closeChangeRequest({ step, ...request })),
1532
+ rerun: (request, step) => requested2(step, capabilities.rerunPipeline({ step, ...request })),
1533
+ report: (request, step) => requested2(step, capabilities.reportPipeline({ step, ...request })),
1534
+ approve: (request, step) => requested2(step, capabilities.approveChangeRequest({ step, ...request }))
1177
1535
  },
1178
1536
  release: {
1179
- run: ({ revision, ...request }, step) => requested(step, journal.publishRelease({ step, ...request, ...revision === undefined ? undefined : { revision } }))
1537
+ run: ({ revision, ...request }, step) => requested2(step, capabilities.publishRelease({ step, ...request, ...revision === undefined ? undefined : { revision } }))
1180
1538
  },
1181
1539
  comment: {
1182
- run: (request, step) => requested(step, journal.performHostEffect({ step, effect: { kind: "post_comment", ...request } })).pipe(Effect2.asVoid)
1540
+ run: (request, step) => requested2(step, capabilities.performHostEffect({ step, effect: { kind: "post_comment", ...request } })).pipe(Effect2.asVoid)
1183
1541
  }
1184
1542
  });
1185
1543
  var describeFailure = (cause) => {
@@ -1188,14 +1546,14 @@ var describeFailure = (cause) => {
1188
1546
  return summary.slice(0, 4000) || "Program failed";
1189
1547
  };
1190
1548
  var journalLoss = (cause) => cause.reasons.flatMap((reason) => Cause.isDieReason(reason) && reason.defect instanceof JournalWriteFailed2 ? [reason.defect] : [])[0];
1191
- var runProgram2 = (loop, work, journal) => Effect2.scoped(Effect2.gen(function* () {
1549
+ var runProgram2 = (loop, work, { journal, capabilities }) => Effect2.scoped(Effect2.gen(function* () {
1192
1550
  const services = yield* Effect2.context();
1193
1551
  const { engine, encoded } = yield* makeEncodedEngine(work.journal, journal);
1194
1552
  const workflow = loopWorkflow2(loop);
1195
1553
  const execute = executeLoop2(loop, {
1196
- host: runnerHost(journal),
1197
- activities: runnerActivities(journal, services),
1198
- granted: new Set(loop.capabilities.filter((capability) => work.granted.includes(capability)))
1554
+ host: runnerHost(capabilities),
1555
+ activities: runnerActivities(capabilities, services),
1556
+ granted: new Set(capabilitiesOf2(loop).filter((capability) => work.granted.includes(capability)))
1199
1557
  });
1200
1558
  yield* Layer.build(workflow.toLayer(execute).pipe(Layer.provide(Layer.succeed(WorkflowEngine.WorkflowEngine)(engine))));
1201
1559
  const result = yield* encoded.execute(workflow, {
@@ -1236,36 +1594,47 @@ var rpcRunFiles2 = (rpc, lease) => ({
1236
1594
  runFileParts: (request) => Effect2.map(rpc.runFileParts({ lease, ...request, partNumbers: [...request.partNumbers] }), ({ parts }) => parts),
1237
1595
  completeRunFile: ({ parts, ...request }) => rpc.completeRunFile({ lease, ...request, ...parts === undefined ? undefined : { parts: [...parts] } })
1238
1596
  });
1239
- var rpcProgramJournal2 = (rpc, work) => {
1597
+ var rpcProgramPorts2 = (rpc, work) => {
1240
1598
  const lease = programLease2(work);
1241
- return {
1599
+ const journal = {
1242
1600
  recordActivity: (entry) => rpc.recordActivity({ lease, ...entry }),
1243
1601
  deferredDone: (entry) => rpc.deferredDone({ lease, ...entry }),
1244
1602
  scheduleClock: (clock) => rpc.scheduleClock({ lease, ...clock }),
1603
+ suspend: rpc.suspend({ lease }),
1604
+ finish: (outcome) => rpc.finishProgram({ lease, outcome })
1605
+ };
1606
+ const capabilities = {
1245
1607
  putQuestion: (question) => rpc.putQuestion({
1246
1608
  lease,
1247
1609
  step: question.step,
1248
1610
  prompt: question.prompt,
1249
1611
  deferredName: question.deferredName,
1612
+ ...questionAdvice(question),
1250
1613
  ...question.options === undefined ? undefined : { options: [...question.options] },
1251
- ...question.verification === undefined ? undefined : { verification: question.verification }
1614
+ ...question.verification === undefined ? undefined : { verification: question.verification },
1615
+ ...question.default === undefined ? undefined : { default: question.default },
1616
+ ...question.timeoutMillis === undefined ? undefined : { timeoutMillis: question.timeoutMillis }
1252
1617
  }),
1253
1618
  startVerification: (verification) => rpc.startVerification({
1254
1619
  lease,
1255
1620
  step: verification.step,
1256
1621
  deferredName: verification.deferredName,
1257
1622
  ...verification.revision === undefined ? undefined : { revision: verification.revision },
1258
- ...verification.checks === undefined ? undefined : { checks: [...verification.checks] }
1623
+ ...verification.checks === undefined ? undefined : { checks: [...verification.checks] },
1624
+ ...verification.suggested === undefined ? undefined : { suggested: [...verification.suggested] },
1625
+ ...verification.measure === undefined ? undefined : { measure: verification.measure }
1259
1626
  }),
1260
1627
  startAgentStep: ({ secrets, ...step }) => rpc.startAgentStep({ lease, ...step, ...secrets === undefined ? undefined : { secrets: [...secrets] } }),
1261
1628
  awaitEvent: (wait) => rpc.awaitEvent({ lease, ...wait }),
1629
+ claimResource: (claim) => rpc.claimResource({ lease, ...claim }),
1262
1630
  admitChild: (child) => rpc.admitChild({ lease, ...child }),
1263
1631
  storeArtifact: ({ fileIds, ...artifact }) => rpc.storeArtifact({ lease, ...artifact, ...fileIds === undefined ? undefined : { fileIds: [...fileIds] } }),
1264
1632
  ...rpcRunFiles2(rpc, lease),
1265
1633
  recordNote: (note) => rpc.recordNote({ lease, ...note }),
1266
1634
  performHostEffect: (request) => rpc.performHostEffect({ lease, ...request }),
1267
- createPlanTasks: (tickets) => rpc.createPlanTasks({
1635
+ createPlanTasks: (tickets, projectId) => rpc.createPlanTasks({
1268
1636
  lease,
1637
+ ...projectId === undefined ? undefined : { projectId },
1269
1638
  tickets: tickets.map((ticket) => ({
1270
1639
  key: ticket.key,
1271
1640
  title: ticket.title,
@@ -1276,7 +1645,13 @@ var rpcProgramJournal2 = (rpc, work) => {
1276
1645
  }))
1277
1646
  }),
1278
1647
  integrationBranch: (repoBindingId) => rpc.integrationBranch({ lease, ...repoBindingId === undefined ? undefined : { repoBindingId } }),
1648
+ alertTask: (request) => rpc.alertTask({ lease, ...request }),
1279
1649
  readTranscripts: (request) => rpc.readTranscripts({ lease, ...request }),
1650
+ pipelineStatus: (request) => rpc.pipelineStatus({ lease, ...request }),
1651
+ reportPipeline: (request) => rpc.reportPipeline({ lease, ...request }),
1652
+ reviewThreads: (request) => rpc.reviewThreads({ lease, ...request }),
1653
+ openChangeRequests: (request) => rpc.openChangeRequests({ lease, ...request }),
1654
+ ownChangeRequests: (request) => rpc.ownChangeRequests({ lease, ...request }),
1280
1655
  propose: ({ step, proposal }) => rpc.propose({
1281
1656
  lease,
1282
1657
  step,
@@ -1285,6 +1660,7 @@ var rpcProgramJournal2 = (rpc, work) => {
1285
1660
  title: proposal.title,
1286
1661
  description: proposal.description,
1287
1662
  ...proposal.teamId === undefined ? undefined : { teamId: proposal.teamId },
1663
+ ...proposal.key === undefined ? undefined : { key: proposal.key },
1288
1664
  citations: [...proposal.citations]
1289
1665
  }
1290
1666
  }),
@@ -1299,10 +1675,12 @@ var rpcProgramJournal2 = (rpc, work) => {
1299
1675
  }
1300
1676
  }),
1301
1677
  mergeChangeRequest: (request) => rpc.mergeChangeRequest({ lease, ...request }),
1302
- publishRelease: (request) => rpc.publishRelease({ lease, ...request }),
1303
- suspend: rpc.suspend({ lease }),
1304
- finish: (outcome) => rpc.finishProgram({ lease, outcome })
1678
+ closeChangeRequest: (request) => rpc.closeChangeRequest({ lease, ...request }),
1679
+ approveChangeRequest: (request) => rpc.approveChangeRequest({ lease, ...request }),
1680
+ rerunPipeline: (request) => rpc.rerunPipeline({ lease, ...request }),
1681
+ publishRelease: (request) => rpc.publishRelease({ lease, ...request })
1305
1682
  };
1683
+ return { journal, capabilities };
1306
1684
  };
1307
1685
 
1308
1686
  // packages/live/src/rpc/runner-client.ts
@@ -1321,30 +1699,28 @@ function runnerRpcUrl(apiUrl) {
1321
1699
  url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
1322
1700
  return url.toString();
1323
1701
  }
1324
- var makeRunnerRpcClient = (options) => Effect3.gen(function* () {
1702
+ var authorizer = (options) => (call) => Effect3.flatMap(options.bearer, (token) => RpcClient.withHeaders(call, {
1703
+ authorization: `Bearer ${token}`,
1704
+ [RunnerHeaders.runnerId]: options.runnerId,
1705
+ [RunnerHeaders.protocolVersion]: String(RunnerRpcProtocolVersion)
1706
+ }));
1707
+ var RunnerProcessRpcs = RunnerReplicaRpcs.merge(RunnerRunFileRpcs);
1708
+ var makeProgramRpcClient = (options) => Effect3.gen(function* () {
1325
1709
  const protocol = yield* Layer2.build(options.protocol);
1326
- const client = yield* RpcClient.make(RunnerRpcs).pipe(Effect3.provideContext(protocol));
1327
- const authorized = (call) => Effect3.flatMap(options.bearer, (token) => RpcClient.withHeaders(call, {
1328
- authorization: `Bearer ${token}`,
1329
- [RunnerHeaders.runnerId]: options.runnerId,
1330
- [RunnerHeaders.protocolVersion]: String(RunnerRpcProtocolVersion)
1331
- }));
1710
+ const client = yield* RpcClient.make(ProgramRpcs).pipe(Effect3.provideContext(protocol));
1711
+ const authorized = authorizer(options);
1332
1712
  return {
1333
- claim: (input) => authorized(client.Claim(input)),
1334
- heartbeat: (input) => authorized(client.Heartbeat(input)),
1335
- complete: (input) => authorized(client.Complete(input)),
1336
- release: (input) => authorized(client.Release(input)),
1337
1713
  recordActivity: (input) => authorized(client.RecordActivity(input)),
1338
1714
  deferredDone: (input) => authorized(client.DeferredDone(input)),
1339
1715
  scheduleClock: (input) => authorized(client.ScheduleClock(input)),
1340
- putQuestion: (input) => authorized(client.PutQuestion(input)),
1341
- programSecrets: (input) => authorized(client.ProgramSecrets(input)),
1342
1716
  suspend: (input) => authorized(client.Suspend(input)),
1343
1717
  finishProgram: (input) => authorized(client.FinishProgram(input)),
1718
+ putQuestion: (input) => authorized(client.PutQuestion(input)),
1719
+ programSecrets: (input) => authorized(client.ProgramSecrets(input)),
1344
1720
  startAgentStep: (input) => authorized(client.StartAgentStep(input)),
1345
1721
  startVerification: (input) => authorized(client.StartVerification(input)),
1346
- knownEvidence: (input) => authorized(client.KnownEvidence(input)),
1347
1722
  awaitEvent: (input) => authorized(client.AwaitEvent(input)),
1723
+ claimResource: (input) => authorized(client.ClaimResource(input)),
1348
1724
  admitChild: (input) => authorized(client.AdmitChild(input)),
1349
1725
  storeArtifact: (input) => authorized(client.StoreArtifact(input)),
1350
1726
  createRunFile: (input) => authorized(client.CreateRunFile(input)),
@@ -1353,25 +1729,22 @@ var makeRunnerRpcClient = (options) => Effect3.gen(function* () {
1353
1729
  recordNote: (input) => authorized(client.RecordNote(input)),
1354
1730
  performHostEffect: (input) => authorized(client.PerformHostEffect(input)),
1355
1731
  createPlanTasks: (input) => authorized(client.CreatePlanTasks(input)),
1732
+ alertTask: (input) => authorized(client.AlertTask(input)),
1356
1733
  readTranscripts: (input) => authorized(client.ReadTranscripts(input)),
1734
+ pipelineStatus: (input) => authorized(client.PipelineStatus(input)),
1735
+ reportPipeline: (input) => authorized(client.ReportPipeline(input)),
1736
+ reviewThreads: (input) => authorized(client.ReviewThreads(input)),
1737
+ openChangeRequests: (input) => authorized(client.OpenChangeRequests(input)),
1738
+ ownChangeRequests: (input) => authorized(client.OwnChangeRequests(input)),
1357
1739
  propose: (input) => authorized(client.Propose(input)),
1358
1740
  readProject: (input) => authorized(client.ReadProject(input)),
1359
1741
  draftUpdate: (input) => authorized(client.DraftUpdate(input)),
1360
1742
  integrationBranch: (input) => authorized(client.IntegrationBranch(input)),
1361
1743
  mergeChangeRequest: (input) => authorized(client.MergeChangeRequest(input)),
1362
- publishRelease: (input) => authorized(client.PublishRelease(input)),
1363
- bundle: (digest) => authorized(client.Bundle({ digest })),
1364
- settledRuns: (runIds) => authorized(client.SettledRuns({ runIds })),
1365
- reportSteer: (input) => authorized(client.ReportSteer(input)),
1366
- appendTranscript: (input) => authorized(client.AppendTranscript(input)),
1367
- createCheckpointFile: (input) => authorized(client.CreateCheckpointFile(input)),
1368
- checkpointFileParts: (input) => authorized(client.CheckpointFileParts(input)),
1369
- completeCheckpointFile: (input) => authorized(client.CompleteCheckpointFile(input)),
1370
- saveCheckpoint: (input) => authorized(client.SaveCheckpoint(input)),
1371
- resumeCheckpoint: (input) => authorized(client.ResumeCheckpoint(input)),
1372
- settledCheckpoints: authorized(client.SettledCheckpoints()),
1373
- forgetCheckpoints: (stepAttemptIds) => authorized(client.ForgetCheckpoints({ stepAttemptIds })),
1374
- listen: (runnerReplicaId, onSignal) => authorized(Stream2.runForEach(client.Signals({ runnerReplicaId }), onSignal))
1744
+ closeChangeRequest: (input) => authorized(client.CloseChangeRequest(input)),
1745
+ approveChangeRequest: (input) => authorized(client.ApproveChangeRequest(input)),
1746
+ rerunPipeline: (input) => authorized(client.RerunPipeline(input)),
1747
+ publishRelease: (input) => authorized(client.PublishRelease(input))
1375
1748
  };
1376
1749
  });
1377
1750
 
@@ -1387,13 +1760,16 @@ import * as Redacted2 from "effect/Redacted";
1387
1760
  import * as Schema9 from "effect/Schema";
1388
1761
  import * as FetchHttpClient from "effect/http/FetchHttpClient";
1389
1762
  var describeFlag2 = "--kitman-describe";
1763
+ var DescribedKit = Schema9.Struct({
1764
+ name: Schema9.String,
1765
+ version: Schema9.String,
1766
+ loops: Schema9.Array(LoopManifest),
1767
+ agents: Schema9.Record(Schema9.String, Schema9.Json),
1768
+ schedules: Schema9.optionalKey(Schema9.Record(Schema9.String, Schema9.Json)),
1769
+ setup: Schema9.optionalKey(KitSetup)
1770
+ });
1390
1771
  var Described2 = Schema9.Union([
1391
- Schema9.TaggedStruct("Described", {
1392
- loops: Schema9.Array(LoopManifest),
1393
- agents: Schema9.Record(Schema9.String, Schema9.Json),
1394
- schedules: Schema9.optionalKey(Schema9.Record(Schema9.String, Schema9.Json)),
1395
- kits: Schema9.optionalKey(Schema9.Record(Schema9.String, Schema9.Json))
1396
- }),
1772
+ Schema9.TaggedStruct("Described", { kits: Schema9.Array(DescribedKit) }),
1397
1773
  Schema9.TaggedStruct("Refused", { error: Schema9.Union([ManifestInvalid2, LoopCheckError2]) })
1398
1774
  ]);
1399
1775
  var encodeDescribed = Schema9.encodeEffect(Schema9.fromJsonString(Schema9.toCodecJson(Described2)));
@@ -1482,35 +1858,62 @@ var networkGuard2 = (input) => {
1482
1858
  });
1483
1859
  return { fetch, journal };
1484
1860
  };
1485
- var describe = (config) => Effect4.gen(function* () {
1486
- const loops = yield* Effect4.forEach(config.loops, loopManifest2);
1487
- for (const loop of config.loops)
1488
- for (const check of loop.checks ?? [])
1489
- yield* checkLoop2(loop, check);
1490
- return {
1491
- _tag: "Described",
1492
- loops,
1493
- agents: config.agents ?? {},
1494
- ...config.schedules === undefined ? undefined : { schedules: config.schedules },
1495
- ...config.kits === undefined ? undefined : { kits: config.kits }
1861
+ var carriedKits2 = (config, identity, packages) => {
1862
+ const identities = new Map(packages);
1863
+ const carried = [];
1864
+ const visited = new Set;
1865
+ const visit = (kit) => {
1866
+ if (visited.has(kit.config))
1867
+ return;
1868
+ visited.add(kit.config);
1869
+ const index = carried.findIndex((known) => known.identity.name === kit.identity.name);
1870
+ const known = carried[index];
1871
+ if (known === undefined)
1872
+ carried.push(kit);
1873
+ else if (Bun.semver.order(kit.identity.version, known.identity.version) > 0)
1874
+ carried[index] = kit;
1875
+ for (const nested of kit.config.extends ?? []) {
1876
+ const nestedIdentity = identities.get(nested);
1877
+ if (nestedIdentity === undefined)
1878
+ throw new Error(`${kit.identity.name} extends a Kit the build cannot name: import it from a package it depends on, or from a local module with its own package.json`);
1879
+ visit({ identity: nestedIdentity, config: nested });
1880
+ }
1496
1881
  };
1882
+ visit({ identity, config });
1883
+ return carried;
1884
+ };
1885
+ var describe = (carried) => Effect4.gen(function* () {
1886
+ const kits = [];
1887
+ for (const { identity, config } of carried) {
1888
+ kits.push({
1889
+ ...identity,
1890
+ loops: yield* Effect4.forEach(config.loops, loopManifest2),
1891
+ agents: config.agents ?? {},
1892
+ ...config.schedules === undefined ? undefined : { schedules: config.schedules },
1893
+ ...config.setup === undefined ? undefined : { setup: config.setup }
1894
+ });
1895
+ for (const loop of config.loops)
1896
+ for (const check of loop.checks ?? [])
1897
+ yield* checkLoop2(loop, check);
1898
+ }
1899
+ return { _tag: "Described", kits };
1497
1900
  }).pipe(Effect4.catch((error) => Effect4.succeed({ _tag: "Refused", error })), Effect4.flatMap(encodeDescribed), Effect4.flatMap((described) => Effect4.callback((resume) => void process.stdout.write(described, () => resume(Effect4.void)))), Effect4.as(0));
1498
1901
  var readStdin = Effect4.tryPromise(() => Bun.stdin.text());
1499
1902
  var isWorkUnit = guard(ProgramWorkUnit);
1500
- var host = (config) => Effect4.gen(function* () {
1903
+ var host = (carried) => Effect4.gen(function* () {
1501
1904
  const loopId = yield* Config.String("KITMAN_LOOP_ID");
1502
1905
  const apiUrl = yield* Config.String("KITMAN_API_URL");
1503
1906
  const credential = yield* Config.Redacted("KITMAN_PROGRAM_CREDENTIAL");
1504
1907
  const work = yield* Schema9.decodeEffect(Schema9.fromJsonString(Schema9.Unknown))(yield* readStdin);
1505
1908
  if (!isWorkUnit(work))
1506
1909
  return yield* new ProgramRefused({ reason: "stdin holds no orchestration Work Unit" });
1507
- const loop = config.loops.find((candidate) => candidate.id === loopId);
1910
+ const loop = carried.flatMap((kit) => kit.config.loops).find((candidate) => candidate.id === loopId);
1508
1911
  if (loop === undefined)
1509
- return yield* new ProgramRefused({ reason: `The Package declares no Loop "${loopId}"` });
1912
+ return yield* new ProgramRefused({ reason: `The Kit carries no Loop "${loopId}"` });
1510
1913
  const hosts = yield* Config.option(Config.String(programHostsEnv2));
1511
1914
  const undeclared = yield* Config.option(Config.Literals(["fail", "warn"], undeclaredHostsEnv2));
1512
1915
  const proxy = yield* Config.option(Config.String("HTTPS_PROXY"));
1513
- const rpc = yield* makeRunnerRpcClient({
1916
+ const rpc = yield* makeProgramRpcClient({
1514
1917
  runnerId: work.lease.leaseOwnerId,
1515
1918
  bearer: Effect4.sync(() => Redacted2.value(credential)),
1516
1919
  protocol: runnerWebSocketProtocol(runnerRpcUrl(apiUrl), Option2.isSome(proxy) ? { proxy: proxy.value } : {})
@@ -1527,12 +1930,13 @@ var host = (config) => Effect4.gen(function* () {
1527
1930
  });
1528
1931
  if (guard !== undefined)
1529
1932
  globalThis.fetch = Object.assign(guard.fetch, { preconnect: globalThis.fetch.preconnect });
1530
- const journal = rpcProgramJournal2(rpc, work);
1531
- return yield* runProgram2(loop, work, guard === undefined ? journal : guard.journal(journal)).pipe(Effect4.provide(Layer3.merge(BunServices.layer, FetchHttpClient.layer)), Effect4.provideService(ConfigProvider.ConfigProvider, ConfigProvider.fromUnknown(secrets.value)), Effect4.as(0), Effect4.catchTag("JournalWriteFailed", (error) => Effect4.as(Effect4.logError(error.message), 1)));
1933
+ const ports = rpcProgramPorts2(rpc, work);
1934
+ return yield* runProgram2(loop, work, guard === undefined ? ports : { ...ports, journal: guard.journal(ports.journal) }).pipe(Effect4.provide(Layer3.merge(BunServices.layer, FetchHttpClient.layer)), Effect4.provideService(ConfigProvider.ConfigProvider, ConfigProvider.fromUnknown(secrets.value)), Effect4.as(0), Effect4.catchTag("JournalWriteFailed", (error) => Effect4.as(Effect4.logError(error.message), 1)));
1532
1935
  }).pipe(Effect4.scoped, Effect4.catch((error) => Effect4.as(Effect4.logError(error.message), 2)));
1533
- var runPackage2 = (config) => {
1534
- const program = process.argv.includes(describeFlag2) ? describe(config) : host(config);
1936
+ var runKit2 = (config, identity, packages) => {
1937
+ const carried = carriedKits2(config, identity, packages);
1938
+ const program = process.argv.includes(describeFlag2) ? describe(carried) : host(carried);
1535
1939
  BunRuntime.runMain(program.pipe(Effect4.flatMap((code) => Effect4.sync(() => process.exit(code)))));
1536
1940
  };
1537
1941
 
1538
- export { digestSha256, RunnerRpcProtocolVersion, JournalWriteFailed2, refusedStep2, uploadRunFile2, runProgram2, programLease2, rpcRunFiles2, rpcProgramJournal2, describeFlag2, Described2, programSecrets2, programHostsEnv2, undeclaredHostsEnv2, networkGuard2, runPackage2 };
1942
+ export { digestSha256, digestSha512, digestWith, kitmanMcpServer, RunnerRpcProtocolVersion, JournalWriteFailed2, refusedStep2, requested2, uploadRunFile2, runProgram2, programLease2, rpcRunFiles2, rpcProgramPorts2, describeFlag2, Described2, programSecrets2, programHostsEnv2, undeclaredHostsEnv2, networkGuard2, carriedKits2, runKit2 };