@kitman-sh/sdk 0.9.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-e1tqypyy.js → chunk-zvzw3zs4.js} +824 -419
  4. package/dist/loop/index.js +117 -3
  5. package/dist/program/index.js +8 -4
  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 +505 -10
  46. package/types/packages/live/src/rpc/runner-group.d.ts +958 -28
  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 +95 -3
  61. package/types/packages/sdk/src/program/host.d.ts +198 -36
  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)) })
78
+ ]);
79
+ var PluginSource = Schema.Union([
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)) })
42
96
  ]);
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)) }),
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
+ }),
46
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
+ })
135
+ ]);
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)) })
52
140
  ]);
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)),
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)
368
+ });
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)
269
390
  });
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
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,
@@ -688,6 +836,10 @@ class RunnerReplicaRpcs extends RpcGroup.make(Rpc.make("Claim", {
688
836
  payload: { stepAttemptIds: Schema7.Array(Schema7.String) },
689
837
  success: Schema7.Void,
690
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
691
843
  }), Rpc.make("Bundle", {
692
844
  payload: { digest: Schema7.String },
693
845
  success: Schema7.Struct({ bundle: Schema7.String }),
@@ -721,7 +873,13 @@ class RunnerCapabilityRpcs extends RpcGroup.make(Rpc.make("PutQuestion", {
721
873
  step: Schema7.String,
722
874
  prompt: Schema7.String,
723
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),
724
880
  verification: Schema7.optional(SuggestedVerification),
881
+ default: Schema7.optional(Schema7.String),
882
+ timeoutMillis: Schema7.optional(Schema7.Finite),
725
883
  deferredName: Schema7.String
726
884
  },
727
885
  success: Schema7.Struct({ questionId: Schema7.String }),
@@ -734,8 +892,11 @@ class RunnerCapabilityRpcs extends RpcGroup.make(Rpc.make("PutQuestion", {
734
892
  role: Schema7.String,
735
893
  agentId: Schema7.String,
736
894
  prompt: Schema7.String,
895
+ skill: Schema7.optionalKey(Schema7.String.check(Schema7.isMinLength(1))),
737
896
  outputSchema: Schema7.Json,
738
- 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)))
739
900
  },
740
901
  success: Schema7.Struct({ stepAttemptId: Schema7.String }),
741
902
  error: RunnerRpcError
@@ -745,7 +906,14 @@ class RunnerCapabilityRpcs extends RpcGroup.make(Rpc.make("PutQuestion", {
745
906
  step: Schema7.String,
746
907
  deferredName: Schema7.String,
747
908
  revision: Schema7.optionalKey(Schema7.String),
748
- 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
+ }))
749
917
  },
750
918
  success: Schema7.Struct({ verificationId: Schema7.String }),
751
919
  error: RunnerRpcError
@@ -756,7 +924,22 @@ class RunnerCapabilityRpcs extends RpcGroup.make(Rpc.make("PutQuestion", {
756
924
  deferredName: Schema7.String,
757
925
  event: Schema7.String,
758
926
  filter: Schema7.optional(Schema7.Record(Schema7.String, Schema7.Union([EventFilterValue, Schema7.Array(EventFilterValue)]))),
759
- 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"])
760
943
  },
761
944
  error: RunnerRpcError
762
945
  }), Rpc.make("AdmitChild", {
@@ -794,7 +977,14 @@ class RunnerCapabilityRpcs extends RpcGroup.make(Rpc.make("PutQuestion", {
794
977
  lease: ProgramLease,
795
978
  step: Schema7.String,
796
979
  effect: Schema7.Union([
797
- 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
+ }),
798
988
  Schema7.Struct({
799
989
  kind: Schema7.Literal("change_request"),
800
990
  title: Schema7.String,
@@ -810,14 +1000,33 @@ class RunnerCapabilityRpcs extends RpcGroup.make(Rpc.make("PutQuestion", {
810
1000
  },
811
1001
  success: Schema7.UndefinedOr(Schema7.Struct({ id: Schema7.String, number: Schema7.String, url: Schema7.String })),
812
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
813
1020
  }), Rpc.make("ReadTranscripts", {
814
1021
  payload: { lease: ProgramLease, step: Schema7.String, days: Schema7.Int },
815
1022
  success: Schema7.Struct({
816
1023
  runs: Schema7.Array(Schema7.Struct({
817
1024
  runId: Schema7.String,
818
1025
  loopId: Schema7.String,
1026
+ status: Schema7.optionalKey(Schema7.Literals(["completed", "failed", "canceled", "expired"])),
819
1027
  teamId: Schema7.optionalKey(Schema7.String),
820
1028
  failure: Schema7.optionalKey(Schema7.String),
1029
+ retried: Schema7.optionalKey(Schema7.Boolean),
821
1030
  entries: Schema7.Array(Schema7.Struct({
822
1031
  stepAttemptId: Schema7.String,
823
1032
  sequence: Schema7.Int,
@@ -827,6 +1036,65 @@ class RunnerCapabilityRpcs extends RpcGroup.make(Rpc.make("PutQuestion", {
827
1036
  }))
828
1037
  }),
829
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
830
1098
  }), Rpc.make("Propose", {
831
1099
  payload: {
832
1100
  lease: ProgramLease,
@@ -843,11 +1111,16 @@ class RunnerCapabilityRpcs extends RpcGroup.make(Rpc.make("PutQuestion", {
843
1111
  title: Schema7.String,
844
1112
  description: Schema7.String,
845
1113
  teamId: Schema7.optionalKey(Schema7.String),
1114
+ key: Schema7.optionalKey(Schema7.String),
846
1115
  citations: Schema7.NonEmptyArray(Schema7.Struct({ runId: Schema7.String, stepAttemptId: Schema7.String, sequence: Schema7.Int }))
847
1116
  })
848
1117
  ])
849
1118
  },
850
- 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
+ }),
851
1124
  error: RunnerRpcError
852
1125
  }), Rpc.make("ReadProject", {
853
1126
  payload: { lease: ProgramLease, step: Schema7.String, projectId: Schema7.String },
@@ -890,13 +1163,14 @@ class RunnerCapabilityRpcs extends RpcGroup.make(Rpc.make("PutQuestion", {
890
1163
  }), Rpc.make("CreatePlanTasks", {
891
1164
  payload: {
892
1165
  lease: ProgramLease,
1166
+ projectId: Schema7.optionalKey(Schema7.String),
893
1167
  tickets: Schema7.Array(Schema7.Struct({
894
1168
  key: Schema7.String,
895
1169
  title: Schema7.String,
896
1170
  body: Schema7.String,
897
1171
  acceptanceCriteria: Schema7.Array(Schema7.String),
898
1172
  blockedBy: Schema7.Array(Schema7.String),
899
- outcome: Schema7.optionalKey(Schema7.Literals(["feature", "bug", "refactor", "investigation", "docs", "migration"]))
1173
+ outcome: Schema7.optionalKey(Schema7.Literals(["feature", "bug", "refactor", "investigation", "docs", "migration", "performance"]))
900
1174
  }))
901
1175
  },
902
1176
  success: Schema7.Array(Schema7.Struct({ key: Schema7.String, taskId: Schema7.String })),
@@ -906,12 +1180,53 @@ class RunnerCapabilityRpcs extends RpcGroup.make(Rpc.make("PutQuestion", {
906
1180
  success: Schema7.Struct({ repoBindingId: Schema7.String, branch: Schema7.String, revision: Schema7.String }),
907
1181
  error: RunnerRpcError
908
1182
  }), Rpc.make("MergeChangeRequest", {
909
- 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
+ },
910
1189
  success: Schema7.Union([
911
1190
  Schema7.Struct({ status: Schema7.Literal("merged"), revision: Schema7.String }),
912
- Schema7.Struct({ status: Schema7.Literal("conflict") })
1191
+ Schema7.Struct({ status: Schema7.Literal("conflict") }),
1192
+ Schema7.Struct({ status: Schema7.Literal("moved"), head: Schema7.String })
1193
+ ]),
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 })
913
1208
  ]),
914
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
915
1230
  }), Rpc.make("PublishRelease", {
916
1231
  payload: {
917
1232
  lease: ProgramLease,
@@ -1055,6 +1370,8 @@ var emptyWorkflow = Workflow.make("kitman-loop/none", { payload: {}, idempotency
1055
1370
  var replayStatuses = new Set([401, 403, 409, 429]);
1056
1371
  var isRunnerRpcError = Schema8.is(RunnerRpcError);
1057
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(", ");
1058
1375
  var refusedStep2 = (cause) => {
1059
1376
  if (isRunFileRefused(cause))
1060
1377
  return true;
@@ -1062,42 +1379,61 @@ var refusedStep2 = (cause) => {
1062
1379
  return true;
1063
1380
  return isRunnerRpcError(cause) && cause.status >= 400 && cause.status < 500 && !replayStatuses.has(cause.status);
1064
1381
  };
1065
- var requested = (step, request) => request.pipe(Effect2.catch((cause) => refusedStep2(cause) ? Effect2.fail(new StepFailed2({ step, reason: cause.message })) : Effect2.die(new JournalWriteFailed2({ cause }))));
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)));
1066
1386
  var runnerHost = (capabilities) => ({
1067
- putQuestion: (launch) => requested(launch.step, capabilities.putQuestion({
1387
+ putQuestion: (launch) => requested2(launch.step, capabilities.putQuestion({
1068
1388
  step: launch.step,
1069
1389
  prompt: launch.prompt,
1070
1390
  deferredName: answerDeferred2(launch.step).name,
1391
+ ...questionAdvice(launch),
1071
1392
  ...launch.options === undefined ? undefined : { options: launch.options },
1072
- ...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 }
1073
1396
  })).pipe(Effect2.asVoid),
1074
- startVerification: (launch) => requested(launch.step, capabilities.startVerification({
1397
+ startVerification: (launch) => requested2(launch.step, capabilities.startVerification({
1075
1398
  step: launch.step,
1076
- deferredName: verifyDeferred2(launch.step).name,
1399
+ deferredName: (launch.measure === undefined ? verifyDeferred2 : measureDeferred2)(launch.step).name,
1077
1400
  ...launch.revision === undefined ? undefined : { revision: launch.revision },
1078
- ...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 }
1079
1404
  })).pipe(Effect2.asVoid),
1080
- startAgentWork: (launch) => requested(launch.step, capabilities.startAgentStep({
1405
+ startAgentWork: (launch) => requested2(launch.step, capabilities.startAgentStep({
1081
1406
  step: launch.step,
1082
- deferredName: agentWorkDeferred2(launch.step).name,
1407
+ deferredName: launch.deferredName,
1083
1408
  role: launch.role,
1084
1409
  agentId: launch.agent,
1085
1410
  prompt: launch.prompt,
1411
+ ...launch.skill === undefined ? undefined : { skill: launch.skill },
1086
1412
  outputSchema: launch.output,
1087
- ...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 }
1088
1416
  })).pipe(Effect2.asVoid),
1089
- admitChild: (launch) => requested(launch.step, capabilities.admitChild({
1417
+ admitChild: (launch) => requested2(launch.step, capabilities.admitChild({
1090
1418
  step: launch.step,
1091
1419
  loop: launch.loop,
1092
1420
  input: launch.input,
1093
1421
  deferredName: childDeferred2(launch.step).name
1094
1422
  })).pipe(Effect2.asVoid),
1095
- awaitEvent: (launch) => requested(launch.step, capabilities.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({
1096
1430
  step: launch.step,
1097
1431
  deferredName: eventDeferred2(launch.step).name,
1098
1432
  event: launch.event,
1099
1433
  ...launch.filter === undefined ? undefined : { filter: launch.filter },
1100
- timeoutMillis: launch.timeoutMillis
1434
+ timeoutMillis: launch.timeoutMillis,
1435
+ ...launch.since === undefined ? undefined : { since: launch.since },
1436
+ ...launch.or === undefined ? undefined : { or: launch.or }
1101
1437
  }))
1102
1438
  });
1103
1439
  var put2 = (target, contentType, body) => Effect2.gen(function* () {
@@ -1134,7 +1470,7 @@ var uploadRunFile2 = (files, file) => Effect2.gen(function* () {
1134
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 }));
1135
1471
  });
1136
1472
  var keepFile = (files, step, { path, caption }) => Effect2.gen(function* () {
1137
- 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}` })) : requested(step, Effect2.fail(cause))));
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))));
1138
1474
  if (kept.status !== "available")
1139
1475
  return yield* new StepFailed2({
1140
1476
  step,
@@ -1144,7 +1480,7 @@ var keepFile = (files, step, { path, caption }) => Effect2.gen(function* () {
1144
1480
  });
1145
1481
  var runnerActivities = (capabilities, services) => ({
1146
1482
  changeRequest: {
1147
- run: (request, step) => requested(step, capabilities.performHostEffect({
1483
+ run: (request, step) => requested2(step, capabilities.performHostEffect({
1148
1484
  step,
1149
1485
  effect: {
1150
1486
  kind: "change_request",
@@ -1155,7 +1491,7 @@ var runnerActivities = (capabilities, services) => ({
1155
1491
  })).pipe(Effect2.filterOrFail((opened) => opened !== undefined, () => new StepFailed2({ step, reason: "Kitman opened no ChangeRequest" })))
1156
1492
  },
1157
1493
  writeBack: {
1158
- run: (request, step) => requested(step, capabilities.performHostEffect({
1494
+ run: (request, step) => requested2(step, capabilities.performHostEffect({
1159
1495
  step,
1160
1496
  effect: {
1161
1497
  kind: "write_back",
@@ -1165,32 +1501,43 @@ var runnerActivities = (capabilities, services) => ({
1165
1501
  })).pipe(Effect2.asVoid)
1166
1502
  },
1167
1503
  artifact: {
1168
- run: ({ files, ...request }, step) => requested(step, capabilities.storeArtifact({
1504
+ run: ({ files, ...request }, step) => requested2(step, capabilities.storeArtifact({
1169
1505
  step,
1170
1506
  ...request,
1171
1507
  ...files === undefined ? undefined : { fileIds: files.map((shown) => shown.id) }
1172
1508
  }))
1173
1509
  },
1174
1510
  file: { run: (request, step) => keepFile(capabilities, step, request).pipe(Effect2.provideContext(services)) },
1175
- note: { run: (request, step) => requested(step, capabilities.recordNote({ step, ...request })) },
1511
+ note: { run: (request, step) => requested2(step, capabilities.recordNote({ step, ...request })) },
1176
1512
  createTasks: {
1177
- run: (request, step) => requested(step, Effect2.map(capabilities.createPlanTasks(request.tickets), (tasks) => ({ tasks })))
1513
+ run: (request, step) => requested2(step, Effect2.map(capabilities.createPlanTasks(request.tickets, request.projectId), (tasks) => ({ tasks })))
1178
1514
  },
1515
+ alertTask: { run: (request, step) => requested2(step, capabilities.alertTask({ step, ...request })) },
1179
1516
  integrationBranch: {
1180
- run: (request, step) => requested(step, capabilities.integrationBranch(request.repoBindingId))
1517
+ run: (request, step) => requested2(step, capabilities.integrationBranch(request.repoBindingId))
1518
+ },
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 }))
1181
1525
  },
1182
- transcripts: { run: (request, step) => requested(step, capabilities.readTranscripts({ step, ...request })) },
1183
- propose: { run: (proposal, step) => requested(step, capabilities.propose({ step, proposal })) },
1184
- projectActivity: { run: (request, step) => requested(step, capabilities.readProject({ step, ...request })) },
1185
- draftUpdate: { run: (request, step) => requested(step, capabilities.draftUpdate({ step, ...request })) },
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 })) },
1186
1529
  mergeChangeRequest: {
1187
- run: (request, step) => requested(step, capabilities.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 }))
1188
1535
  },
1189
1536
  release: {
1190
- run: ({ revision, ...request }, step) => requested(step, capabilities.publishRelease({ step, ...request, ...revision === undefined ? undefined : { revision } }))
1537
+ run: ({ revision, ...request }, step) => requested2(step, capabilities.publishRelease({ step, ...request, ...revision === undefined ? undefined : { revision } }))
1191
1538
  },
1192
1539
  comment: {
1193
- run: (request, step) => requested(step, capabilities.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)
1194
1541
  }
1195
1542
  });
1196
1543
  var describeFailure = (cause) => {
@@ -1206,7 +1553,7 @@ var runProgram2 = (loop, work, { journal, capabilities }) => Effect2.scoped(Effe
1206
1553
  const execute = executeLoop2(loop, {
1207
1554
  host: runnerHost(capabilities),
1208
1555
  activities: runnerActivities(capabilities, services),
1209
- granted: new Set(loop.capabilities.filter((capability) => work.granted.includes(capability)))
1556
+ granted: new Set(capabilitiesOf2(loop).filter((capability) => work.granted.includes(capability)))
1210
1557
  });
1211
1558
  yield* Layer.build(workflow.toLayer(execute).pipe(Layer.provide(Layer.succeed(WorkflowEngine.WorkflowEngine)(engine))));
1212
1559
  const result = yield* encoded.execute(workflow, {
@@ -1262,25 +1609,32 @@ var rpcProgramPorts2 = (rpc, work) => {
1262
1609
  step: question.step,
1263
1610
  prompt: question.prompt,
1264
1611
  deferredName: question.deferredName,
1612
+ ...questionAdvice(question),
1265
1613
  ...question.options === undefined ? undefined : { options: [...question.options] },
1266
- ...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 }
1267
1617
  }),
1268
1618
  startVerification: (verification) => rpc.startVerification({
1269
1619
  lease,
1270
1620
  step: verification.step,
1271
1621
  deferredName: verification.deferredName,
1272
1622
  ...verification.revision === undefined ? undefined : { revision: verification.revision },
1273
- ...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 }
1274
1626
  }),
1275
1627
  startAgentStep: ({ secrets, ...step }) => rpc.startAgentStep({ lease, ...step, ...secrets === undefined ? undefined : { secrets: [...secrets] } }),
1276
1628
  awaitEvent: (wait) => rpc.awaitEvent({ lease, ...wait }),
1629
+ claimResource: (claim) => rpc.claimResource({ lease, ...claim }),
1277
1630
  admitChild: (child) => rpc.admitChild({ lease, ...child }),
1278
1631
  storeArtifact: ({ fileIds, ...artifact }) => rpc.storeArtifact({ lease, ...artifact, ...fileIds === undefined ? undefined : { fileIds: [...fileIds] } }),
1279
1632
  ...rpcRunFiles2(rpc, lease),
1280
1633
  recordNote: (note) => rpc.recordNote({ lease, ...note }),
1281
1634
  performHostEffect: (request) => rpc.performHostEffect({ lease, ...request }),
1282
- createPlanTasks: (tickets) => rpc.createPlanTasks({
1635
+ createPlanTasks: (tickets, projectId) => rpc.createPlanTasks({
1283
1636
  lease,
1637
+ ...projectId === undefined ? undefined : { projectId },
1284
1638
  tickets: tickets.map((ticket) => ({
1285
1639
  key: ticket.key,
1286
1640
  title: ticket.title,
@@ -1291,7 +1645,13 @@ var rpcProgramPorts2 = (rpc, work) => {
1291
1645
  }))
1292
1646
  }),
1293
1647
  integrationBranch: (repoBindingId) => rpc.integrationBranch({ lease, ...repoBindingId === undefined ? undefined : { repoBindingId } }),
1648
+ alertTask: (request) => rpc.alertTask({ lease, ...request }),
1294
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 }),
1295
1655
  propose: ({ step, proposal }) => rpc.propose({
1296
1656
  lease,
1297
1657
  step,
@@ -1300,6 +1660,7 @@ var rpcProgramPorts2 = (rpc, work) => {
1300
1660
  title: proposal.title,
1301
1661
  description: proposal.description,
1302
1662
  ...proposal.teamId === undefined ? undefined : { teamId: proposal.teamId },
1663
+ ...proposal.key === undefined ? undefined : { key: proposal.key },
1303
1664
  citations: [...proposal.citations]
1304
1665
  }
1305
1666
  }),
@@ -1314,6 +1675,9 @@ var rpcProgramPorts2 = (rpc, work) => {
1314
1675
  }
1315
1676
  }),
1316
1677
  mergeChangeRequest: (request) => rpc.mergeChangeRequest({ lease, ...request }),
1678
+ closeChangeRequest: (request) => rpc.closeChangeRequest({ lease, ...request }),
1679
+ approveChangeRequest: (request) => rpc.approveChangeRequest({ lease, ...request }),
1680
+ rerunPipeline: (request) => rpc.rerunPipeline({ lease, ...request }),
1317
1681
  publishRelease: (request) => rpc.publishRelease({ lease, ...request })
1318
1682
  };
1319
1683
  return { journal, capabilities };
@@ -1356,6 +1720,7 @@ var makeProgramRpcClient = (options) => Effect3.gen(function* () {
1356
1720
  startAgentStep: (input) => authorized(client.StartAgentStep(input)),
1357
1721
  startVerification: (input) => authorized(client.StartVerification(input)),
1358
1722
  awaitEvent: (input) => authorized(client.AwaitEvent(input)),
1723
+ claimResource: (input) => authorized(client.ClaimResource(input)),
1359
1724
  admitChild: (input) => authorized(client.AdmitChild(input)),
1360
1725
  storeArtifact: (input) => authorized(client.StoreArtifact(input)),
1361
1726
  createRunFile: (input) => authorized(client.CreateRunFile(input)),
@@ -1364,12 +1729,21 @@ var makeProgramRpcClient = (options) => Effect3.gen(function* () {
1364
1729
  recordNote: (input) => authorized(client.RecordNote(input)),
1365
1730
  performHostEffect: (input) => authorized(client.PerformHostEffect(input)),
1366
1731
  createPlanTasks: (input) => authorized(client.CreatePlanTasks(input)),
1732
+ alertTask: (input) => authorized(client.AlertTask(input)),
1367
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)),
1368
1739
  propose: (input) => authorized(client.Propose(input)),
1369
1740
  readProject: (input) => authorized(client.ReadProject(input)),
1370
1741
  draftUpdate: (input) => authorized(client.DraftUpdate(input)),
1371
1742
  integrationBranch: (input) => authorized(client.IntegrationBranch(input)),
1372
1743
  mergeChangeRequest: (input) => authorized(client.MergeChangeRequest(input)),
1744
+ closeChangeRequest: (input) => authorized(client.CloseChangeRequest(input)),
1745
+ approveChangeRequest: (input) => authorized(client.ApproveChangeRequest(input)),
1746
+ rerunPipeline: (input) => authorized(client.RerunPipeline(input)),
1373
1747
  publishRelease: (input) => authorized(client.PublishRelease(input))
1374
1748
  };
1375
1749
  });
@@ -1386,13 +1760,16 @@ import * as Redacted2 from "effect/Redacted";
1386
1760
  import * as Schema9 from "effect/Schema";
1387
1761
  import * as FetchHttpClient from "effect/http/FetchHttpClient";
1388
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
+ });
1389
1771
  var Described2 = Schema9.Union([
1390
- Schema9.TaggedStruct("Described", {
1391
- loops: Schema9.Array(LoopManifest),
1392
- agents: Schema9.Record(Schema9.String, Schema9.Json),
1393
- schedules: Schema9.optionalKey(Schema9.Record(Schema9.String, Schema9.Json)),
1394
- kits: Schema9.optionalKey(Schema9.Record(Schema9.String, Schema9.Json))
1395
- }),
1772
+ Schema9.TaggedStruct("Described", { kits: Schema9.Array(DescribedKit) }),
1396
1773
  Schema9.TaggedStruct("Refused", { error: Schema9.Union([ManifestInvalid2, LoopCheckError2]) })
1397
1774
  ]);
1398
1775
  var encodeDescribed = Schema9.encodeEffect(Schema9.fromJsonString(Schema9.toCodecJson(Described2)));
@@ -1481,31 +1858,58 @@ var networkGuard2 = (input) => {
1481
1858
  });
1482
1859
  return { fetch, journal };
1483
1860
  };
1484
- var describe = (config) => Effect4.gen(function* () {
1485
- const loops = yield* Effect4.forEach(config.loops, loopManifest2);
1486
- for (const loop of config.loops)
1487
- for (const check of loop.checks ?? [])
1488
- yield* checkLoop2(loop, check);
1489
- return {
1490
- _tag: "Described",
1491
- loops,
1492
- agents: config.agents ?? {},
1493
- ...config.schedules === undefined ? undefined : { schedules: config.schedules },
1494
- ...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
+ }
1495
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 };
1496
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));
1497
1901
  var readStdin = Effect4.tryPromise(() => Bun.stdin.text());
1498
1902
  var isWorkUnit = guard(ProgramWorkUnit);
1499
- var host = (config) => Effect4.gen(function* () {
1903
+ var host = (carried) => Effect4.gen(function* () {
1500
1904
  const loopId = yield* Config.String("KITMAN_LOOP_ID");
1501
1905
  const apiUrl = yield* Config.String("KITMAN_API_URL");
1502
1906
  const credential = yield* Config.Redacted("KITMAN_PROGRAM_CREDENTIAL");
1503
1907
  const work = yield* Schema9.decodeEffect(Schema9.fromJsonString(Schema9.Unknown))(yield* readStdin);
1504
1908
  if (!isWorkUnit(work))
1505
1909
  return yield* new ProgramRefused({ reason: "stdin holds no orchestration Work Unit" });
1506
- const loop = config.loops.find((candidate) => candidate.id === loopId);
1910
+ const loop = carried.flatMap((kit) => kit.config.loops).find((candidate) => candidate.id === loopId);
1507
1911
  if (loop === undefined)
1508
- return yield* new ProgramRefused({ reason: `The Package declares no Loop "${loopId}"` });
1912
+ return yield* new ProgramRefused({ reason: `The Kit carries no Loop "${loopId}"` });
1509
1913
  const hosts = yield* Config.option(Config.String(programHostsEnv2));
1510
1914
  const undeclared = yield* Config.option(Config.Literals(["fail", "warn"], undeclaredHostsEnv2));
1511
1915
  const proxy = yield* Config.option(Config.String("HTTPS_PROXY"));
@@ -1529,9 +1933,10 @@ var host = (config) => Effect4.gen(function* () {
1529
1933
  const ports = rpcProgramPorts2(rpc, work);
1530
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)));
1531
1935
  }).pipe(Effect4.scoped, Effect4.catch((error) => Effect4.as(Effect4.logError(error.message), 2)));
1532
- var runPackage2 = (config) => {
1533
- 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);
1534
1939
  BunRuntime.runMain(program.pipe(Effect4.flatMap((code) => Effect4.sync(() => process.exit(code)))));
1535
1940
  };
1536
1941
 
1537
- export { digestSha256, RunnerRpcProtocolVersion, JournalWriteFailed2, refusedStep2, uploadRunFile2, runProgram2, programLease2, rpcRunFiles2, rpcProgramPorts2, 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 };