@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
@@ -5,6 +5,7 @@ exports.blockerDetailLines = blockerDetailLines;
5
5
  exports.completionLines = completionLines;
6
6
  exports.labelsLine = labelsLine;
7
7
  exports.taskExecutorLabel = taskExecutorLabel;
8
+ exports.recurrenceArmFailureLines = recurrenceArmFailureLines;
8
9
  exports.taskFailureLines = taskFailureLines;
9
10
  const core_1 = require("@oclif/core");
10
11
  const data_provider_1 = require("@skrr-ai/data-provider");
@@ -137,6 +138,20 @@ function taskExecutorLabel(t, bin = 'skrr') {
137
138
  return '-';
138
139
  }
139
140
  }
141
+ /**
142
+ * The `Recurrence:` line for a series whose next occurrence was never armed.
143
+ * Silent otherwise: a healthy series has nothing to say here.
144
+ */
145
+ function recurrenceArmFailureLines(t, bin = 'skrr') {
146
+ const recurrence = t.recurrence;
147
+ const code = recurrence?.armFailure?.code;
148
+ if (typeof code !== 'string' || !code)
149
+ return [];
150
+ return [
151
+ `Recurrence: ${(0, data_provider_1.describeRecurrenceArmFailure)(code)} (${code})`,
152
+ ` Reschedule with \`${bin} tasks schedule\` to start the series again.`,
153
+ ];
154
+ }
140
155
  /**
141
156
  * The failure rows of `tasks show`, when there are any. (S3 dogfood finding)
142
157
  *
@@ -321,6 +336,8 @@ class TasksShow extends base_command_1.BaseCommand {
321
336
  // question and this is the answer to it.
322
337
  for (const line of taskFailureLines(t, this.config.bin))
323
338
  this.log(line);
339
+ for (const line of recurrenceArmFailureLines(t, this.config.bin))
340
+ this.log(line);
324
341
  /*
325
342
  * Closing is the actor's call — a Task may be `done` with work still
326
343
  * outstanding, and `resolution.closure` is where the server recorded what
@@ -17,6 +17,10 @@ export default class TasksUpdate extends BaseCommand {
17
17
  priority: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
18
18
  'start-date': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
19
19
  'due-date': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
20
+ savings: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
21
+ per: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
22
+ effort: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
23
+ risk: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
20
24
  estimate: import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
21
25
  /**
22
26
  * Declared, hidden, and refused — on purpose. (S4 dogfood finding)
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@oclif/core");
4
+ const task_economics_1 = require("../../lib/task-economics");
4
5
  const data_provider_1 = require("@skrr-ai/data-provider");
5
6
  const base_command_1 = require("../../base-command");
6
7
  const web_url_1 = require("../../lib/web-url");
@@ -62,6 +63,13 @@ class TasksUpdate extends base_command_1.BaseCommand {
62
63
  }),
63
64
  'start-date': core_1.Flags.string({ description: 'New planned start date (ISO string)' }),
64
65
  'due-date': core_1.Flags.string({ description: 'New due date (ISO string)' }),
66
+ savings: core_1.Flags.string({ description: 'Expected USD savings (requires --per)' }),
67
+ per: core_1.Flags.string({
68
+ options: ['month', 'year', 'once'],
69
+ description: 'Savings period (requires --savings)',
70
+ }),
71
+ effort: core_1.Flags.string({ description: 'Expected effort in hours, nonnegative' }),
72
+ risk: core_1.Flags.string({ options: ['low', 'medium', 'high'], description: 'Expected risk' }),
65
73
  estimate: core_1.Flags.integer({
66
74
  description: 'New estimate value from the Space estimate scale. Requires a scale on the Space (or an ' +
67
75
  'ancestor it inherits from); with none set, the server drops the value. Set the scale ' +
@@ -356,6 +364,7 @@ class TasksUpdate extends base_command_1.BaseCommand {
356
364
  startDate: flags['start-date'],
357
365
  dueDate: flags['due-date'],
358
366
  estimate: flags.estimate,
367
+ economics: (0, task_economics_1.economicsFromFlags)(flags, body.economics),
359
368
  // Never sent: `taskUpdateMutationGuard` refuses any payload carrying
360
369
  // `status` before the request is built. It is merged in only so the guard
361
370
  // sees it and answers with the sentence that names `tasks move`.
@@ -88,8 +88,8 @@ class TasksWorkflowFindings extends base_command_1.BaseCommand {
88
88
  }
89
89
  this.log(`Reported ${response.reported} finding(s) on ${response.nodeKey}.`);
90
90
  this.log(`Open blocking: ${response.openBlocking} of ${response.total} total.`);
91
- this.log(response.converged
92
- ? 'No blocking findings remain open — this review has converged.'
91
+ this.log(response.openBlocking === 0
92
+ ? 'No blocking findings are currently open. Panel availability is evaluated by the Workflow engine.'
93
93
  : 'Each open blocking finding must be fixed, or rebutted with evidence, before this converges.');
94
94
  }
95
95
  }
@@ -12,11 +12,9 @@ import { BaseCommand } from '../../base-command';
12
12
  * `GET /api/auth/sessions/refresh` has served exactly this list all along; it
13
13
  * was simply not reachable from the CLI.
14
14
  *
15
- * The server returns at most `--limit` rows and says whether it left any out.
16
- * It used to stop at 100 without saying so, and the session somebody went
17
- * looking for — an old daemon's, still holding the login a purge refusal named
18
- * — was exactly the one past the cut (OSK-9980). So a partial list says it is
19
- * partial, and `--kind daemon` is the short way to the row that matters.
15
+ * The server returns at most 500 rows per page; this command follows cursors
16
+ * until its total `--limit` is reached. The default stays at 100. Older servers
17
+ * without cursors can only return their first page, which is disclosed.
20
18
  */
21
19
  export default class TokenList extends BaseCommand {
22
20
  static description: string;
@@ -18,18 +18,16 @@ const SESSION_KINDS = ['web', 'daemon', 'cli', 'ci'];
18
18
  * `GET /api/auth/sessions/refresh` has served exactly this list all along; it
19
19
  * was simply not reachable from the CLI.
20
20
  *
21
- * The server returns at most `--limit` rows and says whether it left any out.
22
- * It used to stop at 100 without saying so, and the session somebody went
23
- * looking for — an old daemon's, still holding the login a purge refusal named
24
- * — was exactly the one past the cut (OSK-9980). So a partial list says it is
25
- * partial, and `--kind daemon` is the short way to the row that matters.
21
+ * The server returns at most 500 rows per page; this command follows cursors
22
+ * until its total `--limit` is reached. The default stays at 100. Older servers
23
+ * without cursors can only return their first page, which is disclosed.
26
24
  */
27
25
  class TokenList extends base_command_1.BaseCommand {
28
26
  static description = 'List the active sessions a minted token belongs to — the other half of `token mint`';
29
27
  static examples = [
30
28
  '<%= config.bin %> token list',
31
29
  '<%= config.bin %> token list --kind daemon',
32
- '<%= config.bin %> token list --kind cli --limit 500 --json',
30
+ '<%= config.bin %> token list --kind cli --limit 1000 --json',
33
31
  ];
34
32
  static flags = {
35
33
  kind: core_1.Flags.string({
@@ -37,75 +35,119 @@ class TokenList extends base_command_1.BaseCommand {
37
35
  options: [...SESSION_KINDS],
38
36
  }),
39
37
  limit: core_1.Flags.integer({
40
- description: 'Most sessions to list (server maximum 500)',
38
+ description: 'Most sessions to list (default 100; up to 5000 across pages)',
41
39
  min: 1,
42
- max: 500,
40
+ max: 5000,
43
41
  }),
44
42
  json: core_1.Flags.boolean({ description: 'Output JSON' }),
45
43
  };
46
44
  async run() {
47
45
  this.requireAuth();
48
46
  const { flags } = await this.parse(TokenList);
49
- const query = new URLSearchParams();
50
- if (flags.kind)
51
- query.set('kind', flags.kind);
52
- if (flags.limit)
53
- query.set('limit', String(flags.limit));
54
- const suffix = query.toString() ? `?${query.toString()}` : '';
55
- let data = null;
56
- try {
57
- data = await (0, api_fetch_1.apiFetch)(`/api/auth/sessions/refresh${suffix}`, {
58
- method: 'GET',
59
- credential: this.resolvedCredential,
60
- });
61
- }
62
- catch (err) {
63
- this.handleApiError(err);
47
+ const requestedLimit = flags.limit ?? 100;
48
+ const allSessions = [];
49
+ const seenCursors = new Set();
50
+ let cursor = null;
51
+ let olderServer = false;
52
+ let cannotPage = false;
53
+ let hasMore = false;
54
+ let pageCount = 0;
55
+ while (allSessions.length < requestedLimit) {
56
+ const pageLimit = Math.min(500, requestedLimit - allSessions.length);
57
+ const query = new URLSearchParams({ limit: String(pageLimit) });
58
+ if (flags.kind)
59
+ query.set('kind', flags.kind);
60
+ if (cursor)
61
+ query.set('cursor', cursor);
62
+ let page = null;
63
+ try {
64
+ page = await (0, api_fetch_1.apiFetch)(`/api/auth/sessions/refresh?${query.toString()}`, {
65
+ method: 'GET',
66
+ credential: this.resolvedCredential,
67
+ });
68
+ }
69
+ catch (err) {
70
+ this.handleApiError(err);
71
+ return;
72
+ }
73
+ pageCount += 1;
74
+ const rows = Array.isArray(page?.sessions) ? page.sessions : [];
75
+ allSessions.push(...rows.slice(0, pageLimit));
76
+ // Old servers did not send hasMore and could silently stop at 100.
77
+ olderServer = page?.hasMore === undefined;
78
+ hasMore = olderServer
79
+ ? rows.length >= Math.min(100, pageLimit)
80
+ : page?.hasMore === true || rows.length > pageLimit;
81
+ if (!hasMore || olderServer)
82
+ break;
83
+ const next = page?.nextCursor;
84
+ if (typeof next !== 'string' ||
85
+ !/^[a-fA-F0-9]{24}$/.test(next) ||
86
+ seenCursors.has(next) ||
87
+ rows.length === 0) {
88
+ cannotPage = true;
89
+ break;
90
+ }
91
+ if (allSessions.length >= requestedLimit)
92
+ break;
93
+ if (pageCount >= 20) {
94
+ cannotPage = true;
95
+ break;
96
+ }
97
+ seenCursors.add(next);
98
+ cursor = next;
64
99
  }
65
100
  // Filtered here as well: a server from before `kind` existed ignores the
66
101
  // parameter and returns every kind, and `--kind daemon` must never list a
67
102
  // web session as if it were one.
68
- const sessions = (data?.sessions || []).filter((session) => !flags.kind || session.kind === flags.kind);
69
- // A server from before `hasMore` stopped at 100 and said nothing about it,
70
- // and ignores `--limit` too — so it gets its own, weaker statement.
71
- const olderServer = data?.hasMore === undefined;
72
- const hasMore = olderServer ? (data?.sessions?.length ?? 0) >= 100 : data?.hasMore === true;
103
+ const sessions = allSessions.filter((session) => !flags.kind || session.kind === flags.kind);
73
104
  if (flags.json) {
74
105
  return this.log(JSON.stringify({ sessions, count: sessions.length, hasMore }, null, 2));
75
106
  }
76
- if (!sessions.length)
77
- return this.log('No active sessions.');
78
- (0, format_1.renderTable)(sessions.map((session) => ({
79
- id: session.id,
80
- kind: session.kind,
81
- // The operator's own name for the credential wins over a derived
82
- // device string — it is what they would search by.
83
- device: session.label || session.device || '-',
84
- // What `instructions`, `machines` and a purge refusal call it.
85
- daemon: session.daemonId || '-',
86
- ip: session.ip || '-',
87
- lastActive: session.lastActiveAt || session.createdAt || '-',
88
- // The session you are typing in. Revoking it signs THIS machine out,
89
- // which is the one outcome nobody means when they revoke a credential.
90
- current: session.current ? 'yes' : '',
91
- })), [
92
- { key: 'id', header: 'ID' },
93
- { key: 'kind', header: 'KIND' },
94
- { key: 'device', header: 'DEVICE', maxWidth: 34 },
95
- { key: 'daemon', header: 'DAEMON', maxWidth: 40 },
96
- { key: 'ip', header: 'IP' },
97
- { key: 'lastActive', header: 'LAST ACTIVE' },
98
- { key: 'current', header: 'CURRENT' },
99
- ], (line) => this.log(line));
107
+ if (!sessions.length && !hasMore) {
108
+ return this.log(flags.kind ? 'No matching active sessions.' : 'No active sessions.');
109
+ }
110
+ if (!sessions.length) {
111
+ this.log('No matching sessions in the returned page. More may be available.');
112
+ }
113
+ else {
114
+ (0, format_1.renderTable)(sessions.map((session) => ({
115
+ id: session.id,
116
+ kind: session.kind,
117
+ // The operator's own name for the credential wins over a derived
118
+ // device string — it is what they would search by.
119
+ device: session.label || session.device || '-',
120
+ // What `instructions`, `machines` and a purge refusal call it.
121
+ daemon: session.daemonId || '-',
122
+ ip: session.ip || '-',
123
+ lastActive: session.lastActiveAt || session.createdAt || '-',
124
+ // The session you are typing in. Revoking it signs THIS machine out,
125
+ // which is the one outcome nobody means when they revoke a credential.
126
+ current: session.current ? 'yes' : '',
127
+ })), [
128
+ { key: 'id', header: 'ID' },
129
+ { key: 'kind', header: 'KIND' },
130
+ { key: 'device', header: 'DEVICE', maxWidth: 34 },
131
+ { key: 'daemon', header: 'DAEMON', maxWidth: 40 },
132
+ { key: 'ip', header: 'IP' },
133
+ { key: 'lastActive', header: 'LAST ACTIVE' },
134
+ { key: 'current', header: 'CURRENT' },
135
+ ], (line) => this.log(line));
136
+ }
100
137
  this.log('');
101
138
  if (hasMore && olderServer) {
102
- this.log('This server lists at most 100 sessions and does not say whether it left any out, so older ones may be missing.');
139
+ this.log('This server did not say whether more sessions exist or provide a cursor. The list may be incomplete.');
140
+ }
141
+ else if (hasMore && cannotPage) {
142
+ this.log('This server reported more sessions but did not provide a usable next page. Retry after the server updates, or narrow with --kind.');
103
143
  }
104
144
  else if (hasMore) {
105
- const remedy = flags.kind
106
- ? 'Raise --limit (up to 500) to see them.'
107
- : 'Narrow the list with --kind, or raise --limit (up to 500).';
108
- this.log(`Showing the ${sessions.length} most recently active sessions; older ones were left out. ${remedy}`);
145
+ const remedy = requestedLimit >= 5000
146
+ ? 'Narrow the list with --kind.'
147
+ : flags.kind
148
+ ? 'Raise --limit (up to 5000) to see more.'
149
+ : 'Narrow the list with --kind, or raise --limit (up to 5000).';
150
+ this.log(`Showing ${sessions.length} sessions in creation order; more were left out. ${remedy}`);
109
151
  }
110
152
  this.log('Retire one with: skrr token revoke <id>');
111
153
  }
@@ -21,6 +21,8 @@ export default class TriggersCreate extends BaseCommand {
21
21
  'effect-contract': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
22
22
  'effect-write-mode': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
23
23
  'effect-options': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
24
+ 'workflow-event-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
25
+ 'workflow-outcome': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
24
26
  dispatch: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
25
27
  reference: import("@oclif/core/lib/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
26
28
  references: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
@@ -61,6 +61,14 @@ class TriggersCreate extends base_command_1.BaseCommand {
61
61
  dependsOn: ['effect-contract'],
62
62
  }),
63
63
  'effect-options': core_1.Flags.string({ description: 'Effect policy options JSON object' }),
64
+ 'workflow-event-key': core_1.Flags.string({
65
+ description: 'Exact event key the parked workflow step waits on (required for mode=workflow_signal). Resolves steps in the scope Space; the trigger owner must hold Space edit access at every fire',
66
+ }),
67
+ 'workflow-outcome': core_1.Flags.string({
68
+ description: 'How the resolved step settles (default success)',
69
+ options: ['success', 'failure'],
70
+ dependsOn: ['workflow-event-key'],
71
+ }),
64
72
  dispatch: core_1.Flags.string({
65
73
  description: 'auto_start fires the work immediately; manual parks it as todo',
66
74
  options: ['auto_start', 'manual'],
@@ -218,6 +226,13 @@ class TriggersCreate extends base_command_1.BaseCommand {
218
226
  builtinAction,
219
227
  conversationId: flags.conversation,
220
228
  effectPolicy,
229
+ // Built only when a key is named, for the same reason as effectPolicy.
230
+ workflowSignal: flags['workflow-event-key']
231
+ ? {
232
+ eventKey: flags['workflow-event-key'],
233
+ ...(flags['workflow-outcome'] ? { outcome: flags['workflow-outcome'] } : {}),
234
+ }
235
+ : undefined,
221
236
  dispatch: flags.dispatch,
222
237
  references: (0, triggers_1.parseExecutionReferences)(flags.reference, flags.references),
223
238
  workingHours: (0, triggers_1.parseJsonObject)(flags['working-hours'], '--working-hours'),
@@ -0,0 +1,14 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Update extends Command {
3
+ static summary: string;
4
+ static description: string;
5
+ static examples: string[];
6
+ static flags: {
7
+ check: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
8
+ status: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
9
+ component: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ restart: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const config_1 = require("../lib/config");
5
+ const cli_runtime_1 = require("../lib/cli-runtime");
6
+ const platform_update_1 = require("../lib/platform-update");
7
+ const platform_update_local_1 = require("../lib/platform-update-local");
8
+ class Update extends core_1.Command {
9
+ static summary = 'Check or update the CLI, Code engine and daemon on this computer';
10
+ static description = 'Uses each component’s existing installer and signed update policy. No cloud login is required. ' +
11
+ 'Updates installed components; use `skrr code install` or `skrr daemon install` to add missing components. ' +
12
+ 'Code updates apply to new sessions. npm CLI updates wait for active commands to finish. ' +
13
+ 'App, image and source installations show the command for their owner.';
14
+ static examples = [
15
+ '<%= config.bin %> update --check',
16
+ '<%= config.bin %> update --status --json',
17
+ '<%= config.bin %> update',
18
+ '<%= config.bin %> update --component code',
19
+ '<%= config.bin %> update --component daemon --restart',
20
+ ];
21
+ static flags = {
22
+ check: core_1.Flags.boolean({
23
+ description: 'Check offered versions without downloading or installing binaries',
24
+ exclusive: ['status'],
25
+ }),
26
+ status: core_1.Flags.boolean({
27
+ description: 'Show installed versions and recorded update results without network requests',
28
+ exclusive: ['check'],
29
+ }),
30
+ component: core_1.Flags.string({
31
+ options: ['all', 'cli', 'code', 'daemon'],
32
+ default: 'all',
33
+ description: 'Which installed component to inspect or update',
34
+ }),
35
+ json: core_1.Flags.boolean({ description: 'Emit one structured result for every selected component' }),
36
+ restart: core_1.Flags.boolean({
37
+ description: 'Request daemon restart after applying its update',
38
+ exclusive: ['check', 'status'],
39
+ }),
40
+ };
41
+ async run() {
42
+ const { flags } = await this.parse(Update);
43
+ if (flags.restart && !['all', 'daemon'].includes(flags.component)) {
44
+ this.error('--restart applies to the daemon; select --component daemon or all.');
45
+ }
46
+ const result = await (0, platform_update_1.runPlatformUpdate)({
47
+ mode: flags.check ? 'check' : flags.status ? 'status' : 'apply',
48
+ component: flags.component,
49
+ currentVersion: (0, cli_runtime_1.getCliVersion)(this.config.root),
50
+ baseURL: (0, config_1.loadConfig)().baseURL,
51
+ restart: flags.restart,
52
+ }, platform_update_local_1.localPlatformUpdateDependencies);
53
+ if (flags.json)
54
+ this.log(JSON.stringify(result, null, 2));
55
+ else
56
+ this.log(result.components.map(platform_update_1.describeComponentUpdate).join('\n\n'));
57
+ if (!result.ok)
58
+ this.exit(1);
59
+ }
60
+ }
61
+ exports.default = Update;
@@ -0,0 +1,12 @@
1
+ import { BaseCommand } from '../../base-command';
2
+ export default class WorkspacesGrants extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ workspaceId: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
10
+ };
11
+ run(): Promise<void>;
12
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const base_command_1 = require("../../base-command");
5
+ const workspaces_1 = require("../../lib/workspaces");
6
+ const stewardship_output_1 = require("../../lib/stewardship-output");
7
+ class WorkspacesGrants extends base_command_1.BaseCommand {
8
+ static description = 'Read workspace Grant metadata and impact (person owner/admin only)';
9
+ static examples = ['<%= config.bin %> workspaces grants <workspace-id> --json'];
10
+ static args = {
11
+ workspaceId: core_1.Args.string({ required: true, ignoreStdin: true, description: 'Workspace ID' }),
12
+ };
13
+ static flags = {
14
+ json: core_1.Flags.boolean({ description: 'Output metadata and coverage as JSON' }),
15
+ };
16
+ async run() {
17
+ this.requireAuth();
18
+ const { args, flags } = await this.parse(WorkspacesGrants);
19
+ try {
20
+ const report = await (0, workspaces_1.listWorkspaceGrants)(args.workspaceId);
21
+ if (flags.json)
22
+ this.log(JSON.stringify(report, null, 2));
23
+ else
24
+ (0, stewardship_output_1.printWorkspaceGrants)(report, (line) => this.log(line));
25
+ }
26
+ catch (error) {
27
+ this.handleApiError(error);
28
+ }
29
+ }
30
+ }
31
+ exports.default = WorkspacesGrants;
@@ -0,0 +1,13 @@
1
+ import { BaseCommand } from '../../base-command';
2
+ export default class WorkspacesStewardship extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ workspaceId: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
7
+ userId: import("@oclif/core/lib/interfaces").Arg<string, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const base_command_1 = require("../../base-command");
5
+ const workspaces_1 = require("../../lib/workspaces");
6
+ const stewardship_output_1 = require("../../lib/stewardship-output");
7
+ class WorkspacesStewardship extends base_command_1.BaseCommand {
8
+ static description = 'Read a member’s workspace stewardship metadata (person owner/admin only)';
9
+ static examples = [
10
+ '<%= config.bin %> workspaces stewardship <workspace-id> <user-id> --json',
11
+ ];
12
+ static args = {
13
+ workspaceId: core_1.Args.string({ required: true, ignoreStdin: true, description: 'Workspace ID' }),
14
+ userId: core_1.Args.string({ required: true, ignoreStdin: true, description: 'Member user ID' }),
15
+ };
16
+ static flags = {
17
+ json: core_1.Flags.boolean({ description: 'Output metadata and coverage as JSON' }),
18
+ };
19
+ async run() {
20
+ this.requireAuth();
21
+ const { args, flags } = await this.parse(WorkspacesStewardship);
22
+ try {
23
+ const report = await (0, workspaces_1.getWorkspaceStewardship)(args.workspaceId, args.userId);
24
+ if (flags.json)
25
+ this.log(JSON.stringify(report, null, 2));
26
+ else
27
+ (0, stewardship_output_1.printWorkspaceStewardship)(report, (line) => this.log(line));
28
+ }
29
+ catch (error) {
30
+ this.handleApiError(error);
31
+ }
32
+ }
33
+ }
34
+ exports.default = WorkspacesStewardship;
@@ -0,0 +1,9 @@
1
+ {
2
+ "oversky-task-management": {
3
+ "key": "oversky-task-management",
4
+ "name": "skrr Task Management",
5
+ "templateVersion": 20,
6
+ "body": "## OverSky Task Management\n\nUse `skrr` as the durable record for work that must outlive this conversation.\n\n### One concept, one record\n\n- **Task** says what is owed and where it stands.\n- **Expectation** says what must be true before the Task can close.\n- **Update** says what meaningfully changed during execution.\n- **Resume Point** says where one Run can safely continue after interruption.\n- **Result** says what the work concluded or returned.\n- **Deliverable** identifies a concrete Resource version produced by the work.\n- **Review** says whether another actor accepted one exact Result.\n- **Comment** is replyable collaboration.\n- **Activity** is the immutable audit projection. A Run transcript is detailed telemetry, not Activity.\n\nDo not put a Result in a Comment, use an Update as a transcript, or use review words such as\n“approved” for a domain conclusion such as NO-SHIP.\n\nThe platform derives Human, Agent, Run, session, and recording provenance from the authenticated\nruntime. Never supply or invent an Agent identity. An Update has one author; a multi-Agent summary\nmay cite contributors and their source Runs or Updates.\n\n### During execution: write Updates at meaningful boundaries\n\nDo not log routine reads, tool calls, heartbeats, token counts, or repeated “still working” narration.\nRecord an Update only when a future reader or replacement Run needs to know that shared state changed:\n\nEach type has a REQUIRED `--data` shape, and the array fields are required even when empty.\nOptional fields are marked `?`. The server rejects a missing required field, so guessing from the\nprose costs a round trip:\n\n- `progress`: a material part is complete.\n `{completedSinceLast: string[], nextActions: string[], currentFocus?}`\n- `finding`: a newly discovered fact. `impact` is optional; the evidence references are not.\n `{finding, evidenceRefs: [], impact?, severity?}`\n- `decision`: a choice now constrains the work.\n `{decision, rationale, alternativesConsidered?: string[]}`\n- `blocker`: work cannot continue. `nextOwner` is a principal OBJECT, not a name.\n `{cause, requiredAction, nextOwner: {kind: \"human\", userId}}`\n- `verification`: a claim was checked. `result` is one of `passed`, `failed`, `inconclusive`.\n `{claim, result, evidenceRefs: []}`\n- `ready_for_review`: created by Result submission; do not author it separately.\n\n`--reference <kind>:<id>` sets the Update's OWN references. It does not populate\n`data.evidenceRefs`, which belongs inside `--data`.\n\nUse one stable idempotency key only for retries of the identical write. Reusing it for different\ncontent is rejected.\n\nExample:\n\n```bash\nskrr tasks updates add <task-id> \\\n --type progress \\\n --summary \"Migration review complete\" \\\n --data '{\"completedSinceLast\":[\"Checked migrations 001-014\"],\"currentFocus\":\"Authorization review\",\"nextActions\":[\"Inspect legacy adapters\"]}' \\\n --idempotency-key \"<task-id>:migration-review\"\n```\n\nFor a decision:\n\n```bash\nskrr tasks updates add <task-id> \\\n --type decision \\\n --summary \"Use a first-class Resource identity\" \\\n --data '{\"decision\":\"Use WorkResource plus immutable versions\",\"rationale\":\"A URL can move and cannot identify the version a reviewer accepted\"}' \\\n --idempotency-key \"<task-id>:resource-model\"\n```\n\nFor a finding — `evidenceRefs` is required and may be empty:\n\n```bash\nskrr tasks updates add <task-id> \\\n --type finding \\\n --summary \"The closure gate reads assessments by exact specVersion\" \\\n --data '{\"finding\":\"A cosmetic title edit bumps specVersion, so every prior assessment stops counting\",\"impact\":\"A task with expectations cannot be closed after a rename\",\"evidenceRefs\":[{\"kind\":\"code\",\"uri\":\"api/server/services/TaskClosurePolicy/index.js\"}]}' \\\n --idempotency-key \"<task-id>:spec-bump-revocation\"\n```\n\nFor a blocker — `nextOwner` is a principal object:\n\n```bash\nskrr tasks updates add <task-id> \\\n --type blocker \\\n --summary \"Waiting on production database credentials\" \\\n --data '{\"cause\":\"The migration needs write access to the prod cluster\",\"requiredAction\":\"Grant the deploy role write access, or run the migration yourself\",\"nextOwner\":{\"kind\":\"human\",\"userId\":\"<user-id>\"}}' \\\n --idempotency-key \"<task-id>:needs-prod-credentials\"\n```\n\nFor a verification:\n\n```bash\nskrr tasks updates add <task-id> \\\n --type verification \\\n --summary \"Re-ran the closure flow end to end after the fix\" \\\n --data '{\"claim\":\"A renamed task with one assessed expectation can close\",\"result\":\"passed\",\"evidenceRefs\":[{\"kind\":\"task\",\"id\":\"<task-id>\"}]}' \\\n --idempotency-key \"<task-id>:closure-reverify\"\n```\n\n### Media: screenshots and recordings\n\n`--attach <path>` (repeatable) on `updates add`, `result submit`, `complete`, or `comments add`\nuploads a file as a Task asset and cites it; identical bytes dedupe. In-run proof goes on a\n`verification` or `progress` Update, the final before/after on the Result, never the description.\nAn upload is `self_reported` evidence and counts toward the storage quota. Images keep full\nresolution minus metadata (Runs get a model-sized copy); undecodable bytes get 422, a type the bytes\ncontradict 415, and SVG downloads as a file. An agent uploads evidence (the default) or\n`--role deliverable`; `input` is refused (403): ask a person to run `attachments set-role`. Cite a\ndeliverable as `--evidence task_attachment:<asset-id>` when you assess its Expectation.\n\n### Recovery: Update delta and Resume Point snapshot\n\nWhen a semantic boundary should also be resumable, add `--run-id` and `--resume` to the same Update\ncommand. The server commits the visible Update and the Run-bound Resume Point together. The snapshot\nmust be self-contained enough for another capable Agent to continue without replaying the transcript:\ncompleted work, current focus, next actions, open questions, and references to decisions, evidence,\nDeliverables, and durable workspace state.\n\nThe runtime may save a silent crash-safety snapshot with:\n\n```bash\nskrr tasks resume save <task-id> --run-id <run-id> --snapshot '<resume-json>'\n```\n\nNever put credentials, secrets, permission grants, bearer tokens, or leases in a Resume Point. A\nresumed Run reloads the current Task Revision, re-authorizes, validates referenced files/commits, and\nreads Updates recorded after the snapshot:\n\n```bash\nskrr tasks resume show <task-id> --run-id <run-id>\n```\n\n### Deliverables: lightweight input, first-class identity\n\nA user may provide one coordinate, but the platform records a WorkResource, its exact version, the\nTask relationship, and an evidence-backed availability observation. External reference is the\ndefault; OverSky-managed content is used only when retention, stable access, preview/search, or\npolicy requires a copy.\n\n```bash\nskrr tasks deliverable add <task-id> \\\n file/markdown:docs/reviews/report.md@docs/reviews/report.md \\\n --status in_review\n```\n\nA recording made by its producer is always self-reported; the caller cannot promote itself to a\nHuman confirmation, system observation, or provider receipt. A local path is only local availability. A commit, provider revision, digest, or managed object\nfreezes the exact version. Do not call “in the conversation” a Deliverable.\n\nA Human confirms the exact linked version, not a retyped URL or name:\n\n```bash\nskrr tasks deliverable confirm <task-id> <task-resource-link-id> --reason \"Opened and checked this exact version\"\n```\n\n### Result and Review are separate\n\nSubmit the finished answer once:\n\n```bash\nskrr tasks result submit <task-id> \\\n --summary \"NO-SHIP until remediation Gates A-D pass\" \\\n --conclusion-type release_recommendation \\\n --conclusion-json '{\"posture\":\"no_ship\"}' \\\n --deliverable <task-resource-link-id>\n```\n\nAn amendment creates a new Result version and explicitly supersedes the previous one. There is one\ncurrent Result; old versions remain in Activity and are not ordinary Updates.\n\nOnly another actor records acceptance, against that exact Result:\n\n```bash\nskrr tasks review <task-id> --result-id <result-id> --decision accepted --rationale \"Evidence checked\"\n```\n\n“Accepted” means the submitted work was accepted. NO-SHIP, BUY, REJECT, root cause, experiment\ndecision, and similar subject-matter conclusions belong in `Result.conclusion`, never in Review.\n\nUse `skrr tasks complete` only when submitting the Result and advancing workflow in one closeout.\nDo not call `tasks report` before or after it; `tasks complete` already creates the canonical Result.\n\nSubmitting a Result is not the same as closing the Task, and being an Agent is not by itself a\nreason to stop. Closing is always the closer's call — unmet Expectations or a Changes-requested\nReview do not prevent it; they are RECORDED on the close (`resolution.closure`), so closing over\nthem hides nothing and settles nothing. The one exception is an owner-declared required Review\n(`--review-policy required`): a non-owner cannot close without it — unless they close with\n`--force`, which records the override on the resolution — and the owner always can.\n\nSo do not predict the outcome. `result submit` reports where the Task stands after the write —\nread that, and if you need to ask again later:\n\n```bash\nskrr tasks expectations <task-id> # what is owed, and why the Result cannot be accepted yet\n```\n\nSay “ready for review” only when something you read actually said so.\n\n### Expectations\n\nExpectations are free text first. A typed check explains how the statement can be assessed; it never\nreplaces the sentence.\n\nAn Expectation is an obligation, not a lock: it does not stop a close, it is recorded on one — and\nclosing over it settles nothing. Write each one so it can\nbe judged — say what would satisfy it and how that could be checked — because an Expectation authored\nwithout a thought about verification is one you will later be unable to settle honestly. When you\ncreate several across several Tasks, say how many you created and who they fall to; a set of gates\nnobody was told about is work assigned by accident. A Deliverable requirement is one typed Expectation, not a second\n`requiredDeliverables` list. Actual Deliverables are recorded only after something exists.\n\nRead what is owed, then settle it — never rewrite the declaration to make it settleable:\n\n```bash\nskrr tasks expectations <task-id> # what is owed, and how far each one got\nskrr tasks expectations assess <task-id> <expectation-id> \\\n --decision met \\\n --reason \"Ran the suite named in the statement; 49/49 pass\" \\\n --evidence code:<commit>\nskrr tasks expectations assess <task-id> --all \\\n --decision met --reason \"...\" # every one still awaiting a judgement\n```\n\n**You may assess any Expectation that takes a judgement.** A `deliverable` Expectation is not one —\nit settles through its linked Resource and evidence, so record the Deliverable rather than\nassessing it. The assessment is recorded as YOURS — every surface shows `met (agent)` against\n`met (person)` — and a human can override it. The control is attribution, not permission, so what\nyou owe is not restraint but evidence: cite what you actually checked, and prefer `--evidence` and\n`--resource-link-id` over prose.\n\nAssess what you VERIFIED. Not what you intended, not what you inferred from having finished the\nwork. “I could not check this” is a real and useful answer — record it `unmet` with the reason\nrather than leaving it silent, because an unassessed Expectation and one you tried and failed to\nverify send the next reader to different places.\n\nA waiver is a judgement about scope — that this is no longer owed — and it stays a person's call:\nif the honest answer is \"this should be waived,\" say so in an Update or Comment and let a person\nrecord it. Do not delete the Expectation to hide that it was owed.\n\nChanging an Expectation's wording advances the Task specification and **revokes every assessment\nalready recorded** — fix the statement before people start settling it, not after.\n\n### Labels — say what PROGRAM this belongs to\n\nA label is cross-cutting classification: which recurring program a Space or Task\nbelongs to (`dogfood`, `incident`, `experiment`, `migration`), not what state it\nis in. Status, priority and assignee are first-class fields and already answer\ntheir own questions — a label that restates one is noise that will drift out of\nsync with the field it copies.\n\nThe vocabulary is DECLARED, not invented. Read it before you use it:\n\n```bash\nskrr labels list\n```\n\nAttach from that list, never a name you made up. A second spelling of an\nexisting label (`dog-food` beside `dogfood`) is worse than no label at all,\nbecause the whole value of one is that filtering on it returns everything:\n\n```bash\nskrr spaces labels add <space-id> --label <label-id>\nskrr tasks labels attach <task-id> --label <label-id>\n```\n\nCreate a label only when the program it names is real and recurring, and say\nwhich entities it applies to — a label created without `--applicable-to space`\ncannot be attached to a Space, which is how a vocabulary comes to exist that\nnothing can use:\n\n```bash\nskrr labels create --name <name> --applicable-to space --applicable-to task\n```\n\nWhen you create a Space or Task for a recurring program, label it as you create\nit (`--label <id>` on `spaces`, `tasks` and `goals create`). The create\nresponse carries a `_labelGuidance` hint naming the applicable vocabulary WITH\nITS IDS when you attached none — read it, and attach in one follow-up call if\none of them fits. It may also carry `suggested` — a proposal, not a decision;\nattach is your call. `skrr tasks labels suggest <task-id>` asks it of a Task.\n\nIf nothing in the vocabulary fits, attach nothing. \"No label\" is a correct\nanswer and a wrong label is not.\n\n### Comments and blockers\n\nUse a Comment only for a question, answer, or review discussion where a reply is useful. For a\nblocker, first record the typed blocker Update, then move the Task to blocked. Add a Comment only if\nsomeone actually needs to respond.\n\n### Creating and placing Tasks\n\nCreate a Task without asking when work needs tracking across meaningful steps, sessions, or\nfollow-up. Avoid duplicates and do not create Tasks for trivial actions that finish immediately.\n\n```bash\nskrr tasks list --q \"<relevant title>\"\nskrr tasks create --title \"<concise requested result>\" --description \"<scope and constraints>\" --json\nskrr tasks move <task-id> --status in_progress\n```\n\nA Space is a durable ownership, collaboration, and authorization boundary. Use an identified Space\nwhen the work clearly belongs there; otherwise create the Task unscoped. Ask before creating a new\nSpace. An Agent works a Task in a Space only as a Space member, or when it is shared with no one\nelse and its owner assigns and starts it; anything else is refused. Do not widen Agent membership\nmerely to force one task assignment.\n\n### Closing a Task out\n\nThe model above says what each record IS. This is the order they go in, and what each step can\nrefuse:\n\n1. **Record what exists** — `skrr tasks deliverable add`, binding it to the Expectation it answers\n with `--expectation <id>` whenever one applies. Evidence that arrives bound is evidence the next\n reader does not have to reconstruct.\n2. **Submit the answer** — `skrr tasks result submit`. This does not close the Task. Read what it\n reports back.\n3. **Read what is still owed** — `skrr tasks expectations <task-id>`.\n4. **Settle what you verified** — `skrr tasks expectations assess`, citing evidence. `--all` covers\n every Expectation still awaiting a judgement.\n5. **Read the Task state again and report THAT** — not what you intended it to be.\n\nTwo things still matter regardless of how complete the work is: an unmet Expectation, and a\n`changes_requested` Review. Neither blocks a close — but both are stamped onto it\n(`resolution.closure`), so closing over them is a recorded choice, not a clean finish. Neither is\na failure state; both are somebody's turn.\n\nStep 5 is the one that goes wrong quietly, and not only here: before reporting a check as passed,\nconfirm you measured what you think you measured. A pipeline's exit status is the LAST command's, so\n`cmd | tail` reports on `tail`. A filter may match something other than what you meant — a path\npattern can match the directory you are working in. When a result will be reported to a person as\nfact, re-run it in the simplest form that can only mean one thing.\n\nAcross a whole Space, `skrr tasks review-queue --space <space-id>` names every outstanding\njudgement at once, with its evidence and the command that settles it.\n\n### Share readable links and close the loop\n\nShare clickable Task, Space, Goal, and Commitment URLs, never bare IDs. Use the URL returned by the\nCLI; do not construct one. If needed:\n\n```bash\nskrr tasks show <task-id> --json\nskrr spaces show <space-id> --json\nskrr goals show <goal-id> --json\nskrr commitments show <commitment-id> --json\n```\n\nBefore your final response, verify every Task you created or touched reflects reality. If work is\nready for independent review, leave it in review. If blocked, record the blocker and required action.\nIf genuinely complete and accepted under the Task's policy, close it. Include the Task URL in the\nfinal handoff. Never claim a write succeeded unless the CLI returned success.\n\n### Coming back later\n\nYou can arrange to return to something. Four shapes, and picking the right one\nmatters more than the wording:\n\n**Reminder** — the user asked to be reminded. Keep their words; a reminder you\nhave rephrased into your own voice is no longer the thing they asked for.\n\n**Watch** — something has an asynchronous tail: CI, a review, an approval, a\nlong job, a metric. If the condition is machine-checkable (an endpoint plus a\npredicate), say so — that costs nothing and is guaranteed to terminate. Only\nwrite a prose check recipe when the check genuinely needs your judgement or your\ntools, because that one burns a full turn every time it runs. Always give it an\nabort condition: a watch that cannot stop is a leak.\n\n**Check-in** — you decided the conversation is worth returning to. This is\npermission AND restraint. Come back when you will have something worth saying —\na result that will have arrived, a decision that will be ripe, a thread you left\ngenuinely open. When you see one, arrange the return yourself and say in one\nline when you will look again. Do not ask whether you should: that hands the\nperson a decision they did not come to make. Do not come back to ask how it is\ngoing. One conversation holds at most one pending check-in, and when you wake,\nsaying nothing is a legitimate outcome and often the right one.\n\n**Act** — a specific action you already know how to take and the user has already\nagreed to. Not for anything you would still need to ask about.\n\nSettle what you arranged. When you wake and the thing resolved, say so and close\nit out; when it did not, either come back once more with a reason or hand it to\nthe person. Leaving one armed forever is the failure mode here.\n\nFrom a local session, arrange these with `skrr followups` —\n`remind`, `watch`, `checkin`, `act` — and settle them with\n`skrr followups resolve <id> --outcome resolved`.\n\n## OverSky Identity\n\n{{OVERSKY_AGENT_IDENTITY}}\n",
7
+ "hash": "516df90a15e3ced2bcdb9976aec9f9b433478f2886df7cc04276d6ad44ffcde2"
8
+ }
9
+ }
@@ -0,0 +1,5 @@
1
+ import { Hook } from '@oclif/core';
2
+ /** All commands pass through this hook, including the local code/daemon
3
+ * commands that intentionally do not use authenticated BaseCommand. */
4
+ declare const hook: Hook<'init'>;
5
+ export default hook;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const config_1 = require("../lib/config");
4
+ const update_check_1 = require("../lib/update-check");
5
+ /** All commands pass through this hook, including the local code/daemon
6
+ * commands that intentionally do not use authenticated BaseCommand. */
7
+ const hook = async function (options) {
8
+ const argv = [
9
+ ...(options.id ?? '').split(':').filter(Boolean),
10
+ ...(options.argv ?? process.argv.slice(2)),
11
+ ];
12
+ if (!(0, update_check_1.shouldCheckCliUpdateAtStartup)(argv, !!process.stderr.isTTY && !!process.stdin.isTTY))
13
+ return;
14
+ try {
15
+ const baseFlag = argv.findIndex((arg) => arg === '--base-url');
16
+ const suppliedBase = argv.find((arg) => arg.startsWith('--base-url='))?.slice('--base-url='.length) ??
17
+ (baseFlag >= 0 ? argv[baseFlag + 1] : undefined);
18
+ await (0, update_check_1.maybeWarnOutdatedCli)({
19
+ currentVersion: this.config.version,
20
+ baseURL: suppliedBase || (0, config_1.loadConfig)().baseURL,
21
+ });
22
+ }
23
+ catch {
24
+ /* update discovery must not prevent command startup */
25
+ }
26
+ };
27
+ exports.default = hook;
@@ -1,15 +1,3 @@
1
- export declare const COMMITMENT_RESPONSIBILITY_LEVELS: readonly ["reasoning_only", "full_ownership"];
2
- export declare const REASONING_TOOL_ESCAPES: readonly ["bash", "browser"];
3
- /** Warning printed by the three retired Commitment permission flags (OSK-11975). */
4
- export declare const COMMITMENT_PERMISSION_FLAG_RETIRED = "This setting no longer has any effect: Commitment runs use the agent's own permissions.";
5
- /** The three retired flags themselves: accepted at parse, warned on, never sent. */
6
- export declare const RETIRED_COMMITMENT_PERMISSION_FLAGS: readonly ["reasoning-tool-escape", "commitment-responsibility", "commitment-responsibility-ceiling"];
7
- /**
8
- * The deprecation warning ONE retired flag prints. oclif prints a
9
- * `deprecated.message` verbatim, so a shared message printed the same line
10
- * once per flag with nothing saying which flag each one was about (OSK-12068).
11
- */
12
- export declare function retiredCommitmentPermissionFlagMessage(flag: (typeof RETIRED_COMMITMENT_PERMISSION_FLAGS)[number]): string;
13
1
  /**
14
2
  * The fields the server ignored and why, from a write's `deprecatedFields`
15
3
  * notice, one line each. Empty when the response carries none.