@skrr-ai/cli 0.1.94 → 0.1.96

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 (298) hide show
  1. package/README.md +175 -165
  2. package/bin/run.js +32 -0
  3. package/bin/update-npm-runner.cjs +33 -0
  4. package/bin/update-session.cjs +194 -0
  5. package/bin/update-worker.cjs +208 -0
  6. package/dist/base-command.js +0 -15
  7. package/dist/commands/agent/message/send.d.ts +2 -0
  8. package/dist/commands/agent/message/send.js +75 -5
  9. package/dist/commands/agents/chat.js +1 -1
  10. package/dist/commands/agents/create.d.ts +0 -3
  11. package/dist/commands/agents/create.js +0 -26
  12. package/dist/commands/agents/egress.d.ts +17 -0
  13. package/dist/commands/agents/egress.js +84 -0
  14. package/dist/commands/agents/mailbox/messages.d.ts +14 -0
  15. package/dist/commands/agents/mailbox/messages.js +52 -0
  16. package/dist/commands/agents/mailbox/show.d.ts +13 -0
  17. package/dist/commands/agents/mailbox/show.js +52 -0
  18. package/dist/commands/agents/operating-plan.js +8 -0
  19. package/dist/commands/agents/roles/capture.d.ts +16 -0
  20. package/dist/commands/agents/roles/capture.js +53 -0
  21. package/dist/commands/agents/roles/install.d.ts +1 -0
  22. package/dist/commands/agents/roles/install.js +8 -1
  23. package/dist/commands/agents/roles/preview.d.ts +2 -0
  24. package/dist/commands/agents/roles/preview.js +27 -3
  25. package/dist/commands/agents/update.d.ts +0 -3
  26. package/dist/commands/agents/update.js +1 -31
  27. package/dist/commands/agents/usage-cap.d.ts +4 -1
  28. package/dist/commands/agents/usage-cap.js +49 -10
  29. package/dist/commands/code/doctor.d.ts +1 -0
  30. package/dist/commands/code/doctor.js +6 -0
  31. package/dist/commands/code/index.js +4 -0
  32. package/dist/commands/code/install.d.ts +5 -62
  33. package/dist/commands/code/install.js +86 -279
  34. package/dist/commands/code/jobs/show.js +12 -0
  35. package/dist/commands/code/rollback.d.ts +8 -0
  36. package/dist/commands/code/rollback.js +20 -0
  37. package/dist/commands/code/update.d.ts +8 -37
  38. package/dist/commands/code/update.js +134 -213
  39. package/dist/commands/commitments/action-proposals/decide.d.ts +2 -0
  40. package/dist/commands/commitments/action-proposals/decide.js +12 -0
  41. package/dist/commands/commitments/action-proposals.js +7 -0
  42. package/dist/commands/commitments/create.d.ts +1 -0
  43. package/dist/commands/commitments/create.js +17 -1
  44. package/dist/commands/commitments/delivery.d.ts +1 -0
  45. package/dist/commands/commitments/delivery.js +11 -1
  46. package/dist/commands/commitments/doctor.js +4 -0
  47. package/dist/commands/commitments/effective-policy.js +26 -0
  48. package/dist/commands/commitments/endpoints/create.js +5 -2
  49. package/dist/commands/commitments/observations.d.ts +10 -0
  50. package/dist/commands/commitments/observations.js +88 -0
  51. package/dist/commands/commitments/pause.d.ts +1 -1
  52. package/dist/commands/commitments/pause.js +4 -3
  53. package/dist/commands/commitments/preflight.js +2 -1
  54. package/dist/commands/commitments/reports.d.ts +2 -0
  55. package/dist/commands/commitments/reports.js +22 -4
  56. package/dist/commands/commitments/update.d.ts +1 -0
  57. package/dist/commands/commitments/update.js +35 -5
  58. package/dist/commands/daemon/install.js +4 -0
  59. package/dist/commands/generate-recovery-code.d.ts +13 -1
  60. package/dist/commands/generate-recovery-code.js +146 -13
  61. package/dist/commands/grants/create.d.ts +1 -0
  62. package/dist/commands/grants/create.js +8 -0
  63. package/dist/commands/grants/rotate.d.ts +5 -0
  64. package/dist/commands/grants/rotate.js +13 -1
  65. package/dist/commands/grants/update.d.ts +12 -0
  66. package/dist/commands/grants/update.js +27 -0
  67. package/dist/commands/instructions/guide.d.ts +20 -0
  68. package/dist/commands/instructions/guide.js +84 -0
  69. package/dist/commands/instructions/install.js +57 -33
  70. package/dist/commands/instructions/setup.d.ts +14 -0
  71. package/dist/commands/instructions/setup.js +72 -0
  72. package/dist/commands/integrations/execute.js +1 -1
  73. package/dist/commands/login.d.ts +5 -6
  74. package/dist/commands/login.js +27 -11
  75. package/dist/commands/logout.js +7 -7
  76. package/dist/commands/machines/hosted/start.js +7 -1
  77. package/dist/commands/machines/list.js +4 -4
  78. package/dist/commands/measures/confirm.d.ts +1 -7
  79. package/dist/commands/measures/confirm.js +15 -14
  80. package/dist/commands/measures/list.d.ts +1 -7
  81. package/dist/commands/measures/list.js +1 -7
  82. package/dist/commands/measures/record.js +4 -4
  83. package/dist/commands/measures/show.d.ts +11 -0
  84. package/dist/commands/measures/show.js +26 -0
  85. package/dist/commands/northstars/governance/configure.d.ts +1 -0
  86. package/dist/commands/northstars/governance/configure.js +8 -1
  87. package/dist/commands/proposals/discard.d.ts +5 -0
  88. package/dist/commands/proposals/discard.js +8 -0
  89. package/dist/commands/proposals/keep.d.ts +5 -0
  90. package/dist/commands/proposals/keep.js +8 -0
  91. package/dist/commands/proposals/list.d.ts +15 -0
  92. package/dist/commands/proposals/list.js +74 -0
  93. package/dist/commands/proposals/show.d.ts +12 -0
  94. package/dist/commands/proposals/show.js +27 -0
  95. package/dist/commands/proposals/snooze.d.ts +5 -0
  96. package/dist/commands/proposals/snooze.js +8 -0
  97. package/dist/commands/security/overview.d.ts +11 -0
  98. package/dist/commands/security/overview.js +158 -0
  99. package/dist/commands/signals/monitors/create.d.ts +9 -0
  100. package/dist/commands/signals/monitors/create.js +29 -0
  101. package/dist/commands/signals/monitors/list.d.ts +8 -0
  102. package/dist/commands/signals/monitors/list.js +16 -0
  103. package/dist/commands/signals/monitors/pause.d.ts +11 -0
  104. package/dist/commands/signals/monitors/pause.js +17 -0
  105. package/dist/commands/signals/monitors/resume.d.ts +11 -0
  106. package/dist/commands/signals/monitors/resume.js +17 -0
  107. package/dist/commands/signals/monitors/revise.d.ts +12 -0
  108. package/dist/commands/signals/monitors/revise.js +25 -0
  109. package/dist/commands/signals/monitors/show.d.ts +11 -0
  110. package/dist/commands/signals/monitors/show.js +17 -0
  111. package/dist/commands/signals/monitors/test.d.ts +12 -0
  112. package/dist/commands/signals/monitors/test.js +25 -0
  113. package/dist/commands/signals/monitors/transitions.d.ts +11 -0
  114. package/dist/commands/signals/monitors/transitions.js +17 -0
  115. package/dist/commands/signals/monitors/validate.d.ts +9 -0
  116. package/dist/commands/signals/monitors/validate.js +24 -0
  117. package/dist/commands/signals/schemas/list.d.ts +8 -0
  118. package/dist/commands/signals/schemas/list.js +16 -0
  119. package/dist/commands/signals/schemas/show.d.ts +11 -0
  120. package/dist/commands/signals/schemas/show.js +17 -0
  121. package/dist/commands/signals/sources/list.d.ts +8 -0
  122. package/dist/commands/signals/sources/list.js +16 -0
  123. package/dist/commands/signals/sources/receipts.d.ts +11 -0
  124. package/dist/commands/signals/sources/receipts.js +17 -0
  125. package/dist/commands/signals/sources/show.d.ts +11 -0
  126. package/dist/commands/signals/sources/show.js +17 -0
  127. package/dist/commands/spaces/claim.d.ts +12 -0
  128. package/dist/commands/spaces/claim.js +42 -0
  129. package/dist/commands/spaces/ownership.d.ts +12 -0
  130. package/dist/commands/spaces/ownership.js +46 -0
  131. package/dist/commands/spaces/usage.d.ts +12 -0
  132. package/dist/commands/spaces/usage.js +28 -0
  133. package/dist/commands/spaces/workflows/run.js +3 -0
  134. package/dist/commands/spaces/workflows/runs.js +2 -1
  135. package/dist/commands/spaces/workflows/update.d.ts +6 -1
  136. package/dist/commands/spaces/workflows/update.js +34 -2
  137. package/dist/commands/tasks/cancel-cascade.js +1 -1
  138. package/dist/commands/tasks/cascade-status.d.ts +2 -0
  139. package/dist/commands/tasks/cascade-status.js +27 -1
  140. package/dist/commands/tasks/create-tree.d.ts +5 -1
  141. package/dist/commands/tasks/create-tree.js +35 -7
  142. package/dist/commands/tasks/create.d.ts +4 -0
  143. package/dist/commands/tasks/create.js +16 -0
  144. package/dist/commands/tasks/deliverable/add.js +12 -3
  145. package/dist/commands/tasks/economics-compare.d.ts +15 -0
  146. package/dist/commands/tasks/economics-compare.js +60 -0
  147. package/dist/commands/tasks/expectations/evaluate.d.ts +13 -0
  148. package/dist/commands/tasks/expectations/evaluate.js +43 -0
  149. package/dist/commands/tasks/interrupt.js +2 -2
  150. package/dist/commands/tasks/list.d.ts +1 -0
  151. package/dist/commands/tasks/list.js +44 -1
  152. package/dist/commands/tasks/pause-schedule.js +1 -1
  153. package/dist/commands/tasks/show.d.ts +5 -0
  154. package/dist/commands/tasks/show.js +17 -0
  155. package/dist/commands/tasks/update.d.ts +4 -0
  156. package/dist/commands/tasks/update.js +9 -0
  157. package/dist/commands/tasks/workflow-findings.js +2 -2
  158. package/dist/commands/token/list.d.ts +3 -5
  159. package/dist/commands/token/list.js +99 -57
  160. package/dist/commands/triggers/create.d.ts +2 -0
  161. package/dist/commands/triggers/create.js +15 -0
  162. package/dist/commands/update.d.ts +14 -0
  163. package/dist/commands/update.js +61 -0
  164. package/dist/commands/workspaces/grants.d.ts +12 -0
  165. package/dist/commands/workspaces/grants.js +31 -0
  166. package/dist/commands/workspaces/stewardship.d.ts +13 -0
  167. package/dist/commands/workspaces/stewardship.js +34 -0
  168. package/dist/generated/managed-instruction-guides.json +9 -0
  169. package/dist/hooks/init.d.ts +5 -0
  170. package/dist/hooks/init.js +27 -0
  171. package/dist/lib/agent-config.d.ts +0 -12
  172. package/dist/lib/agent-config.js +1 -27
  173. package/dist/lib/agent-mailbox.d.ts +35 -0
  174. package/dist/lib/agent-mailbox.js +55 -0
  175. package/dist/lib/commitment-endpoints.d.ts +2 -1
  176. package/dist/lib/commitment-endpoints.js +2 -5
  177. package/dist/lib/commitment-product.d.ts +3 -1
  178. package/dist/lib/commitment-product.js +10 -0
  179. package/dist/lib/commitment-terms.js +1 -1
  180. package/dist/lib/commitments.d.ts +17 -15
  181. package/dist/lib/commitments.js +173 -137
  182. package/dist/lib/compasses.d.ts +14 -0
  183. package/dist/lib/compasses.js +25 -11
  184. package/dist/lib/daemon-installer.d.ts +2 -0
  185. package/dist/lib/daemon-installer.js +100 -24
  186. package/dist/lib/first-party-harness-doctor.js +31 -1
  187. package/dist/lib/first-party-harness-remote-install.d.ts +71 -0
  188. package/dist/lib/first-party-harness-remote-install.js +310 -0
  189. package/dist/lib/first-party-harness-remote-update.d.ts +46 -0
  190. package/dist/lib/first-party-harness-remote-update.js +242 -0
  191. package/dist/lib/first-party-harness-startup-update.d.ts +26 -0
  192. package/dist/lib/first-party-harness-startup-update.js +166 -0
  193. package/dist/lib/first-party-harness-update.d.ts +46 -0
  194. package/dist/lib/first-party-harness-update.js +289 -0
  195. package/dist/lib/first-party-harness.js +7 -4
  196. package/dist/lib/grants.d.ts +5 -1
  197. package/dist/lib/grants.js +9 -1
  198. package/dist/lib/hosted-machines.d.ts +7 -0
  199. package/dist/lib/mailbox-human-command.d.ts +11 -0
  200. package/dist/lib/mailbox-human-command.js +41 -0
  201. package/dist/lib/managed-instruction-local.d.ts +12 -0
  202. package/dist/lib/managed-instruction-local.js +58 -0
  203. package/dist/lib/managed-instruction-setup.d.ts +35 -0
  204. package/dist/lib/managed-instruction-setup.js +306 -0
  205. package/dist/lib/measures.d.ts +28 -2
  206. package/dist/lib/measures.js +38 -14
  207. package/dist/lib/memory-sync.d.ts +1 -0
  208. package/dist/lib/memory-sync.js +279 -68
  209. package/dist/lib/message-intent.d.ts +6 -2
  210. package/dist/lib/message-intent.js +1 -0
  211. package/dist/lib/northstars.js +2 -1
  212. package/dist/lib/platform-update-local.d.ts +2 -0
  213. package/dist/lib/platform-update-local.js +113 -0
  214. package/dist/lib/platform-update.d.ts +39 -0
  215. package/dist/lib/platform-update.js +84 -0
  216. package/dist/lib/profile-machine-identity-guard.d.ts +2 -0
  217. package/dist/lib/profile-machine-identity-guard.js +13 -0
  218. package/dist/lib/prompt.d.ts +1 -0
  219. package/dist/lib/prompt.js +4 -3
  220. package/dist/lib/proposal-decision-command.d.ts +19 -0
  221. package/dist/lib/proposal-decision-command.js +64 -0
  222. package/dist/lib/proposals.d.ts +8 -0
  223. package/dist/lib/proposals.js +22 -0
  224. package/dist/lib/roles.d.ts +141 -6
  225. package/dist/lib/roles.js +8 -2
  226. package/dist/lib/signals.d.ts +20 -0
  227. package/dist/lib/signals.js +24 -0
  228. package/dist/lib/space-usage.d.ts +3 -0
  229. package/dist/lib/space-usage.js +17 -0
  230. package/dist/lib/stewardship-output.d.ts +4 -0
  231. package/dist/lib/stewardship-output.js +82 -0
  232. package/dist/lib/task-asset-upload.d.ts +3 -1
  233. package/dist/lib/task-asset-upload.js +1 -0
  234. package/dist/lib/task-batch.d.ts +9 -0
  235. package/dist/lib/task-batch.js +94 -17
  236. package/dist/lib/task-economics.d.ts +16 -0
  237. package/dist/lib/task-economics.js +22 -0
  238. package/dist/lib/task-instruction-offer.d.ts +1 -4
  239. package/dist/lib/task-instruction-offer.js +3 -129
  240. package/dist/lib/triggers.d.ts +11 -3
  241. package/dist/lib/triggers.js +58 -1
  242. package/dist/lib/update-check.d.ts +61 -53
  243. package/dist/lib/update-check.js +453 -314
  244. package/dist/lib/usage-discovery.d.ts +10 -0
  245. package/dist/lib/usage-discovery.js +24 -3
  246. package/dist/lib/workflow-run-budget.d.ts +12 -0
  247. package/dist/lib/workflow-run-budget.js +37 -0
  248. package/dist/lib/workspaces.d.ts +48 -0
  249. package/dist/lib/workspaces.js +8 -0
  250. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/cliHandoffWire.d.ts +4 -0
  251. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/cliHandoffWire.js +14 -1
  252. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarnessChannels.d.ts +3 -4
  253. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarnessChannels.js +3 -4
  254. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarnessReleaseKeys.d.ts +82 -0
  255. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarnessReleaseKeys.js +105 -0
  256. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarnessUpdater.d.ts +110 -0
  257. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/firstPartyHarnessUpdater.js +945 -0
  258. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/githubPushRefusal.d.ts +9 -0
  259. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/githubPushRefusal.js +49 -0
  260. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/harnessPermissionControls.d.ts +32 -0
  261. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/harnessPermissionControls.js +62 -0
  262. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.d.ts +2 -0
  263. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/index.js +4 -1
  264. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/machineUuid.js +35 -5
  265. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/releasePolicy.d.ts +63 -0
  266. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/releasePolicy.js +169 -0
  267. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/releaseVersions.d.ts +2 -0
  268. package/dist/node_modules/@skrr-ai/auth-core/dist/cjs/releaseVersions.js +44 -0
  269. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/cliHandoffWire.d.ts +4 -0
  270. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/cliHandoffWire.js +12 -0
  271. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarnessChannels.d.ts +3 -4
  272. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarnessChannels.js +3 -4
  273. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarnessReleaseKeys.d.ts +82 -0
  274. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarnessReleaseKeys.js +102 -0
  275. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarnessUpdater.d.ts +110 -0
  276. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/firstPartyHarnessUpdater.js +923 -0
  277. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/githubPushRefusal.d.ts +9 -0
  278. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/githubPushRefusal.js +44 -0
  279. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/harnessPermissionControls.d.ts +32 -0
  280. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/harnessPermissionControls.js +59 -0
  281. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.d.ts +2 -0
  282. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/index.js +2 -0
  283. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/machineUuid.js +35 -5
  284. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/releasePolicy.d.ts +63 -0
  285. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/releasePolicy.js +163 -0
  286. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/releaseVersions.d.ts +2 -0
  287. package/dist/node_modules/@skrr-ai/auth-core/dist/esm/releaseVersions.js +41 -0
  288. package/dist/node_modules/@skrr-ai/auth-core/package.json +41 -1
  289. package/dist/node_modules/@skrr-ai/data-provider/index.js +8069 -7121
  290. package/docs/v1/README.md +28 -0
  291. package/docs/v1/api.md +55 -0
  292. package/docs/v1/changelog.md +16 -0
  293. package/docs/v1/check-examples.mjs +178 -0
  294. package/docs/v1/examples/api-readonly.mjs +144 -0
  295. package/docs/v1/operations.md +87 -0
  296. package/docs/v1/quickstart.md +71 -0
  297. package/oclif.manifest.json +49424 -46174
  298. package/package.json +34 -11
@@ -0,0 +1,9 @@
1
+ /** GitHub push diagnostics must never escape this parser as raw stderr. */
2
+ export declare const GITHUB_WORKFLOW_PERMISSION_REQUIRED = "github_workflow_permission_required";
3
+ export type GitHubPushRefusal = {
4
+ code: typeof GITHUB_WORKFLOW_PERMISSION_REQUIRED;
5
+ tokenKind: 'github_app' | 'oauth_app' | 'personal_access_token' | 'unknown';
6
+ paths: string[];
7
+ };
8
+ export declare function isWorkflowPath(value: unknown): boolean;
9
+ export declare function classifyGitHubPushRefusal(text: unknown): GitHubPushRefusal | null;
@@ -0,0 +1,44 @@
1
+ /** GitHub push diagnostics must never escape this parser as raw stderr. */
2
+ export const GITHUB_WORKFLOW_PERMISSION_REQUIRED = 'github_workflow_permission_required';
3
+ function workflowPath(value) {
4
+ if (typeof value !== 'string' || value.length > 240)
5
+ return null;
6
+ const path = value.replaceAll('\\', '/');
7
+ if (!/^\.github\/workflows\/[A-Za-z0-9_. /-]+$/.test(path))
8
+ return null;
9
+ const parts = path.split('/');
10
+ if (parts.some((part) => !part.trim() || part !== part.trim() || part === '.' || part === '..'))
11
+ return null;
12
+ return path;
13
+ }
14
+ export function isWorkflowPath(value) {
15
+ return workflowPath(value) !== null;
16
+ }
17
+ export function classifyGitHubPushRefusal(text) {
18
+ if (typeof text !== 'string')
19
+ return null;
20
+ // Bound parsing work. Git prints the rejection LAST, after any amount of
21
+ // progress output, so keep the tail; truncated diagnostics keep the generic refusal.
22
+ const input = text.slice(-64 * 1024);
23
+ const pattern = /refusing to allow (?:a|an) (GitHub App|OAuth App|Personal Access Token) to create or update workflow [`'"]([^`'"\r\n]+)[`'"] without [`'"]workflows?[`'"] (?:permission|scope)/gi;
24
+ const paths = [];
25
+ let tokenKind = 'unknown';
26
+ for (const match of input.matchAll(pattern)) {
27
+ const path = workflowPath(match[2]);
28
+ if (!path)
29
+ continue;
30
+ if (tokenKind === 'unknown') {
31
+ tokenKind =
32
+ match[1].toLowerCase() === 'github app'
33
+ ? 'github_app'
34
+ : match[1].toLowerCase() === 'oauth app'
35
+ ? 'oauth_app'
36
+ : 'personal_access_token';
37
+ }
38
+ if (!paths.includes(path))
39
+ paths.push(path);
40
+ if (paths.length === 10)
41
+ break;
42
+ }
43
+ return paths.length ? { code: GITHUB_WORKFLOW_PERMISSION_REQUIRED, tokenKind, paths } : null;
44
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Read-only capability wire for ordinary agent turns. This is NOT a session
3
+ * authorization request or an effective permission profile. In particular,
4
+ * an ACP approval callback is not a process sandbox, and access to a loopback
5
+ * inference broker is not a grant to make arbitrary outbound connections.
6
+ *
7
+ * Daemons advertise what their adapters implement; execution still validates
8
+ * the requested policy independently. Consumers never infer controls from a
9
+ * provider name, a missing report, or the unified permission-mode vocabulary.
10
+ */
11
+ export interface HarnessPermissionControls {
12
+ version: 1;
13
+ plan: 'harness' | 'reported-actions' | 'unsupported' | 'unknown';
14
+ approval: 'harness' | 'reported-actions' | 'none' | 'unknown';
15
+ filesystem: 'harness-sandbox' | 'tool-path-guards' | 'reported-actions' | 'not-restricted-by-daemon' | 'unknown';
16
+ strictToolPolicy: {
17
+ modes: readonly ('none' | 'allowlist')[];
18
+ enforcement: 'harness' | 'negotiated' | 'unsupported' | 'unknown';
19
+ };
20
+ organizationToolDenylist: 'unsupported' | 'unknown';
21
+ networkEgress: 'not-restricted-by-daemon' | 'unknown';
22
+ }
23
+ export interface HarnessPermissionControlReport {
24
+ controls: HarnessPermissionControls | null;
25
+ source: 'daemon' | 'daemon_record' | 'unreported';
26
+ }
27
+ /**
28
+ * Presence/registration metadata is untrusted input. Copy only the v1 enum
29
+ * vocabulary: unknown future claims and malformed profiles yield no report,
30
+ * rather than a green badge. Additive fields are stripped for compatibility.
31
+ */
32
+ export declare function parseHarnessPermissionControls(value: unknown): HarnessPermissionControls | null;
@@ -0,0 +1,59 @@
1
+ const PLAN = ['harness', 'reported-actions', 'unsupported', 'unknown'];
2
+ const APPROVAL = ['harness', 'reported-actions', 'none', 'unknown'];
3
+ const FILESYSTEM = [
4
+ 'harness-sandbox',
5
+ 'tool-path-guards',
6
+ 'reported-actions',
7
+ 'not-restricted-by-daemon',
8
+ 'unknown',
9
+ ];
10
+ const TOOL_ENFORCEMENT = ['harness', 'negotiated', 'unsupported', 'unknown'];
11
+ /**
12
+ * Presence/registration metadata is untrusted input. Copy only the v1 enum
13
+ * vocabulary: unknown future claims and malformed profiles yield no report,
14
+ * rather than a green badge. Additive fields are stripped for compatibility.
15
+ */
16
+ export function parseHarnessPermissionControls(value) {
17
+ try {
18
+ if (!value || typeof value !== 'object' || Array.isArray(value))
19
+ return null;
20
+ const row = value;
21
+ const { version, plan, approval, filesystem, organizationToolDenylist, networkEgress, strictToolPolicy, } = row;
22
+ const strict = strictToolPolicy;
23
+ if (!strict || typeof strict !== 'object' || Array.isArray(strict))
24
+ return null;
25
+ const strictModes = strict.modes;
26
+ const enforcement = strict.enforcement;
27
+ if (version !== 1 ||
28
+ !PLAN.includes(plan) ||
29
+ !APPROVAL.includes(approval) ||
30
+ !FILESYSTEM.includes(filesystem) ||
31
+ !['unsupported', 'unknown'].includes(organizationToolDenylist) ||
32
+ !['not-restricted-by-daemon', 'unknown'].includes(networkEgress) ||
33
+ !TOOL_ENFORCEMENT.includes(enforcement) ||
34
+ !Array.isArray(strictModes) ||
35
+ strictModes.length > 2 ||
36
+ !strictModes.every((mode) => mode === 'none' || mode === 'allowlist'))
37
+ return null;
38
+ const modes = [...new Set(strictModes)];
39
+ if (((enforcement === 'unsupported' || enforcement === 'unknown') && modes.length > 0) ||
40
+ ((enforcement === 'harness' || enforcement === 'negotiated') && modes.length === 0))
41
+ return null;
42
+ return Object.freeze({
43
+ version: 1,
44
+ plan: plan,
45
+ approval: approval,
46
+ filesystem: filesystem,
47
+ strictToolPolicy: Object.freeze({
48
+ modes: Object.freeze(modes),
49
+ enforcement: enforcement,
50
+ }),
51
+ organizationToolDenylist: organizationToolDenylist,
52
+ networkEgress: networkEgress,
53
+ });
54
+ }
55
+ catch {
56
+ // Malicious accessors/proxies must not break a read surface.
57
+ return null;
58
+ }
59
+ }
@@ -46,3 +46,5 @@ export { OVERSKY_RELEASE_PUBLIC_KEYS, type ReleaseKey } from './releaseKeys.js';
46
46
  export { MAX_SIGS, TRUSTED_FEED_ORIGINS, buildArtifactMessage, buildManifestMessage, getDeltaFor, isTrustedArtifactOrigin, verifyArtifact, verifyManifest, type DaemonVersionManifest, type DeltaDescriptor, type ManifestSignature, type PlatformArtifact, type VerifyResult, } from './releaseManifest.js';
47
47
  export { resolveConfigRoot, configRootPath, isConfigRootOverridden } from './configRoot.js';
48
48
  export { PROFILES_SEGMENT, SUPERSEDED_MARKER_SUFFIX, SUPERSEDED_COPY_SUFFIX, profileStateDir, legacyProfileStateDir, resolveProfileStateDir, resolveProfileStateFile, profileStateFileLocations, profileStateFilePathsToClear, consolidateProfileState, type ResolvedProfileStateDir, type ConsolidationSpec, type ConsolidationStatus, type ConsolidationOutcome, } from './profileStateDir.js';
49
+ export * from './harnessPermissionControls.js';
50
+ export { compareReleaseVersions } from './releaseVersions.js';
@@ -182,3 +182,5 @@ export { resolveConfigRoot, configRootPath, isConfigRootOverridden } from './con
182
182
  // the migration for a machine that ended up with two. Same lesson, one level
183
183
  // down: two modules spelled the rule themselves and the two consumers disagreed.
184
184
  export { PROFILES_SEGMENT, SUPERSEDED_MARKER_SUFFIX, SUPERSEDED_COPY_SUFFIX, profileStateDir, legacyProfileStateDir, resolveProfileStateDir, resolveProfileStateFile, profileStateFileLocations, profileStateFilePathsToClear, consolidateProfileState, } from './profileStateDir.js';
185
+ export * from './harnessPermissionControls.js';
186
+ export { compareReleaseVersions } from './releaseVersions.js';
@@ -198,11 +198,14 @@ export function setMachineUuidProfile(profile) {
198
198
  export function getMachineUuidProfile() {
199
199
  return activeMachineProfile;
200
200
  }
201
- function readPersistedChoice(file, hardware, profile) {
201
+ function readPersistedChoice(file, hardware, profile, requireProfile = false) {
202
202
  try {
203
203
  const parsed = JSON.parse(fs.readFileSync(file, 'utf-8'));
204
204
  // A file from another machine (a restored backup, a synced home) is absent.
205
- if (parsed?.version !== 1 || parsed.hardware !== hardware)
205
+ if (parsed?.version !== 1 ||
206
+ parsed.hardware !== hardware ||
207
+ (parsed.profile !== undefined && parsed.profile !== profile) ||
208
+ (requireProfile && parsed.profile !== profile))
206
209
  return null;
207
210
  // Only the two values this module can produce are accepted: a hand-edited or
208
211
  // foreign string must never become an identity.
@@ -215,11 +218,18 @@ function readPersistedChoice(file, hardware, profile) {
215
218
  return null;
216
219
  }
217
220
  }
218
- function persistChoice(dir, file, hardware, machineUuid, reason) {
221
+ function persistChoice(dir, file, hardware, machineUuid, reason, profile) {
219
222
  try {
220
223
  fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
221
224
  const tmp = `${file}.${process.pid}.${Date.now()}.tmp`;
222
- const body = { version: 1, hardware, machineUuid, reason, decidedAt: new Date().toISOString() };
225
+ const body = {
226
+ version: 1,
227
+ hardware,
228
+ machineUuid,
229
+ profile,
230
+ reason,
231
+ decidedAt: new Date().toISOString(),
232
+ };
223
233
  fs.writeFileSync(tmp, `${JSON.stringify(body)}\n`, { mode: 0o600 });
224
234
  fs.renameSync(tmp, file);
225
235
  }
@@ -228,6 +238,20 @@ function persistChoice(dir, file, hardware, machineUuid, reason) {
228
238
  // next process decides again from the same evidence.
229
239
  }
230
240
  }
241
+ /** A nonsecret recovery copy survives product uninstall. Each profile has its
242
+ * own file, so concurrent profiles never overwrite a shared identity map. A
243
+ * copied home cannot adopt another machine's value: the hardware is verified
244
+ * and only this module's hardware/qualified values are admitted. */
245
+ function recoveryChoicePath(profile) {
246
+ const name = crypto.createHash('sha256').update(profile).digest('hex');
247
+ return path.join(os.homedir(), '.local', 'state', 'skrr', 'machine-identities', `${name}.json`);
248
+ }
249
+ function preserveRecoveryChoice(profile, hardware, machineUuid) {
250
+ const file = recoveryChoicePath(profile);
251
+ if (readPersistedChoice(file, hardware, profile, true) === machineUuid)
252
+ return;
253
+ persistChoice(path.dirname(file), file, hardware, machineUuid, 'restored_profile', profile);
254
+ }
231
255
  /** The identity a NON-default profile registers under. Never throws. */
232
256
  function resolveProfileMachineUuid(profile, hardware) {
233
257
  const cacheKey = `${hardware}\u0000${profile}`;
@@ -237,6 +261,11 @@ function resolveProfileMachineUuid(profile, hardware) {
237
261
  const dir = path.join(resolveConfigRoot(), 'profiles', profile);
238
262
  const file = path.join(dir, MACHINE_IDENTITY_FILENAME);
239
263
  let chosen = readPersistedChoice(file, hardware, profile);
264
+ if (!chosen) {
265
+ chosen = readPersistedChoice(recoveryChoicePath(profile), hardware, profile, true);
266
+ if (chosen)
267
+ persistChoice(dir, file, hardware, chosen, 'restored_profile', profile);
268
+ }
240
269
  if (!chosen) {
241
270
  const preExisting = PRE_EXISTING_PROFILE_EVIDENCE.some((name) => {
242
271
  try {
@@ -247,8 +276,9 @@ function resolveProfileMachineUuid(profile, hardware) {
247
276
  }
248
277
  });
249
278
  chosen = preExisting ? hardware : qualifyMachineUuid(hardware, profile);
250
- persistChoice(dir, file, hardware, chosen, preExisting ? 'pre_existing_profile' : 'new_profile');
279
+ persistChoice(dir, file, hardware, chosen, preExisting ? 'pre_existing_profile' : 'new_profile', profile);
251
280
  }
281
+ preserveRecoveryChoice(profile, hardware, chosen);
252
282
  profileChoiceCache.set(cacheKey, chosen);
253
283
  return chosen;
254
284
  }
@@ -0,0 +1,63 @@
1
+ import { type ReleaseKey } from './releaseKeys.js';
2
+ export type ReleaseChannel = 'stable' | 'canary' | 'beta' | 'internal';
3
+ export interface ContractRange {
4
+ minimum: number;
5
+ maximum: number;
6
+ }
7
+ export interface ComponentReleasePolicy {
8
+ version: string;
9
+ minimumVersion?: string;
10
+ contracts?: Record<string, ContractRange>;
11
+ }
12
+ export interface ReleasePolicySignature {
13
+ keyId: string;
14
+ sig: string;
15
+ }
16
+ export interface SignedReleasePolicy {
17
+ schemaVersion: 1;
18
+ releaseId: string;
19
+ issuedAt: string;
20
+ expiresAt: string;
21
+ channel: ReleaseChannel;
22
+ /** Percentage in basis points (0–10000), avoiding floating-point policy. */
23
+ rolloutBasisPoints: number;
24
+ cohortSeed: string;
25
+ components: Record<string, ComponentReleasePolicy>;
26
+ keyId: string;
27
+ sig: string;
28
+ sigs?: ReleasePolicySignature[];
29
+ }
30
+ export type PolicyVerifyResult = {
31
+ ok: true;
32
+ } | {
33
+ ok: false;
34
+ reason: string;
35
+ } | {
36
+ disabled: true;
37
+ };
38
+ export interface ReleasePolicyAssessment {
39
+ valid: boolean;
40
+ eligible: boolean;
41
+ reason?: string;
42
+ }
43
+ /** Canonical, versioned signature message. Never sign JSON.stringify directly. */
44
+ export declare function buildReleasePolicyMessage(policy: Omit<SignedReleasePolicy, 'sig' | 'sigs'>): string;
45
+ export declare function verifyReleasePolicy(policy: SignedReleasePolicy, keys?: readonly ReleaseKey[]): PolicyVerifyResult;
46
+ export declare function isReleasePolicyCohortEligible(policy: SignedReleasePolicy, subject: string): boolean;
47
+ /**
48
+ * Verify expiry, daemon target binding, contract ranges, channel, and cohort.
49
+ * `autonomous=false` intentionally bypasses cohort gating: an operator who
50
+ * explicitly runs an update may recover a machine outside the staged cohort,
51
+ * but cannot bypass invalid signatures, an expired policy, or incompatibility.
52
+ */
53
+ export declare function assessReleasePolicy(args: {
54
+ policy: SignedReleasePolicy;
55
+ targetDaemonVersion: string;
56
+ /** Defaults to daemon for backwards-compatible daemon policy assessment. */
57
+ targetComponent?: string;
58
+ channel: ReleaseChannel;
59
+ contracts: Record<string, number>;
60
+ cohortSubject: string;
61
+ autonomous: boolean;
62
+ now?: Date;
63
+ }): ReleasePolicyAssessment;
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Signed multi-component release policy.
3
+ *
4
+ * The daemon artifact manifest authenticates a daemon binary. This envelope
5
+ * authenticates the *decision* to offer that binary to a cohort, and records
6
+ * the component contract that makes a CLI/daemon/desktop combination safe.
7
+ * It is separately signed so it can be added to a v1 artifact manifest without
8
+ * changing the legacy manifest signature bytes or blocking old daemons.
9
+ */
10
+ import { createHash, createPublicKey, verify as verifyEd25519 } from 'node:crypto';
11
+ import { OVERSKY_RELEASE_PUBLIC_KEYS } from './releaseKeys.js';
12
+ const MAX_SIGS = 8;
13
+ function stableJson(value) {
14
+ if (value === null ||
15
+ typeof value === 'boolean' ||
16
+ typeof value === 'number' ||
17
+ typeof value === 'string') {
18
+ return JSON.stringify(value);
19
+ }
20
+ if (Array.isArray(value))
21
+ return `[${value.map(stableJson).join(',')}]`;
22
+ if (!value || typeof value !== 'object')
23
+ throw new Error('policy contains an unsupported value');
24
+ const record = value;
25
+ return `{${Object.keys(record)
26
+ .sort()
27
+ .map((key) => `${JSON.stringify(key)}:${stableJson(record[key])}`)
28
+ .join(',')}}`;
29
+ }
30
+ /** Canonical, versioned signature message. Never sign JSON.stringify directly. */
31
+ export function buildReleasePolicyMessage(policy) {
32
+ return ['oversky-release-policy', 'v1', stableJson(policy)].join('\n');
33
+ }
34
+ function verifyOne(message, signature, keys) {
35
+ if (keys.length === 0)
36
+ return { disabled: true };
37
+ if (!signature)
38
+ return { ok: false, reason: 'missing signature' };
39
+ const messageBytes = Buffer.from(message, 'utf8');
40
+ const signatureBytes = Buffer.from(signature, 'base64');
41
+ for (const keySpec of keys) {
42
+ try {
43
+ const key = createPublicKey({
44
+ key: Buffer.from(keySpec.publicKeySpkiB64, 'base64'),
45
+ format: 'der',
46
+ type: 'spki',
47
+ });
48
+ if (verifyEd25519(null, messageBytes, key, signatureBytes))
49
+ return { ok: true };
50
+ }
51
+ catch {
52
+ /* malformed signatures and keys are a verification failure */
53
+ }
54
+ }
55
+ return { ok: false, reason: 'signature did not verify against any pinned key' };
56
+ }
57
+ function policyShapeIsValid(policy) {
58
+ if (!policy ||
59
+ typeof policy !== 'object' ||
60
+ policy.schemaVersion !== 1 ||
61
+ !/^[0-9A-Za-z._:-]+$/.test(policy.releaseId) ||
62
+ !['stable', 'canary', 'beta', 'internal'].includes(policy.channel) ||
63
+ !Number.isInteger(policy.rolloutBasisPoints) ||
64
+ policy.rolloutBasisPoints < 0 ||
65
+ policy.rolloutBasisPoints > 10_000 ||
66
+ typeof policy.cohortSeed !== 'string' ||
67
+ policy.cohortSeed.length < 8 ||
68
+ !policy.components ||
69
+ typeof policy.components !== 'object' ||
70
+ Array.isArray(policy.components)) {
71
+ return false;
72
+ }
73
+ const issued = Date.parse(policy.issuedAt);
74
+ const expires = Date.parse(policy.expiresAt);
75
+ if (!Number.isFinite(issued) || !Number.isFinite(expires) || expires <= issued)
76
+ return false;
77
+ return Object.values(policy.components).every((component) => component &&
78
+ typeof component === 'object' &&
79
+ !Array.isArray(component) &&
80
+ (!component.contracts ||
81
+ (typeof component.contracts === 'object' && !Array.isArray(component.contracts))) &&
82
+ typeof component.version === 'string' &&
83
+ component.version.length > 0 &&
84
+ Object.values(component.contracts ?? {}).every((range) => range &&
85
+ typeof range === 'object' &&
86
+ !Array.isArray(range) &&
87
+ Number.isInteger(range.minimum) &&
88
+ Number.isInteger(range.maximum) &&
89
+ range.minimum >= 0 &&
90
+ range.maximum >= range.minimum));
91
+ }
92
+ export function verifyReleasePolicy(policy, keys = OVERSKY_RELEASE_PUBLIC_KEYS) {
93
+ if (!policyShapeIsValid(policy))
94
+ return { ok: false, reason: 'invalid release-policy shape' };
95
+ const { sig, sigs, ...unsigned } = policy;
96
+ const message = buildReleasePolicyMessage(unsigned);
97
+ if (Array.isArray(sigs) && sigs.length > 0) {
98
+ if (keys.length === 0)
99
+ return { disabled: true };
100
+ for (const entry of sigs.slice(0, MAX_SIGS)) {
101
+ if (!entry || typeof entry.sig !== 'string')
102
+ continue;
103
+ const verdict = verifyOne(message, entry.sig, keys);
104
+ if ('ok' in verdict && verdict.ok)
105
+ return verdict;
106
+ }
107
+ return { ok: false, reason: 'no policy multi-signature verified against a pinned key' };
108
+ }
109
+ return verifyOne(message, sig, keys);
110
+ }
111
+ export function isReleasePolicyCohortEligible(policy, subject) {
112
+ if (!subject || policy.rolloutBasisPoints === 0)
113
+ return false;
114
+ if (policy.rolloutBasisPoints === 10_000)
115
+ return true;
116
+ const bucket = createHash('sha256')
117
+ .update(`${policy.releaseId}\n${policy.cohortSeed}\n${subject}`, 'utf8')
118
+ .digest()
119
+ .readUInt32BE(0) % 10_000;
120
+ return bucket < policy.rolloutBasisPoints;
121
+ }
122
+ /**
123
+ * Verify expiry, daemon target binding, contract ranges, channel, and cohort.
124
+ * `autonomous=false` intentionally bypasses cohort gating: an operator who
125
+ * explicitly runs an update may recover a machine outside the staged cohort,
126
+ * but cannot bypass invalid signatures, an expired policy, or incompatibility.
127
+ */
128
+ export function assessReleasePolicy(args) {
129
+ const now = args.now ?? new Date();
130
+ if (Date.parse(args.policy.expiresAt) <= now.getTime()) {
131
+ return { valid: false, eligible: false, reason: `policy expired at ${args.policy.expiresAt}` };
132
+ }
133
+ if (args.policy.channel !== args.channel) {
134
+ return {
135
+ valid: false,
136
+ eligible: false,
137
+ reason: `policy channel ${args.policy.channel} does not match ${args.channel}`,
138
+ };
139
+ }
140
+ const componentName = args.targetComponent ?? 'daemon';
141
+ const daemon = args.policy.components[componentName];
142
+ if (!daemon || daemon.version !== args.targetDaemonVersion) {
143
+ return {
144
+ valid: false,
145
+ eligible: false,
146
+ reason: `policy ${componentName} component does not bind the target artifact version`,
147
+ };
148
+ }
149
+ for (const [name, range] of Object.entries(daemon.contracts ?? {})) {
150
+ const actual = args.contracts[name];
151
+ if (!Number.isInteger(actual) || actual < range.minimum || actual > range.maximum) {
152
+ return {
153
+ valid: false,
154
+ eligible: false,
155
+ reason: `local contract ${name}=${String(actual)} is outside policy range ${range.minimum}..${range.maximum}`,
156
+ };
157
+ }
158
+ }
159
+ const eligible = !args.autonomous || isReleasePolicyCohortEligible(args.policy, args.cohortSubject);
160
+ return eligible
161
+ ? { valid: true, eligible: true }
162
+ : { valid: true, eligible: false, reason: 'machine is outside rollout cohort' };
163
+ }
@@ -0,0 +1,2 @@
1
+ /** SemVer precedence shared by every local release consumer. Invalid inputs are never ordered. */
2
+ export declare function compareReleaseVersions(a: string, b: string): -1 | 0 | 1 | null;
@@ -0,0 +1,41 @@
1
+ /** SemVer precedence shared by every local release consumer. Invalid inputs are never ordered. */
2
+ export function compareReleaseVersions(a, b) {
3
+ const parse = (value) => {
4
+ if (typeof value !== 'string')
5
+ return null;
6
+ const match = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/.exec(value.trim());
7
+ if (!match)
8
+ return null;
9
+ const prerelease = match[4]?.split('.') ?? [];
10
+ if (prerelease.some((part) => /^\d+$/.test(part) && part.length > 1 && part[0] === '0'))
11
+ return null;
12
+ return { core: match.slice(1, 4).map(BigInt), prerelease };
13
+ };
14
+ const left = parse(a);
15
+ const right = parse(b);
16
+ if (!left || !right)
17
+ return null;
18
+ for (let i = 0; i < 3; i++) {
19
+ if (left.core[i] !== right.core[i])
20
+ return left.core[i] < right.core[i] ? -1 : 1;
21
+ }
22
+ if (!left.prerelease.length || !right.prerelease.length) {
23
+ return left.prerelease.length === right.prerelease.length ? 0 : left.prerelease.length ? -1 : 1;
24
+ }
25
+ for (let i = 0; i < Math.max(left.prerelease.length, right.prerelease.length); i++) {
26
+ const l = left.prerelease[i];
27
+ const r = right.prerelease[i];
28
+ if (l === undefined || r === undefined)
29
+ return l === r ? 0 : l === undefined ? -1 : 1;
30
+ if (l === r)
31
+ continue;
32
+ const ln = /^\d+$/.test(l);
33
+ const rn = /^\d+$/.test(r);
34
+ if (ln && rn)
35
+ return BigInt(l) < BigInt(r) ? -1 : 1;
36
+ if (ln !== rn)
37
+ return ln ? -1 : 1;
38
+ return l < r ? -1 : 1;
39
+ }
40
+ return 0;
41
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skrr-ai/auth-core",
3
- "version": "0.4.18",
3
+ "version": "0.4.20",
4
4
  "main": "dist/cjs/index.js",
5
5
  "types": "dist/esm/index.d.ts",
6
6
  "exports": {
@@ -14,6 +14,16 @@
14
14
  "default": "./dist/cjs/index.js"
15
15
  }
16
16
  },
17
+ "./github-push-refusal": {
18
+ "import": {
19
+ "types": "./dist/esm/githubPushRefusal.d.ts",
20
+ "default": "./dist/esm/githubPushRefusal.js"
21
+ },
22
+ "require": {
23
+ "types": "./dist/cjs/githubPushRefusal.d.ts",
24
+ "default": "./dist/cjs/githubPushRefusal.js"
25
+ }
26
+ },
17
27
  "./refresh-classification": {
18
28
  "import": {
19
29
  "types": "./dist/esm/refreshClassification.d.ts",
@@ -143,6 +153,36 @@
143
153
  "types": "./dist/cjs/commitmentExecutionContract.d.ts",
144
154
  "default": "./dist/cjs/commitmentExecutionContract.js"
145
155
  }
156
+ },
157
+ "./harness-permission-controls": {
158
+ "import": {
159
+ "types": "./dist/esm/harnessPermissionControls.d.ts",
160
+ "default": "./dist/esm/harnessPermissionControls.js"
161
+ },
162
+ "require": {
163
+ "types": "./dist/cjs/harnessPermissionControls.d.ts",
164
+ "default": "./dist/cjs/harnessPermissionControls.js"
165
+ }
166
+ },
167
+ "./first-party-harness-updater": {
168
+ "import": {
169
+ "types": "./dist/esm/firstPartyHarnessUpdater.d.ts",
170
+ "default": "./dist/esm/firstPartyHarnessUpdater.js"
171
+ },
172
+ "require": {
173
+ "types": "./dist/cjs/firstPartyHarnessUpdater.d.ts",
174
+ "default": "./dist/cjs/firstPartyHarnessUpdater.js"
175
+ }
176
+ },
177
+ "./release-policy": {
178
+ "import": {
179
+ "types": "./dist/esm/releasePolicy.d.ts",
180
+ "default": "./dist/esm/releasePolicy.js"
181
+ },
182
+ "require": {
183
+ "types": "./dist/cjs/releasePolicy.d.ts",
184
+ "default": "./dist/cjs/releasePolicy.js"
185
+ }
146
186
  }
147
187
  },
148
188
  "dependencies": {