@skrr-ai/cli 0.1.22 → 0.1.23

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 (243) hide show
  1. package/README.md +83 -73
  2. package/bin/dev-fallback.js +221 -0
  3. package/bin/run.js +43 -0
  4. package/dist/base-command.d.ts +15 -0
  5. package/dist/base-command.js +71 -10
  6. package/dist/commands/agents/attach-harness.d.ts +37 -0
  7. package/dist/commands/agents/attach-harness.js +102 -3
  8. package/dist/commands/agents/chat.d.ts +69 -1
  9. package/dist/commands/agents/chat.js +202 -22
  10. package/dist/commands/agents/create.d.ts +38 -0
  11. package/dist/commands/agents/create.js +95 -2
  12. package/dist/commands/agents/schedule-trace.js +11 -0
  13. package/dist/commands/agents/show.js +29 -1
  14. package/dist/commands/api-keys/create.d.ts +24 -0
  15. package/dist/commands/api-keys/create.js +80 -0
  16. package/dist/commands/api-keys/list.d.ts +11 -0
  17. package/dist/commands/api-keys/list.js +42 -0
  18. package/dist/commands/api-keys/revoke.d.ts +14 -0
  19. package/dist/commands/api-keys/revoke.js +33 -0
  20. package/dist/commands/api-keys/rotate.d.ts +19 -0
  21. package/dist/commands/api-keys/rotate.js +42 -0
  22. package/dist/commands/balance/index.d.ts +18 -0
  23. package/dist/commands/balance/index.js +29 -0
  24. package/dist/commands/balance/show.d.ts +25 -0
  25. package/dist/commands/balance/show.js +60 -0
  26. package/dist/commands/balance/statement.d.ts +19 -0
  27. package/dist/commands/balance/statement.js +52 -0
  28. package/dist/commands/browser/doctor.d.ts +11 -0
  29. package/dist/commands/browser/doctor.js +11 -0
  30. package/dist/commands/code/jobs/approve.d.ts +25 -0
  31. package/dist/commands/code/jobs/approve.js +52 -0
  32. package/dist/commands/code/jobs/cancel.d.ts +12 -0
  33. package/dist/commands/code/jobs/cancel.js +39 -0
  34. package/dist/commands/code/jobs/index.d.ts +19 -0
  35. package/dist/commands/code/jobs/index.js +38 -0
  36. package/dist/commands/code/jobs/list.d.ts +12 -0
  37. package/dist/commands/code/jobs/list.js +87 -0
  38. package/dist/commands/code/jobs/run.d.ts +32 -0
  39. package/dist/commands/code/jobs/run.js +151 -0
  40. package/dist/commands/code/jobs/show.d.ts +12 -0
  41. package/dist/commands/code/jobs/show.js +86 -0
  42. package/dist/commands/commitments/preflight.js +18 -4
  43. package/dist/commands/commitments/receipt-metrics.d.ts +39 -0
  44. package/dist/commands/commitments/receipt-metrics.js +78 -0
  45. package/dist/commands/convos/search.js +5 -5
  46. package/dist/commands/harnesses/leases/list.d.ts +3 -0
  47. package/dist/commands/harnesses/leases/list.js +59 -12
  48. package/dist/commands/harnesses/leases/show.js +36 -0
  49. package/dist/commands/harnesses/list.d.ts +18 -0
  50. package/dist/commands/harnesses/list.js +30 -0
  51. package/dist/commands/harnesses/products.js +48 -3
  52. package/dist/commands/harnesses/quota.d.ts +16 -0
  53. package/dist/commands/harnesses/quota.js +26 -1
  54. package/dist/commands/harnesses/usage.js +17 -0
  55. package/dist/commands/inbox/index.d.ts +2 -1
  56. package/dist/commands/inbox/index.js +27 -4
  57. package/dist/commands/login.js +4 -1
  58. package/dist/commands/machines/list.d.ts +1 -0
  59. package/dist/commands/machines/list.js +33 -5
  60. package/dist/commands/memory/approvals/issue.d.ts +18 -0
  61. package/dist/commands/memory/approvals/issue.js +63 -0
  62. package/dist/commands/memory/commit.js +5 -2
  63. package/dist/commands/memory/context.d.ts +3 -2
  64. package/dist/commands/memory/context.js +9 -11
  65. package/dist/commands/memory/delete.d.ts +1 -1
  66. package/dist/commands/memory/list.d.ts +1 -1
  67. package/dist/commands/memory/list.js +1 -1
  68. package/dist/commands/memory/mounts/resolve.d.ts +10 -0
  69. package/dist/commands/memory/mounts/resolve.js +27 -0
  70. package/dist/commands/memory/proposals/commit.d.ts +18 -0
  71. package/dist/commands/memory/proposals/commit.js +32 -0
  72. package/dist/commands/memory/proposals/create.d.ts +18 -0
  73. package/dist/commands/memory/proposals/create.js +56 -0
  74. package/dist/commands/memory/proposals/list.d.ts +13 -0
  75. package/dist/commands/memory/proposals/list.js +31 -0
  76. package/dist/commands/memory/proposals/promote.d.ts +22 -0
  77. package/dist/commands/memory/proposals/promote.js +33 -0
  78. package/dist/commands/memory/proposals/reject.d.ts +16 -0
  79. package/dist/commands/memory/proposals/reject.js +28 -0
  80. package/dist/commands/memory/rebuild-index.d.ts +20 -0
  81. package/dist/commands/memory/rebuild-index.js +25 -0
  82. package/dist/commands/memory/save.d.ts +1 -1
  83. package/dist/commands/memory/save.js +1 -1
  84. package/dist/commands/memory/search.d.ts +6 -3
  85. package/dist/commands/memory/search.js +27 -3
  86. package/dist/commands/memory/show.d.ts +1 -1
  87. package/dist/commands/memory/stores/archive.d.ts +14 -0
  88. package/dist/commands/memory/stores/archive.js +31 -0
  89. package/dist/commands/memory/stores/create.d.ts +12 -0
  90. package/dist/commands/memory/stores/create.js +30 -0
  91. package/dist/commands/memory/stores/delete.d.ts +15 -0
  92. package/dist/commands/memory/stores/delete.js +38 -0
  93. package/dist/commands/memory/stores/list.d.ts +10 -0
  94. package/dist/commands/memory/stores/list.js +29 -0
  95. package/dist/commands/memory/stores/show.d.ts +12 -0
  96. package/dist/commands/memory/stores/show.js +14 -0
  97. package/dist/commands/memory/stores/update.d.ts +15 -0
  98. package/dist/commands/memory/stores/update.js +39 -0
  99. package/dist/commands/memory/sync/delete.d.ts +13 -0
  100. package/dist/commands/memory/sync/delete.js +35 -0
  101. package/dist/commands/memory/sync/pull.d.ts +19 -0
  102. package/dist/commands/memory/sync/pull.js +52 -0
  103. package/dist/commands/memory/sync/push.d.ts +18 -0
  104. package/dist/commands/memory/sync/push.js +115 -0
  105. package/dist/commands/memory/sync/resolve.d.ts +23 -0
  106. package/dist/commands/memory/sync/resolve.js +27 -0
  107. package/dist/commands/memory/sync/status.d.ts +9 -0
  108. package/dist/commands/memory/sync/status.js +22 -0
  109. package/dist/commands/memory/topics/archive.d.ts +20 -0
  110. package/dist/commands/memory/topics/archive.js +29 -0
  111. package/dist/commands/memory/topics/create.d.ts +23 -0
  112. package/dist/commands/memory/topics/create.js +46 -0
  113. package/dist/commands/memory/topics/delete.d.ts +22 -0
  114. package/dist/commands/memory/topics/delete.js +30 -0
  115. package/dist/commands/memory/topics/forget.d.ts +22 -0
  116. package/dist/commands/memory/topics/forget.js +29 -0
  117. package/dist/commands/memory/topics/list.d.ts +13 -0
  118. package/dist/commands/memory/topics/list.js +22 -0
  119. package/dist/commands/memory/topics/move.d.ts +22 -0
  120. package/dist/commands/memory/topics/move.js +26 -0
  121. package/dist/commands/memory/topics/show.d.ts +17 -0
  122. package/dist/commands/memory/topics/show.js +21 -0
  123. package/dist/commands/memory/topics/update.d.ts +23 -0
  124. package/dist/commands/memory/topics/update.js +27 -0
  125. package/dist/commands/memory/tree.d.ts +5 -2
  126. package/dist/commands/memory/tree.js +20 -2
  127. package/dist/commands/memory/update.d.ts +1 -1
  128. package/dist/commands/memory/versions/list.d.ts +16 -0
  129. package/dist/commands/memory/versions/list.js +22 -0
  130. package/dist/commands/memory/versions/redact.d.ts +21 -0
  131. package/dist/commands/memory/versions/redact.js +22 -0
  132. package/dist/commands/memory/versions/restore.d.ts +20 -0
  133. package/dist/commands/memory/versions/restore.js +16 -0
  134. package/dist/commands/memory/versions/show.d.ts +15 -0
  135. package/dist/commands/memory/versions/show.js +17 -0
  136. package/dist/commands/messages/list.js +25 -8
  137. package/dist/commands/messages/show.js +10 -0
  138. package/dist/commands/store/install.js +5 -1
  139. package/dist/commands/store/releases.js +1 -1
  140. package/dist/commands/store/update.js +5 -1
  141. package/dist/commands/subscriptions/cancel.js +5 -1
  142. package/dist/commands/subscriptions/health.js +5 -1
  143. package/dist/commands/subscriptions/status.js +5 -1
  144. package/dist/commands/subscriptions/subscribe.js +5 -1
  145. package/dist/commands/tasks/activity.d.ts +2 -3
  146. package/dist/commands/tasks/activity.js +15 -5
  147. package/dist/commands/tasks/complete.d.ts +18 -150
  148. package/dist/commands/tasks/complete.js +161 -600
  149. package/dist/commands/tasks/create.d.ts +5 -0
  150. package/dist/commands/tasks/create.js +107 -4
  151. package/dist/commands/tasks/deliverable/add.d.ts +8 -0
  152. package/dist/commands/tasks/deliverable/add.js +41 -8
  153. package/dist/commands/tasks/deliverable/confirm.d.ts +5 -5
  154. package/dist/commands/tasks/deliverable/confirm.js +9 -18
  155. package/dist/commands/tasks/deliverable/list.d.ts +12 -0
  156. package/dist/commands/tasks/deliverable/list.js +37 -0
  157. package/dist/commands/tasks/events/append.d.ts +2 -0
  158. package/dist/commands/tasks/events/append.js +11 -4
  159. package/dist/commands/tasks/events/list.d.ts +1 -0
  160. package/dist/commands/tasks/events/list.js +1 -0
  161. package/dist/commands/tasks/events/tail.d.ts +1 -0
  162. package/dist/commands/tasks/events/tail.js +1 -0
  163. package/dist/commands/tasks/expectations/assess.d.ts +21 -0
  164. package/dist/commands/tasks/expectations/assess.js +77 -0
  165. package/dist/commands/tasks/expectations.js +14 -18
  166. package/dist/commands/tasks/judge.d.ts +1 -0
  167. package/dist/commands/tasks/judge.js +2 -1
  168. package/dist/commands/tasks/output.d.ts +2 -11
  169. package/dist/commands/tasks/output.js +64 -145
  170. package/dist/commands/tasks/report.d.ts +3 -3
  171. package/dist/commands/tasks/report.js +64 -41
  172. package/dist/commands/tasks/resource/add.d.ts +23 -0
  173. package/dist/commands/tasks/resource/add.js +76 -0
  174. package/dist/commands/tasks/resource/list.d.ts +13 -0
  175. package/dist/commands/tasks/resource/list.js +41 -0
  176. package/dist/commands/tasks/result/show.d.ts +13 -0
  177. package/dist/commands/tasks/result/show.js +46 -0
  178. package/dist/commands/tasks/result/submit.d.ts +26 -0
  179. package/dist/commands/tasks/result/submit.js +134 -0
  180. package/dist/commands/tasks/resume/save.d.ts +16 -0
  181. package/dist/commands/tasks/resume/save.js +59 -0
  182. package/dist/commands/tasks/resume/show.d.ts +13 -0
  183. package/dist/commands/tasks/resume/show.js +35 -0
  184. package/dist/commands/tasks/review.d.ts +17 -0
  185. package/dist/commands/tasks/review.js +54 -0
  186. package/dist/commands/tasks/runs.js +5 -0
  187. package/dist/commands/tasks/timeline.d.ts +2 -2
  188. package/dist/commands/tasks/timeline.js +10 -23
  189. package/dist/commands/tasks/updates/add.d.ts +22 -0
  190. package/dist/commands/tasks/updates/add.js +101 -0
  191. package/dist/commands/tasks/updates/list.d.ts +15 -0
  192. package/dist/commands/tasks/updates/list.js +57 -0
  193. package/dist/commands/tasks/waive.d.ts +1 -0
  194. package/dist/commands/tasks/waive.js +2 -1
  195. package/dist/lib/agentic-stream.d.ts +257 -0
  196. package/dist/lib/agentic-stream.js +490 -33
  197. package/dist/lib/balance.d.ts +8 -0
  198. package/dist/lib/commitment-product.d.ts +10 -1
  199. package/dist/lib/commitment-product.js +66 -2
  200. package/dist/lib/commitments.d.ts +2 -1
  201. package/dist/lib/commitments.js +1 -0
  202. package/dist/lib/conversation-search.d.ts +3 -0
  203. package/dist/lib/conversation-search.js +75 -0
  204. package/dist/lib/execution-target.d.ts +21 -0
  205. package/dist/lib/execution-target.js +22 -6
  206. package/dist/lib/harnesses.d.ts +82 -6
  207. package/dist/lib/harnesses.js +30 -2
  208. package/dist/lib/hosted-machines.js +9 -0
  209. package/dist/lib/inbox.d.ts +2 -1
  210. package/dist/lib/machines.d.ts +17 -0
  211. package/dist/lib/machines.js +29 -0
  212. package/dist/lib/managed-agent-keys.d.ts +104 -0
  213. package/dist/lib/managed-agent-keys.js +50 -0
  214. package/dist/lib/memory-scope.d.ts +4 -3
  215. package/dist/lib/memory-scope.js +9 -9
  216. package/dist/lib/memory-sync.d.ts +114 -0
  217. package/dist/lib/memory-sync.js +730 -0
  218. package/dist/lib/message-provenance.d.ts +42 -0
  219. package/dist/lib/message-provenance.js +89 -0
  220. package/dist/lib/scoped-memory-command.d.ts +68 -0
  221. package/dist/lib/scoped-memory-command.js +183 -0
  222. package/dist/lib/session-task-endpoints.d.ts +1 -1
  223. package/dist/lib/session-task-endpoints.js +7 -0
  224. package/dist/lib/sky-code-broker.d.ts +47 -0
  225. package/dist/lib/sky-code-broker.js +50 -0
  226. package/dist/lib/sky-code-doctor.js +10 -1
  227. package/dist/lib/task-artifact-flags.d.ts +2 -0
  228. package/dist/lib/task-artifact-flags.js +7 -0
  229. package/dist/lib/task-execution.d.ts +4 -5
  230. package/dist/lib/task-execution.js +4 -5
  231. package/dist/lib/task-extras.d.ts +1 -5
  232. package/dist/lib/task-extras.js +1 -5
  233. package/dist/lib/task-transcript.d.ts +5 -7
  234. package/dist/lib/task-transcript.js +8 -16
  235. package/dist/lib/tasks.d.ts +7 -21
  236. package/dist/lib/tasks.js +17 -20
  237. package/dist/lib/triggers.d.ts +39 -1
  238. package/dist/lib/triggers.js +70 -2
  239. package/dist/lib/usage-discovery.d.ts +17 -1
  240. package/dist/lib/usage-discovery.js +17 -1
  241. package/dist/node_modules/@skrr-ai/data-provider/index.js +3733 -3618
  242. package/oclif.manifest.json +16201 -10377
  243. package/package.json +26 -5
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const data_provider_1 = require("@skrr-ai/data-provider");
5
+ const base_command_1 = require("../../../base-command");
6
+ const outbox_1 = require("../../../lib/outbox");
7
+ const tasks_1 = require("../../../lib/tasks");
8
+ const RESOURCE_ROLES = ['input', 'reference', 'evidence', 'attachment', 'deliverable'];
9
+ class TasksResourceAdd extends base_command_1.BaseCommand {
10
+ static description = 'Link an exact input, reference, evidence item, attachment, or deliverable to a task';
11
+ static examples = [
12
+ '<%= config.bin %> tasks resource add <task-id> input file/pdf:brief@Drive/Briefs',
13
+ '<%= config.bin %> tasks resource add <task-id> evidence code:a1b2c3d@origin/main --provider github',
14
+ ];
15
+ static args = {
16
+ task: core_1.Args.string({ description: 'Task id or ref', required: true, ignoreStdin: true }),
17
+ role: core_1.Args.string({
18
+ description: 'How the resource relates to this task',
19
+ required: true,
20
+ options: [...RESOURCE_ROLES],
21
+ ignoreStdin: true,
22
+ }),
23
+ coordinate: core_1.Args.string({
24
+ description: '<kind>[/<format>]:<identity>[@<location>]',
25
+ required: true,
26
+ ignoreStdin: true,
27
+ }),
28
+ };
29
+ static flags = {
30
+ status: core_1.Flags.string({
31
+ options: ['unknown', 'local', 'in_review', 'available', 'unavailable', 'superseded'],
32
+ description: 'Observed availability. Evidence strength is recorded separately.',
33
+ }),
34
+ title: core_1.Flags.string({ description: 'Human-readable Resource name' }),
35
+ provider: core_1.Flags.string({ description: 'Provider, such as github or drive' }),
36
+ version: core_1.Flags.string({ description: 'Exact provider version, such as a full commit SHA' }),
37
+ 'content-digest': core_1.Flags.string({ description: 'Integrity digest for this exact version' }),
38
+ expectation: core_1.Flags.string({ multiple: true, description: 'Expectation id this supports' }),
39
+ 'result-id': core_1.Flags.string({ description: 'Result version this Resource supports' }),
40
+ 'run-id': core_1.Flags.string({ description: 'Run that produced or observed it' }),
41
+ 'idempotency-key': core_1.Flags.string({ description: 'Stable retry key' }),
42
+ json: core_1.Flags.boolean({ description: 'Output as JSON' }),
43
+ };
44
+ async run() {
45
+ this.requireAuth();
46
+ const { args, flags } = await this.parse(TasksResourceAdd);
47
+ const parsed = (0, tasks_1.parseDeliverableCoordinate)(args.coordinate);
48
+ if (!parsed.ok)
49
+ this.error(parsed.error, { exit: 1 });
50
+ const payload = {
51
+ ...parsed.value,
52
+ role: args.role,
53
+ status: flags.status,
54
+ title: flags.title,
55
+ provider: flags.provider,
56
+ version: flags.version,
57
+ contentDigest: flags['content-digest'],
58
+ expectationIds: flags.expectation,
59
+ resultId: flags['result-id'],
60
+ runId: flags['run-id'],
61
+ idempotencyKey: flags['idempotency-key'] ||
62
+ (0, outbox_1.idempotencyKeyFor)('task-resource', args.task, JSON.stringify({ role: args.role, coordinate: parsed.value, status: flags.status })),
63
+ };
64
+ let result;
65
+ try {
66
+ result = await data_provider_1.dataService.recordTaskResource(args.task, payload);
67
+ }
68
+ catch (error) {
69
+ this.handleApiError(error);
70
+ }
71
+ if (flags.json)
72
+ return this.log(JSON.stringify(result, null, 2));
73
+ this.log(`Linked ${args.role} Resource ${result.link.id}: ${parsed.value.kind}:${parsed.value.identity}`);
74
+ }
75
+ }
76
+ exports.default = TasksResourceAdd;
@@ -0,0 +1,13 @@
1
+ import { BaseCommand } from '../../../base-command';
2
+ export default class TasksResourceList extends BaseCommand {
3
+ static description: string;
4
+ static args: {
5
+ task: import("@oclif/core/lib/interfaces").Arg<string | undefined, Record<string, unknown>>;
6
+ };
7
+ static flags: {
8
+ task: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ role: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const data_provider_1 = require("@skrr-ai/data-provider");
5
+ const base_command_1 = require("../../../base-command");
6
+ const task_resolver_1 = require("../../../lib/task-resolver");
7
+ const RESOURCE_ROLES = ['input', 'reference', 'evidence', 'attachment', 'deliverable'];
8
+ class TasksResourceList extends base_command_1.BaseCommand {
9
+ static description = 'List the exact Resources linked to a task, including their role and evidence state';
10
+ static args = {
11
+ task: core_1.Args.string({ required: false, ignoreStdin: true, description: 'Task id or ref' }),
12
+ };
13
+ static flags = {
14
+ task: core_1.Flags.string({ description: 'Task id; overrides runtime context' }),
15
+ role: core_1.Flags.string({ options: [...RESOURCE_ROLES], description: 'Only show one Task role' }),
16
+ json: core_1.Flags.boolean({ description: 'Output JSON' }),
17
+ };
18
+ async run() {
19
+ this.requireAuth();
20
+ const { args, flags } = await this.parse(TasksResourceList);
21
+ const task = (0, task_resolver_1.resolveTaskIdentity)({ positionalId: args.task, flagTask: flags.task });
22
+ let result;
23
+ try {
24
+ result = await data_provider_1.dataService.listTaskResources(task.id, {
25
+ role: flags.role,
26
+ });
27
+ }
28
+ catch (error) {
29
+ this.handleApiError(error);
30
+ }
31
+ if (flags.json)
32
+ return this.log(JSON.stringify(result, null, 2));
33
+ if (!result.data.length)
34
+ return this.log('No Resources linked.');
35
+ for (const item of result.data) {
36
+ this.log(`${item.linkId} · ${item.role} · ${item.title || item.identity || item.kind}\n` +
37
+ ` ${item.location || 'no locator'} · ${item.versionFidelity} · ${item.status} · ${item.evidenceLevel}`);
38
+ }
39
+ }
40
+ }
41
+ exports.default = TasksResourceList;
@@ -0,0 +1,13 @@
1
+ import { BaseCommand } from '../../../base-command';
2
+ export default class TasksResultShow extends BaseCommand {
3
+ static description: string;
4
+ static args: {
5
+ task: import("@oclif/core/lib/interfaces").Arg<string | undefined, Record<string, unknown>>;
6
+ };
7
+ static flags: {
8
+ task: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ history: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
10
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const data_provider_1 = require("@skrr-ai/data-provider");
5
+ const base_command_1 = require("../../../base-command");
6
+ const task_resolver_1 = require("../../../lib/task-resolver");
7
+ class TasksResultShow extends base_command_1.BaseCommand {
8
+ static description = 'Show the current Task Result and its exact Review';
9
+ static args = {
10
+ task: core_1.Args.string({ required: false, ignoreStdin: true, description: 'Task id or ref' }),
11
+ };
12
+ static flags = {
13
+ task: core_1.Flags.string({ description: 'Task id; overrides runtime context' }),
14
+ history: core_1.Flags.boolean({ description: 'Include superseded Result versions' }),
15
+ json: core_1.Flags.boolean({ description: 'Output JSON' }),
16
+ };
17
+ async run() {
18
+ this.requireAuth();
19
+ const { args, flags } = await this.parse(TasksResultShow);
20
+ const task = (0, task_resolver_1.resolveTaskIdentity)({ positionalId: args.task, flagTask: flags.task });
21
+ let result;
22
+ try {
23
+ result = await data_provider_1.dataService.listTaskResults(task.id, { includeSuperseded: flags.history });
24
+ }
25
+ catch (error) {
26
+ this.handleApiError(error);
27
+ }
28
+ if (flags.json)
29
+ return this.log(JSON.stringify(result, null, 2));
30
+ const current = result.results.find((row) => row.id === result.currentResultId);
31
+ if (!current)
32
+ return this.log('No Result submitted.');
33
+ const review = result.reviews.find((row) => row.resultId === current.id);
34
+ this.log(`Result v${current.version}\n${current.summary}`);
35
+ if (current.conclusion)
36
+ this.log(`Conclusion (${current.conclusion.type}): ${JSON.stringify(current.conclusion.value)}`);
37
+ this.log(`Review: ${review ? review.decision : 'awaiting review'}`);
38
+ if (flags.history && result.results.length > 1) {
39
+ this.log(`Superseded versions: ${result.results
40
+ .slice(1)
41
+ .map((row) => `v${row.version}`)
42
+ .join(', ')}`);
43
+ }
44
+ }
45
+ }
46
+ exports.default = TasksResultShow;
@@ -0,0 +1,26 @@
1
+ import { BaseCommand } from '../../../base-command';
2
+ export default class TasksResultSubmit extends BaseCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ task: import("@oclif/core/lib/interfaces").Arg<string | undefined, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ task: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ summary: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
11
+ body: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ 'conclusion-type': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ 'conclusion-json': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
14
+ 'structured-schema': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
15
+ 'structured-json': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
16
+ deliverable: import("@oclif/core/lib/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
17
+ evidence: import("@oclif/core/lib/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
18
+ remaining: import("@oclif/core/lib/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
19
+ 'run-id': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
20
+ 'source-run': import("@oclif/core/lib/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
21
+ 'spec-version': import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
22
+ 'idempotency-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
23
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
24
+ };
25
+ run(): Promise<void>;
26
+ }
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const data_provider_1 = require("@skrr-ai/data-provider");
5
+ const base_command_1 = require("../../../base-command");
6
+ const outbox_1 = require("../../../lib/outbox");
7
+ const task_resolver_1 = require("../../../lib/task-resolver");
8
+ const web_url_1 = require("../../../lib/web-url");
9
+ const api_fetch_1 = require("../../../lib/api-fetch");
10
+ const session_task_endpoints_1 = require("../../../lib/session-task-endpoints");
11
+ function parseJson(value, label) {
12
+ if (!value)
13
+ return undefined;
14
+ try {
15
+ return JSON.parse(value);
16
+ }
17
+ catch {
18
+ throw new Error(`${label} must be valid JSON`);
19
+ }
20
+ }
21
+ class TasksResultSubmit extends base_command_1.BaseCommand {
22
+ static description = 'Submit the Task Result; this does not self-accept it or turn a domain conclusion into a Review';
23
+ static examples = [
24
+ '<%= config.bin %> tasks result submit <task> --summary "NO-SHIP until Gates A-D pass" --conclusion-type release_recommendation --conclusion-json \'{"posture":"no_ship"}\'',
25
+ ];
26
+ static args = {
27
+ task: core_1.Args.string({ required: false, ignoreStdin: true, description: 'Task id or ref' }),
28
+ };
29
+ static flags = {
30
+ task: core_1.Flags.string({ description: 'Task id; overrides runtime context' }),
31
+ summary: core_1.Flags.string({ required: true, description: 'The answer in one readable paragraph' }),
32
+ body: core_1.Flags.string({ description: 'Long-form Result body' }),
33
+ 'conclusion-type': core_1.Flags.string({ description: 'Domain conclusion type' }),
34
+ 'conclusion-json': core_1.Flags.string({ description: 'JSON value for the domain conclusion' }),
35
+ 'structured-schema': core_1.Flags.string({ description: 'Schema name for --structured-json' }),
36
+ 'structured-json': core_1.Flags.string({ description: 'Task-type-specific structured Result JSON' }),
37
+ deliverable: core_1.Flags.string({
38
+ multiple: true,
39
+ description: 'Task Resource link id (repeatable)',
40
+ }),
41
+ evidence: core_1.Flags.string({
42
+ multiple: true,
43
+ description: 'Evidence reference as <kind>:<id-or-uri>',
44
+ }),
45
+ remaining: core_1.Flags.string({ multiple: true, description: 'Remaining work item (repeatable)' }),
46
+ 'run-id': core_1.Flags.string({ description: 'Canonical Task Run that produced this Result' }),
47
+ 'source-run': core_1.Flags.string({ multiple: true, description: 'Contributing Run id (repeatable)' }),
48
+ 'spec-version': core_1.Flags.integer({
49
+ description: 'Task specification version this Result answers',
50
+ }),
51
+ 'idempotency-key': core_1.Flags.string({ description: 'Stable retry key for this exact Result' }),
52
+ json: core_1.Flags.boolean({ description: 'Output JSON' }),
53
+ };
54
+ async run() {
55
+ this.requireAuth();
56
+ const { args, flags } = await this.parse(TasksResultSubmit);
57
+ const task = (0, task_resolver_1.resolveTaskIdentity)({ positionalId: args.task, flagTask: flags.task });
58
+ if (Boolean(flags['conclusion-type']) !== Boolean(flags['conclusion-json'])) {
59
+ this.error('--conclusion-type and --conclusion-json must be supplied together', { exit: 1 });
60
+ }
61
+ if (Boolean(flags['structured-schema']) !== Boolean(flags['structured-json'])) {
62
+ this.error('--structured-schema and --structured-json must be supplied together', {
63
+ exit: 1,
64
+ });
65
+ }
66
+ let conclusionValue;
67
+ let structuredValue;
68
+ try {
69
+ conclusionValue = parseJson(flags['conclusion-json'], '--conclusion-json');
70
+ structuredValue = parseJson(flags['structured-json'], '--structured-json');
71
+ }
72
+ catch (error) {
73
+ this.error(error.message, { exit: 1 });
74
+ }
75
+ if (structuredValue &&
76
+ (typeof structuredValue !== 'object' || Array.isArray(structuredValue))) {
77
+ this.error('--structured-json must contain a JSON object', { exit: 1 });
78
+ }
79
+ const evidenceRefs = (flags.evidence || []).map((raw) => {
80
+ const split = raw.indexOf(':');
81
+ if (split < 1)
82
+ this.error('--evidence must be <kind>:<id-or-uri>', { exit: 1 });
83
+ const kind = raw.slice(0, split);
84
+ const value = raw.slice(split + 1);
85
+ return /^https?:|^file:/.test(value) ? { kind, uri: value } : { kind, id: value };
86
+ });
87
+ const payload = {
88
+ summary: flags.summary,
89
+ body: flags.body,
90
+ expectedSpecVersion: flags['spec-version'],
91
+ runId: flags['run-id'],
92
+ sourceRunIds: flags['source-run'],
93
+ resourceLinkIds: flags.deliverable,
94
+ evidenceRefs,
95
+ remainingWork: (flags.remaining || []).map((summary) => ({ summary })),
96
+ ...(flags['conclusion-type']
97
+ ? { conclusion: { type: flags['conclusion-type'], value: conclusionValue } }
98
+ : {}),
99
+ ...(flags['structured-schema']
100
+ ? {
101
+ structuredContent: {
102
+ schema: flags['structured-schema'],
103
+ value: structuredValue,
104
+ },
105
+ }
106
+ : {}),
107
+ };
108
+ let result;
109
+ try {
110
+ const data = {
111
+ ...payload,
112
+ idempotencyKey: flags['idempotency-key'] ||
113
+ (0, outbox_1.idempotencyKeyFor)('task-result', task.id, JSON.stringify(payload)),
114
+ };
115
+ const sessionPath = await (0, session_task_endpoints_1.sessionScopedTaskPath)('result');
116
+ result = sessionPath
117
+ ? await (0, api_fetch_1.apiFetch)(sessionPath, {
118
+ method: 'POST',
119
+ body: data,
120
+ })
121
+ : await data_provider_1.dataService.submitTaskResult({ taskId: task.id, data });
122
+ }
123
+ catch (error) {
124
+ this.handleApiError(error);
125
+ }
126
+ const url = (0, web_url_1.taskUrlFrom)(this.cliConfig.baseURL, { id: task.id });
127
+ if (flags.json)
128
+ return this.log(JSON.stringify({ ...result, url }, null, 2));
129
+ this.log(`Submitted Result v${result.result.version} for ${task.id}; it is ready for review.`);
130
+ if (url)
131
+ this.log(`Task: ${url}`);
132
+ }
133
+ }
134
+ exports.default = TasksResultSubmit;
@@ -0,0 +1,16 @@
1
+ import { BaseCommand } from '../../../base-command';
2
+ export default class TasksResumeSave extends BaseCommand {
3
+ static description: string;
4
+ static args: {
5
+ task: import("@oclif/core/lib/interfaces").Arg<string | undefined, Record<string, unknown>>;
6
+ };
7
+ static flags: {
8
+ task: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ 'run-id': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ snapshot: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
11
+ 'spec-version': import("@oclif/core/lib/interfaces").OptionFlag<number | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ 'idempotency-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
14
+ };
15
+ run(): Promise<void>;
16
+ }
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const data_provider_1 = require("@skrr-ai/data-provider");
5
+ const base_command_1 = require("../../../base-command");
6
+ const outbox_1 = require("../../../lib/outbox");
7
+ const task_resolver_1 = require("../../../lib/task-resolver");
8
+ const api_fetch_1 = require("../../../lib/api-fetch");
9
+ const session_task_endpoints_1 = require("../../../lib/session-task-endpoints");
10
+ class TasksResumeSave extends base_command_1.BaseCommand {
11
+ static description = 'Save recovery state without publishing a visible Task Update';
12
+ static args = {
13
+ task: core_1.Args.string({ required: false, ignoreStdin: true, description: 'Task id or ref' }),
14
+ };
15
+ static flags = {
16
+ task: core_1.Flags.string({ description: 'Task id; overrides runtime context' }),
17
+ 'run-id': core_1.Flags.string({ required: true, description: 'Canonical Task Run' }),
18
+ snapshot: core_1.Flags.string({ required: true, description: 'Resume Point JSON snapshot' }),
19
+ 'spec-version': core_1.Flags.integer({ description: 'Task specification version' }),
20
+ 'idempotency-key': core_1.Flags.string({ description: 'Stable retry key' }),
21
+ json: core_1.Flags.boolean({ description: 'Output JSON' }),
22
+ };
23
+ async run() {
24
+ this.requireAuth();
25
+ const { args, flags } = await this.parse(TasksResumeSave);
26
+ const task = (0, task_resolver_1.resolveTaskIdentity)({ positionalId: args.task, flagTask: flags.task });
27
+ let resume;
28
+ try {
29
+ resume = JSON.parse(flags.snapshot);
30
+ }
31
+ catch {
32
+ this.error('--snapshot must be a JSON object', { exit: 1 });
33
+ }
34
+ let result;
35
+ try {
36
+ const payload = {
37
+ runId: flags['run-id'],
38
+ expectedSpecVersion: flags['spec-version'],
39
+ resume: resume,
40
+ idempotencyKey: flags['idempotency-key'] ||
41
+ (0, outbox_1.idempotencyKeyFor)('task-resume', task.id, JSON.stringify(resume)),
42
+ };
43
+ const sessionPath = await (0, session_task_endpoints_1.sessionScopedTaskPath)('resume');
44
+ result = sessionPath
45
+ ? await (0, api_fetch_1.apiFetch)(sessionPath, {
46
+ method: 'POST',
47
+ body: payload,
48
+ })
49
+ : await data_provider_1.dataService.saveTaskResumePoint({ taskId: task.id, data: payload });
50
+ }
51
+ catch (error) {
52
+ this.handleApiError(error);
53
+ }
54
+ if (flags.json)
55
+ return this.log(JSON.stringify(result, null, 2));
56
+ this.log(`Saved Resume Point ${result.resumePoint.id} for Run ${flags['run-id']}.`);
57
+ }
58
+ }
59
+ exports.default = TasksResumeSave;
@@ -0,0 +1,13 @@
1
+ import { BaseCommand } from '../../../base-command';
2
+ export default class TasksResumeShow extends BaseCommand {
3
+ static description: string;
4
+ static args: {
5
+ task: import("@oclif/core/lib/interfaces").Arg<string | undefined, Record<string, unknown>>;
6
+ };
7
+ static flags: {
8
+ task: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ 'run-id': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const data_provider_1 = require("@skrr-ai/data-provider");
5
+ const base_command_1 = require("../../../base-command");
6
+ const task_resolver_1 = require("../../../lib/task-resolver");
7
+ const api_fetch_1 = require("../../../lib/api-fetch");
8
+ const session_task_endpoints_1 = require("../../../lib/session-task-endpoints");
9
+ class TasksResumeShow extends base_command_1.BaseCommand {
10
+ static description = 'Build the bounded context needed to resume one Task Run';
11
+ static args = {
12
+ task: core_1.Args.string({ required: false, ignoreStdin: true, description: 'Task id or ref' }),
13
+ };
14
+ static flags = {
15
+ task: core_1.Flags.string({ description: 'Task id; overrides runtime context' }),
16
+ 'run-id': core_1.Flags.string({ required: true, description: 'Canonical Task Run' }),
17
+ json: core_1.Flags.boolean({ default: true, description: 'Output the Resume Context as JSON' }),
18
+ };
19
+ async run() {
20
+ this.requireAuth();
21
+ const { args, flags } = await this.parse(TasksResumeShow);
22
+ const task = (0, task_resolver_1.resolveTaskIdentity)({ positionalId: args.task, flagTask: flags.task });
23
+ try {
24
+ const sessionPath = await (0, session_task_endpoints_1.sessionScopedTaskPath)('resumeRead');
25
+ const result = sessionPath
26
+ ? await (0, api_fetch_1.apiFetch)(sessionPath, { method: 'GET' })
27
+ : await data_provider_1.dataService.getTaskResumeContext(task.id, flags['run-id']);
28
+ this.log(JSON.stringify(result, null, 2));
29
+ }
30
+ catch (error) {
31
+ this.handleApiError(error);
32
+ }
33
+ }
34
+ }
35
+ exports.default = TasksResumeShow;
@@ -0,0 +1,17 @@
1
+ import { BaseCommand } from '../../base-command';
2
+ export default class TasksReview extends BaseCommand {
3
+ static description: string;
4
+ static args: {
5
+ task: import("@oclif/core/lib/interfaces").Arg<string | undefined, Record<string, unknown>>;
6
+ };
7
+ static flags: {
8
+ task: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
9
+ 'result-id': import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
10
+ decision: import("@oclif/core/lib/interfaces").OptionFlag<string, import("@oclif/core/lib/interfaces").CustomOptions>;
11
+ rationale: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
12
+ 'run-id': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
13
+ 'idempotency-key': import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
14
+ json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
15
+ };
16
+ run(): Promise<void>;
17
+ }
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@oclif/core");
4
+ const data_provider_1 = require("@skrr-ai/data-provider");
5
+ const base_command_1 = require("../../base-command");
6
+ const outbox_1 = require("../../lib/outbox");
7
+ const task_resolver_1 = require("../../lib/task-resolver");
8
+ const api_fetch_1 = require("../../lib/api-fetch");
9
+ const session_task_endpoints_1 = require("../../lib/session-task-endpoints");
10
+ class TasksReview extends base_command_1.BaseCommand {
11
+ static description = 'Accept or request changes on one exact Task Result';
12
+ static args = {
13
+ task: core_1.Args.string({ required: false, ignoreStdin: true, description: 'Task id or ref' }),
14
+ };
15
+ static flags = {
16
+ task: core_1.Flags.string({ description: 'Task id; overrides runtime context' }),
17
+ 'result-id': core_1.Flags.string({ required: true, description: 'Exact Result version id' }),
18
+ decision: core_1.Flags.string({ required: true, options: ['accepted', 'changes_requested'] }),
19
+ rationale: core_1.Flags.string({ description: 'Why this Result was accepted or needs changes' }),
20
+ 'run-id': core_1.Flags.string({ description: 'Canonical reviewer Run for a generic API call' }),
21
+ 'idempotency-key': core_1.Flags.string({ description: 'Stable retry key' }),
22
+ json: core_1.Flags.boolean({ description: 'Output JSON' }),
23
+ };
24
+ async run() {
25
+ this.requireAuth();
26
+ const { args, flags } = await this.parse(TasksReview);
27
+ const task = (0, task_resolver_1.resolveTaskIdentity)({ positionalId: args.task, flagTask: flags.task });
28
+ const payload = {
29
+ resultId: flags['result-id'],
30
+ runId: flags['run-id'],
31
+ decision: flags.decision,
32
+ rationale: flags.rationale,
33
+ };
34
+ let result;
35
+ try {
36
+ const data = {
37
+ ...payload,
38
+ idempotencyKey: flags['idempotency-key'] ||
39
+ (0, outbox_1.idempotencyKeyFor)('task-review', task.id, JSON.stringify(payload)),
40
+ };
41
+ const sessionPath = await (0, session_task_endpoints_1.sessionScopedTaskPath)('review');
42
+ result = sessionPath
43
+ ? await (0, api_fetch_1.apiFetch)(sessionPath, { method: 'POST', body: data })
44
+ : await data_provider_1.dataService.reviewTaskResult({ taskId: task.id, data });
45
+ }
46
+ catch (error) {
47
+ this.handleApiError(error);
48
+ }
49
+ if (flags.json)
50
+ return this.log(JSON.stringify(result, null, 2));
51
+ this.log(`Recorded Review: ${flags.decision} for Result ${flags['result-id']}.`);
52
+ }
53
+ }
54
+ exports.default = TasksReview;
@@ -23,6 +23,11 @@ function formatTime(value) {
23
23
  * daemon id was not recorded). `-` when the row predates executor stamping.
24
24
  */
25
25
  function formatRunExecutor(run) {
26
+ const executor = run.executor;
27
+ if (executor?.kind === 'agent' && typeof executor.agentId === 'string') {
28
+ const release = typeof executor.agentReleaseId === 'string' ? ` @ ${executor.agentReleaseId}` : '';
29
+ return `Agent ${executor.agentId}${release}`;
30
+ }
26
31
  const daemonId = run.daemonId;
27
32
  if (typeof daemonId === 'string' && daemonId.trim() !== '') {
28
33
  return `daemon ${daemonId}`;
@@ -15,8 +15,8 @@ export default class TasksTimeline extends BaseCommand {
15
15
  json: import("@oclif/core/lib/interfaces").BooleanFlag<boolean>;
16
16
  limit: import("@oclif/core/lib/interfaces").OptionFlag<number, import("@oclif/core/lib/interfaces").CustomOptions>;
17
17
  cursor: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
18
- kind: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
19
- run: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
18
+ type: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
19
+ execution: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
20
20
  actor: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces").CustomOptions>;
21
21
  };
22
22
  run(): Promise<void>;