@mmerterden/multi-agent-pipeline 20.29.0 → 20.30.0

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 (146) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +5 -5
  3. package/README.tr.md +5 -5
  4. package/docs/architecture.md +3 -3
  5. package/docs/ecosystem.md +5 -5
  6. package/docs/facts.json +7 -7
  7. package/install/catalog-history.json +1 -1
  8. package/install/claude.mjs +10 -1
  9. package/install/codex.mjs +2 -0
  10. package/install/copilot.mjs +13 -0
  11. package/manifest.json +149 -48
  12. package/package.json +2 -1
  13. package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +13 -15
  14. package/pipeline/commands/multi-agent/office-off/SKILL.md +27 -0
  15. package/pipeline/commands/multi-agent/office-on/SKILL.md +50 -0
  16. package/pipeline/commands/multi-agent/office-status/SKILL.md +29 -0
  17. package/pipeline/commands/multi-agent/serve/SKILL.md +4 -2
  18. package/pipeline/commands/multi-agent/stack/SKILL.md +15 -8
  19. package/pipeline/commands/multi-agent/steer/SKILL.md +10 -9
  20. package/pipeline/commands/multi-agent/sync/SKILL.md +3 -3
  21. package/pipeline/contract/CHANGELOG.md +62 -0
  22. package/pipeline/contract/README.md +52 -6
  23. package/pipeline/contract/fixtures/error-invalid-request.json +1 -1
  24. package/pipeline/contract/fixtures/error-unauthorized.json +1 -1
  25. package/pipeline/contract/fixtures/error-unsigned.json +1 -1
  26. package/pipeline/contract/manifest.json +367 -22
  27. package/pipeline/contract/types/index.d.ts +530 -3
  28. package/pipeline/multi-agent-refs/cross-cli-contract.md +5 -4
  29. package/pipeline/multi-agent-refs/features/office-threat-model.md +91 -0
  30. package/pipeline/multi-agent-refs/help/en.md +3 -0
  31. package/pipeline/multi-agent-refs/help/tr.md +3 -0
  32. package/pipeline/office/NOTICE.md +42 -0
  33. package/pipeline/office/assets/BIN.png +0 -0
  34. package/pipeline/office/assets/BOOKSHELF.png +0 -0
  35. package/pipeline/office/assets/CACTUS.png +0 -0
  36. package/pipeline/office/assets/CLOCK.png +0 -0
  37. package/pipeline/office/assets/COFFEE.png +0 -0
  38. package/pipeline/office/assets/COFFEE_TABLE.png +0 -0
  39. package/pipeline/office/assets/CUSHIONED_BENCH.png +0 -0
  40. package/pipeline/office/assets/CUSHIONED_CHAIR_BACK.png +0 -0
  41. package/pipeline/office/assets/CUSHIONED_CHAIR_FRONT.png +0 -0
  42. package/pipeline/office/assets/CUSHIONED_CHAIR_SIDE.png +0 -0
  43. package/pipeline/office/assets/DESK_FRONT.png +0 -0
  44. package/pipeline/office/assets/DESK_SIDE.png +0 -0
  45. package/pipeline/office/assets/DOUBLE_BOOKSHELF.png +0 -0
  46. package/pipeline/office/assets/HANGING_PLANT.png +0 -0
  47. package/pipeline/office/assets/LARGE_PAINTING.png +0 -0
  48. package/pipeline/office/assets/LARGE_PLANT.png +0 -0
  49. package/pipeline/office/assets/PC_BACK.png +0 -0
  50. package/pipeline/office/assets/PC_FRONT_OFF.png +0 -0
  51. package/pipeline/office/assets/PC_FRONT_ON_1.png +0 -0
  52. package/pipeline/office/assets/PC_FRONT_ON_2.png +0 -0
  53. package/pipeline/office/assets/PC_FRONT_ON_3.png +0 -0
  54. package/pipeline/office/assets/PC_SIDE.png +0 -0
  55. package/pipeline/office/assets/PLANT.png +0 -0
  56. package/pipeline/office/assets/PLANT_2.png +0 -0
  57. package/pipeline/office/assets/POT.png +0 -0
  58. package/pipeline/office/assets/SMALL_PAINTING.png +0 -0
  59. package/pipeline/office/assets/SMALL_PAINTING_2.png +0 -0
  60. package/pipeline/office/assets/SMALL_TABLE_FRONT.png +0 -0
  61. package/pipeline/office/assets/SMALL_TABLE_SIDE.png +0 -0
  62. package/pipeline/office/assets/SOFA_BACK.png +0 -0
  63. package/pipeline/office/assets/SOFA_FRONT.png +0 -0
  64. package/pipeline/office/assets/SOFA_SIDE.png +0 -0
  65. package/pipeline/office/assets/TABLE_FRONT.png +0 -0
  66. package/pipeline/office/assets/WHITEBOARD.png +0 -0
  67. package/pipeline/office/assets/WOODEN_BENCH.png +0 -0
  68. package/pipeline/office/assets/WOODEN_CHAIR_BACK.png +0 -0
  69. package/pipeline/office/assets/WOODEN_CHAIR_FRONT.png +0 -0
  70. package/pipeline/office/assets/WOODEN_CHAIR_SIDE.png +0 -0
  71. package/pipeline/office/assets/char_0.png +0 -0
  72. package/pipeline/office/assets/char_1.png +0 -0
  73. package/pipeline/office/assets/char_2.png +0 -0
  74. package/pipeline/office/assets/char_3.png +0 -0
  75. package/pipeline/office/assets/char_4.png +0 -0
  76. package/pipeline/office/assets/char_5.png +0 -0
  77. package/pipeline/office/assets/floor_0.png +0 -0
  78. package/pipeline/office/assets/floor_1.png +0 -0
  79. package/pipeline/office/assets/floor_2.png +0 -0
  80. package/pipeline/office/assets/floor_3.png +0 -0
  81. package/pipeline/office/assets/floor_4.png +0 -0
  82. package/pipeline/office/assets/floor_5.png +0 -0
  83. package/pipeline/office/assets/floor_6.png +0 -0
  84. package/pipeline/office/assets/floor_7.png +0 -0
  85. package/pipeline/office/assets/floor_8.png +0 -0
  86. package/pipeline/office/assets/wall_0.png +0 -0
  87. package/pipeline/office/index.html +5319 -0
  88. package/pipeline/schemas/activity-chat.schema.json +78 -0
  89. package/pipeline/schemas/activity-roles.json +48 -0
  90. package/pipeline/schemas/activity-roles.schema.json +49 -0
  91. package/pipeline/schemas/activity.schema.json +429 -0
  92. package/pipeline/schemas/autopilot-on-request.schema.json +33 -0
  93. package/pipeline/schemas/autopilot-on.schema.json +111 -0
  94. package/pipeline/schemas/contract-error.schema.json +33 -3
  95. package/pipeline/schemas/issue-maturity.schema.json +68 -0
  96. package/pipeline/schemas/ledger.schema.json +202 -0
  97. package/pipeline/schemas/permissions.schema.json +47 -0
  98. package/pipeline/schemas/prefs.schema.json +19 -0
  99. package/pipeline/schemas/prs.schema.json +73 -0
  100. package/pipeline/schemas/review-verdict-request.schema.json +20 -0
  101. package/pipeline/schemas/review-verdict.schema.json +62 -0
  102. package/pipeline/schemas/routine-delete.schema.json +59 -0
  103. package/pipeline/schemas/routines.schema.json +38 -0
  104. package/pipeline/schemas/run-evidence.schema.json +29 -0
  105. package/pipeline/schemas/run-results.schema.json +218 -0
  106. package/pipeline/schemas/service-read.schema.json +58 -0
  107. package/pipeline/schemas/stack-change.schema.json +82 -0
  108. package/pipeline/schemas/stack-request.schema.json +33 -0
  109. package/pipeline/schemas/stack.schema.json +59 -0
  110. package/pipeline/schemas/steer-request.schema.json +25 -0
  111. package/pipeline/schemas/steer.schema.json +59 -0
  112. package/pipeline/schemas/tool-call-request.schema.json +19 -0
  113. package/pipeline/schemas/tool-call.schema.json +47 -0
  114. package/pipeline/schemas/tools.schema.json +60 -0
  115. package/pipeline/scripts/_cost.mjs +66 -1
  116. package/pipeline/scripts/_office-smoke-lib.sh +115 -0
  117. package/pipeline/scripts/_spawn-async.mjs +73 -0
  118. package/pipeline/scripts/_transcript-tail.mjs +274 -0
  119. package/pipeline/scripts/activity-snapshot.mjs +1027 -0
  120. package/pipeline/scripts/autopilot-control.mjs +214 -9
  121. package/pipeline/scripts/contract-server.mjs +1178 -48
  122. package/pipeline/scripts/cost-analyze.mjs +2 -53
  123. package/pipeline/scripts/cost-table.json +1 -0
  124. package/pipeline/scripts/office-build.mjs +89 -0
  125. package/pipeline/scripts/office-control.mjs +383 -0
  126. package/pipeline/scripts/office-ledger.mjs +409 -0
  127. package/pipeline/scripts/routine-registry.mjs +42 -6
  128. package/pipeline/scripts/run-results.mjs +373 -0
  129. package/pipeline/scripts/service-read.mjs +244 -0
  130. package/pipeline/scripts/stack-toggle.mjs +285 -0
  131. package/pipeline/scripts/steer-run.mjs +97 -0
  132. package/pipeline/scripts/toolkit-tools.mjs +599 -0
  133. package/pipeline/scripts/uninstall.mjs +3 -0
  134. package/pipeline/scripts/work-items.mjs +304 -0
  135. package/pipeline/skills/.skill-manifest.json +19 -7
  136. package/pipeline/skills/.skills-index.json +34 -1
  137. package/pipeline/skills/shared/README.md +6 -3
  138. package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +13 -15
  139. package/pipeline/skills/shared/core/multi-agent-office-off/SKILL.md +16 -0
  140. package/pipeline/skills/shared/core/multi-agent-office-on/SKILL.md +22 -0
  141. package/pipeline/skills/shared/core/multi-agent-office-status/SKILL.md +17 -0
  142. package/pipeline/skills/shared/core/multi-agent-serve/SKILL.md +4 -2
  143. package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +14 -6
  144. package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +10 -9
  145. package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +3 -3
  146. package/pipeline/skills/skills-index.md +4 -1
@@ -0,0 +1,111 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/autopilot-on.schema.json",
4
+ "title": "Autopilot on",
5
+ "description": "What POST /v1/autopilot/on returns (`autopilot-control.mjs on-preview`, then `on`). Step one: preview {keep, drop, probe, configureOnly} with confirmToken and expiresAt. Step two: enabled and scheduled say whether the schedule was loaded; it is not when configureOnly was asked or a credential probe failed, and probe says which.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["contractVersion"],
9
+ "properties": {
10
+ "contractVersion": {
11
+ "type": "string",
12
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$",
13
+ "x-sensitivity": "none"
14
+ },
15
+ "preview": {
16
+ "type": "object",
17
+ "additionalProperties": false,
18
+ "required": ["keep", "drop", "probe", "configureOnly"],
19
+ "properties": {
20
+ "keep": {
21
+ "type": "array",
22
+ "items": {
23
+ "type": "string"
24
+ }
25
+ },
26
+ "drop": {
27
+ "type": "array",
28
+ "items": {
29
+ "type": "string"
30
+ }
31
+ },
32
+ "probe": {
33
+ "type": "object",
34
+ "additionalProperties": false,
35
+ "required": ["ready", "problems", "warnings"],
36
+ "properties": {
37
+ "ready": {
38
+ "type": "boolean"
39
+ },
40
+ "problems": {
41
+ "type": "array",
42
+ "items": {
43
+ "type": "string"
44
+ }
45
+ },
46
+ "warnings": {
47
+ "type": "array",
48
+ "items": {
49
+ "type": "string"
50
+ }
51
+ }
52
+ }
53
+ },
54
+ "configureOnly": {
55
+ "type": "boolean"
56
+ }
57
+ }
58
+ },
59
+ "confirmToken": {
60
+ "type": "string",
61
+ "pattern": "^[A-Za-z0-9_-]{16,128}$"
62
+ },
63
+ "expiresAt": {
64
+ "type": "string",
65
+ "format": "date-time"
66
+ },
67
+ "enabled": {
68
+ "type": "boolean"
69
+ },
70
+ "scheduled": {
71
+ "type": "boolean"
72
+ },
73
+ "awake": {
74
+ "type": ["boolean", "null"]
75
+ },
76
+ "repos": {
77
+ "type": "array",
78
+ "items": {
79
+ "type": "string"
80
+ }
81
+ },
82
+ "dropped": {
83
+ "type": "array",
84
+ "items": {
85
+ "type": "string"
86
+ }
87
+ },
88
+ "probe": {
89
+ "type": "object",
90
+ "additionalProperties": false,
91
+ "required": ["ready", "problems", "warnings"],
92
+ "properties": {
93
+ "ready": {
94
+ "type": "boolean"
95
+ },
96
+ "problems": {
97
+ "type": "array",
98
+ "items": {
99
+ "type": "string"
100
+ }
101
+ },
102
+ "warnings": {
103
+ "type": "array",
104
+ "items": {
105
+ "type": "string"
106
+ }
107
+ }
108
+ }
109
+ }
110
+ }
111
+ }
@@ -47,13 +47,43 @@
47
47
  "confirm-mismatch",
48
48
  "unattended-profile-missing",
49
49
  "workspace-not-trusted",
50
+ "no-selection",
51
+ "repo-not-configured",
52
+ "invalid-config",
53
+ "not-installed",
54
+ "repo-ambiguous",
55
+ "unreadable-settings",
56
+ "not-removable",
57
+ "not-steerable",
58
+ "too-many-streams",
59
+ "no-review",
60
+ "upstream-failed",
61
+ "tool-not-allowed",
62
+ "busy",
63
+ "review-incomplete",
64
+ "host-not-allowed",
50
65
  "internal"
51
66
  ],
52
67
  "x-sensitivity": "none"
53
68
  },
54
- "message": { "type": "string", "x-sensitivity": "none" },
55
- "errors": { "type": "array", "items": { "type": "string" }, "x-sensitivity": "none" },
56
- "supported": { "type": "array", "items": { "type": "integer" }, "x-sensitivity": "none" },
69
+ "message": {
70
+ "type": "string",
71
+ "x-sensitivity": "none"
72
+ },
73
+ "errors": {
74
+ "type": "array",
75
+ "items": {
76
+ "type": "string"
77
+ },
78
+ "x-sensitivity": "none"
79
+ },
80
+ "supported": {
81
+ "type": "array",
82
+ "items": {
83
+ "type": "integer"
84
+ },
85
+ "x-sensitivity": "none"
86
+ },
57
87
  "remedy": {
58
88
  "type": "string",
59
89
  "x-sensitivity": "none",
@@ -0,0 +1,68 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/issue-maturity.schema.json",
4
+ "title": "Issue maturity",
5
+ "description": "What GET /v1/issues/{key}/maturity returns (`work-items.mjs maturity <key>`, from lib/issue-fetcher.sh): the maturity check the pipeline runs before it starts on an issue. key is a Jira key, owner/repo#N or #N. Blockers stop a run; warnings are asked about. Text is redacted.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "contractVersion",
10
+ "key",
11
+ "kind",
12
+ "title",
13
+ "type",
14
+ "status",
15
+ "maturity",
16
+ "description"
17
+ ],
18
+ "properties": {
19
+ "contractVersion": {
20
+ "type": "string",
21
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$",
22
+ "x-sensitivity": "none"
23
+ },
24
+ "key": {
25
+ "type": "string"
26
+ },
27
+ "kind": {
28
+ "enum": ["jira", "github", "freetext"]
29
+ },
30
+ "title": {
31
+ "type": "string"
32
+ },
33
+ "type": {
34
+ "type": ["string", "null"]
35
+ },
36
+ "status": {
37
+ "type": ["string", "null"]
38
+ },
39
+ "maturity": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "required": ["score", "blockers", "warnings", "summary"],
43
+ "properties": {
44
+ "score": {
45
+ "type": ["number", "null"]
46
+ },
47
+ "blockers": {
48
+ "type": "array",
49
+ "items": {
50
+ "type": "string"
51
+ }
52
+ },
53
+ "warnings": {
54
+ "type": "array",
55
+ "items": {
56
+ "type": "string"
57
+ }
58
+ },
59
+ "summary": {
60
+ "type": ["string", "null"]
61
+ }
62
+ }
63
+ },
64
+ "description": {
65
+ "type": ["string", "null"]
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,202 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/ledger.schema.json",
4
+ "title": "Office ledger",
5
+ "description": "What GET /v1/ledger returns and `office-ledger.mjs --json` prints: tokens and estimated USD for today, this week (from Monday) and this month, in local time, broken down by run, repository, model and phase. A run's numbers come from its tracker-state.json when the tracker carries tokens, else from the usage records of the transcripts tied to it; a run with neither is not-measured, and its usd and tokens are null, never 0. Sessions no run claims are counted apart as outside the pipeline. Prices come from cost-table.json; a cache write is priced at 1.25 times input. Every amount names its source.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["contractVersion", "generatedAt", "prices", "windows"],
9
+ "properties": {
10
+ "contractVersion": {
11
+ "type": "string",
12
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$",
13
+ "x-sensitivity": "none"
14
+ },
15
+ "generatedAt": {
16
+ "type": "string",
17
+ "format": "date-time",
18
+ "x-sensitivity": "none"
19
+ },
20
+ "prices": {
21
+ "type": "object",
22
+ "additionalProperties": false,
23
+ "required": ["table", "verifiedAt", "ageDays", "stale", "warning"],
24
+ "x-sensitivity": "none",
25
+ "properties": {
26
+ "table": {
27
+ "const": "cost-table.json"
28
+ },
29
+ "verifiedAt": {
30
+ "type": ["string", "null"]
31
+ },
32
+ "ageDays": {
33
+ "type": ["integer", "null"]
34
+ },
35
+ "stale": {
36
+ "type": "boolean"
37
+ },
38
+ "warning": {
39
+ "type": ["string", "null"]
40
+ }
41
+ }
42
+ },
43
+ "windows": {
44
+ "type": "object",
45
+ "additionalProperties": false,
46
+ "required": ["today", "week", "month"],
47
+ "x-sensitivity": "none",
48
+ "properties": {
49
+ "today": {
50
+ "$ref": "#/$defs/window"
51
+ },
52
+ "week": {
53
+ "$ref": "#/$defs/window"
54
+ },
55
+ "month": {
56
+ "$ref": "#/$defs/window"
57
+ }
58
+ }
59
+ }
60
+ },
61
+ "$defs": {
62
+ "source": {
63
+ "enum": ["tracker-state", "transcript", "mixed", "not-measured"],
64
+ "description": "tracker-state: the pipeline's own ledger; transcript: derived from the host's usage records; mixed: a sum of both kinds; not-measured: nothing could be read, so the numbers are null."
65
+ },
66
+ "tokens": {
67
+ "oneOf": [
68
+ {
69
+ "type": "object",
70
+ "additionalProperties": false,
71
+ "required": ["in", "out", "cacheRead", "cacheWrite"],
72
+ "properties": {
73
+ "in": {
74
+ "type": "integer",
75
+ "minimum": 0
76
+ },
77
+ "out": {
78
+ "type": "integer",
79
+ "minimum": 0
80
+ },
81
+ "cacheRead": {
82
+ "type": "integer",
83
+ "minimum": 0
84
+ },
85
+ "cacheWrite": {
86
+ "type": "integer",
87
+ "minimum": 0
88
+ }
89
+ }
90
+ },
91
+ {
92
+ "type": "null"
93
+ }
94
+ ]
95
+ },
96
+ "amount": {
97
+ "type": "object",
98
+ "additionalProperties": false,
99
+ "required": ["tokens", "usd", "source", "unpriced"],
100
+ "properties": {
101
+ "tokens": {
102
+ "$ref": "#/$defs/tokens"
103
+ },
104
+ "usd": {
105
+ "type": ["number", "null"]
106
+ },
107
+ "source": {
108
+ "$ref": "#/$defs/source"
109
+ },
110
+ "unpriced": {
111
+ "type": "integer",
112
+ "minimum": 0,
113
+ "description": "Usage records whose model has no price; their tokens are counted, their cost is not."
114
+ }
115
+ }
116
+ },
117
+ "row": {
118
+ "type": "object",
119
+ "additionalProperties": false,
120
+ "required": ["key", "tokens", "usd", "source", "unpriced"],
121
+ "properties": {
122
+ "key": {
123
+ "type": "string"
124
+ },
125
+ "repo": {
126
+ "type": ["string", "null"],
127
+ "description": "On byRun rows: the run repository."
128
+ },
129
+ "tokens": {
130
+ "$ref": "#/$defs/tokens"
131
+ },
132
+ "usd": {
133
+ "type": ["number", "null"]
134
+ },
135
+ "source": {
136
+ "$ref": "#/$defs/source"
137
+ },
138
+ "unpriced": {
139
+ "type": "integer",
140
+ "minimum": 0
141
+ }
142
+ }
143
+ },
144
+ "window": {
145
+ "type": "object",
146
+ "additionalProperties": false,
147
+ "required": [
148
+ "since",
149
+ "total",
150
+ "outsidePipeline",
151
+ "notMeasured",
152
+ "byRun",
153
+ "byRepo",
154
+ "byModel",
155
+ "byPhase"
156
+ ],
157
+ "properties": {
158
+ "since": {
159
+ "type": "string",
160
+ "format": "date-time"
161
+ },
162
+ "total": {
163
+ "$ref": "#/$defs/amount"
164
+ },
165
+ "outsidePipeline": {
166
+ "$ref": "#/$defs/amount"
167
+ },
168
+ "notMeasured": {
169
+ "type": "array",
170
+ "items": {
171
+ "type": "string"
172
+ },
173
+ "description": "Task ids of runs active in the window whose cost could not be measured."
174
+ },
175
+ "byRun": {
176
+ "type": "array",
177
+ "items": {
178
+ "$ref": "#/$defs/row"
179
+ }
180
+ },
181
+ "byRepo": {
182
+ "type": "array",
183
+ "items": {
184
+ "$ref": "#/$defs/row"
185
+ }
186
+ },
187
+ "byModel": {
188
+ "type": "array",
189
+ "items": {
190
+ "$ref": "#/$defs/row"
191
+ }
192
+ },
193
+ "byPhase": {
194
+ "type": "array",
195
+ "items": {
196
+ "$ref": "#/$defs/row"
197
+ }
198
+ }
199
+ }
200
+ }
201
+ }
202
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/permissions.schema.json",
4
+ "title": "Pending permission prompts",
5
+ "description": "What GET /v1/permissions returns: the host permission prompts waiting on the user. available is false while the host records none where another process can read them; requests is then empty and reason says so. When available, each request names its session, the tool and a redacted summary.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["contractVersion", "available", "reason", "requests"],
9
+ "properties": {
10
+ "contractVersion": {
11
+ "type": "string",
12
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$",
13
+ "x-sensitivity": "none"
14
+ },
15
+ "available": {
16
+ "type": "boolean"
17
+ },
18
+ "reason": {
19
+ "type": ["string", "null"]
20
+ },
21
+ "requests": {
22
+ "type": "array",
23
+ "items": {
24
+ "type": "object",
25
+ "additionalProperties": false,
26
+ "required": ["id", "sessionId", "tool", "summary", "at"],
27
+ "properties": {
28
+ "id": {
29
+ "type": "string"
30
+ },
31
+ "sessionId": {
32
+ "type": "string"
33
+ },
34
+ "tool": {
35
+ "type": "string"
36
+ },
37
+ "summary": {
38
+ "type": "string"
39
+ },
40
+ "at": {
41
+ "type": "string"
42
+ }
43
+ }
44
+ }
45
+ }
46
+ }
47
+ }
@@ -309,6 +309,25 @@
309
309
  "maxItems": 10
310
310
  }
311
311
  },
312
+ "office": {
313
+ "type": "object",
314
+ "description": "The office panel (/multi-agent:office-on). page overrides the installed panel page; toolkitVersion pins an @latest toolkit registration for the panel's tool calls; remote is read only to report that a separately installed remote layer is present, and no remote code ships with the pipeline.",
315
+ "additionalProperties": false,
316
+ "properties": {
317
+ "page": {
318
+ "type": "string",
319
+ "description": "Absolute path of an HTML page GET /office serves instead of the installed one."
320
+ },
321
+ "toolkitVersion": {
322
+ "type": "string",
323
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(-[0-9A-Za-z.-]+)?$"
324
+ },
325
+ "remote": {
326
+ "type": "object",
327
+ "description": "Configuration owned by a separately installed remote layer; the pipeline only checks that it exists."
328
+ }
329
+ }
330
+ },
312
331
  "routines": {
313
332
  "type": "array",
314
333
  "description": "v2.4.0+. User-defined routines saved via /multi-agent:save. Each entry indexes a local-only /multi-agent:<name> command dir under ~/.claude/commands/multi-agent/. Never synced (personal). Managed by routine-registry.mjs.",
@@ -0,0 +1,73 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/prs.schema.json",
4
+ "title": "Pull requests",
5
+ "description": "What GET /v1/prs returns (`work-items.mjs prs`): open pull requests where you are asked to review or are the author. sources says per host whether it was read; Bitbucket listing is not implemented and says so rather than showing an empty list. url is dropped under redact.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["contractVersion", "items", "sources"],
9
+ "properties": {
10
+ "contractVersion": {
11
+ "type": "string",
12
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$",
13
+ "x-sensitivity": "none"
14
+ },
15
+ "items": {
16
+ "type": "array",
17
+ "items": {
18
+ "type": "object",
19
+ "additionalProperties": false,
20
+ "required": ["source", "repo", "number", "title", "url", "author", "updatedAt", "role"],
21
+ "properties": {
22
+ "source": {
23
+ "enum": ["github", "bitbucket"]
24
+ },
25
+ "repo": {
26
+ "type": "string"
27
+ },
28
+ "number": {
29
+ "type": "integer"
30
+ },
31
+ "title": {
32
+ "type": "string"
33
+ },
34
+ "url": {
35
+ "type": ["string", "null"],
36
+ "x-sensitivity": "local"
37
+ },
38
+ "author": {
39
+ "type": ["string", "null"]
40
+ },
41
+ "updatedAt": {
42
+ "type": ["string", "null"]
43
+ },
44
+ "role": {
45
+ "enum": ["reviewer", "author"]
46
+ }
47
+ }
48
+ }
49
+ },
50
+ "sources": {
51
+ "type": "array",
52
+ "items": {
53
+ "type": "object",
54
+ "additionalProperties": false,
55
+ "required": ["source", "ok", "count"],
56
+ "properties": {
57
+ "source": {
58
+ "type": "string"
59
+ },
60
+ "ok": {
61
+ "type": "boolean"
62
+ },
63
+ "count": {
64
+ "type": "integer"
65
+ },
66
+ "reason": {
67
+ "type": "string"
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/review-verdict-request.schema.json",
4
+ "title": "Review verdict request",
5
+ "description": "The body of POST /v1/runs/{id}/review-verdict: empty for the preview, confirmToken to post. The verdict is never chosen by the request; it follows from the review's recorded findings.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["contractVersion"],
9
+ "properties": {
10
+ "contractVersion": {
11
+ "type": "string",
12
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$",
13
+ "x-sensitivity": "none"
14
+ },
15
+ "confirmToken": {
16
+ "type": "string",
17
+ "pattern": "^[A-Za-z0-9_-]{16,128}$"
18
+ }
19
+ }
20
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/mmerterden/multi-agent-pipeline/pipeline/schemas/review-verdict.schema.json",
4
+ "title": "Review verdict",
5
+ "description": "What POST /v1/runs/{id}/review-verdict returns (`work-items.mjs verdict <id> [--post]`). Only a finished review whose every finding is triaged (accepted, rejected or deferred) is previewed (409 review-incomplete otherwise). The preview carries findingsDigest, the hash of the findings it was made from, and the decision lib/post-pr-review.sh would post (approve with no accepted blocking or important finding, else needs-work), a confirmToken bound to that decision and digest, and expiresAt; a confirmation after either changed is 409 confirm-mismatch; the confirmation runs post-pr-review.sh, which posts the comments and the verdict with the user's own credential, and says posted.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "contractVersion",
10
+ "taskId",
11
+ "provider",
12
+ "prNumber",
13
+ "decision",
14
+ "acceptedBlocking",
15
+ "acceptedImportant",
16
+ "findings",
17
+ "findingsDigest"
18
+ ],
19
+ "properties": {
20
+ "contractVersion": {
21
+ "type": "string",
22
+ "pattern": "^1\\.[0-9]+\\.[0-9]+$",
23
+ "x-sensitivity": "none"
24
+ },
25
+ "taskId": {
26
+ "type": "string"
27
+ },
28
+ "provider": {
29
+ "enum": ["github", "bitbucket-server", null]
30
+ },
31
+ "prNumber": {
32
+ "type": ["integer", "null"]
33
+ },
34
+ "decision": {
35
+ "enum": ["approve", "needs-work"]
36
+ },
37
+ "acceptedBlocking": {
38
+ "type": "integer"
39
+ },
40
+ "acceptedImportant": {
41
+ "type": "integer"
42
+ },
43
+ "findings": {
44
+ "type": "integer"
45
+ },
46
+ "posted": {
47
+ "type": "boolean"
48
+ },
49
+ "confirmToken": {
50
+ "type": "string",
51
+ "pattern": "^[A-Za-z0-9_-]{16,128}$"
52
+ },
53
+ "expiresAt": {
54
+ "type": "string",
55
+ "format": "date-time"
56
+ },
57
+ "findingsDigest": {
58
+ "type": "string",
59
+ "pattern": "^[0-9a-f]{64}$"
60
+ }
61
+ }
62
+ }