@wildo-ai/platform-core-shared 1.1.4 → 1.1.6

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 (82) hide show
  1. package/dist/esm/core/resources/resources-operations.custom.shared.definitions.d.ts.map +1 -1
  2. package/dist/esm/core/resources/resources-relationships.custom.shared.definitions.d.ts.map +1 -1
  3. package/dist/esm/index.d.ts +4 -1
  4. package/dist/esm/index.d.ts.map +1 -1
  5. package/dist/esm/index.js +4 -1
  6. package/dist/esm/index.js.map +1 -1
  7. package/dist/esm/runtime/application-backend-env.contracts.d.ts +49 -4
  8. package/dist/esm/runtime/application-backend-env.contracts.d.ts.map +1 -1
  9. package/dist/esm/runtime/application-backend-env.contracts.js +48 -1
  10. package/dist/esm/runtime/application-backend-env.contracts.js.map +1 -1
  11. package/dist/esm/runtime/http-server-env.contracts.d.ts +46 -0
  12. package/dist/esm/runtime/http-server-env.contracts.d.ts.map +1 -0
  13. package/dist/esm/runtime/http-server-env.contracts.js +55 -0
  14. package/dist/esm/runtime/http-server-env.contracts.js.map +1 -0
  15. package/dist/esm/runtime/runtime-topology.contracts.d.ts +0 -4
  16. package/dist/esm/runtime/runtime-topology.contracts.d.ts.map +1 -1
  17. package/dist/esm/runtime/runtime-topology.contracts.js +0 -12
  18. package/dist/esm/runtime/runtime-topology.contracts.js.map +1 -1
  19. package/dist/esm/security/authorizations/roles.custom.shared.definitions.d.ts.map +1 -1
  20. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.resources-config.schemas.d.ts +166 -70
  21. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.resources-config.schemas.d.ts.map +1 -1
  22. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.schemas.d.ts +166 -70
  23. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.schemas.d.ts.map +1 -1
  24. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.schemas.js +2 -2
  25. package/dist/esm/wildo-application-executions/wildo-application-executions.custom.shared.schemas.js.map +1 -1
  26. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.resources-config.schemas.d.ts +21 -10
  27. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.resources-config.schemas.d.ts.map +1 -1
  28. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.d.ts +21 -10
  29. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.d.ts.map +1 -1
  30. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.js +26 -28
  31. package/dist/esm/wildo-application-tasks/wildo-application-tasks.custom.shared.schemas.js.map +1 -1
  32. package/dist/esm/wildo-applications/wildo-applications.custom.shared.resources-config.schemas.d.ts.map +1 -1
  33. package/dist/esm/wildo-applications/wildo-applications.custom.shared.resources-config.schemas.js.map +1 -1
  34. package/dist/esm/wildo-applications/wildo-applications.custom.shared.schemas.d.ts +29 -0
  35. package/dist/esm/wildo-applications/wildo-applications.custom.shared.schemas.d.ts.map +1 -1
  36. package/dist/esm/wildo-applications/wildo-applications.custom.shared.schemas.js +58 -0
  37. package/dist/esm/wildo-applications/wildo-applications.custom.shared.schemas.js.map +1 -1
  38. package/dist/esm/wildo-applications-versions/wildo-applications-versions.custom.shared.resources-config.schemas.d.ts.map +1 -1
  39. package/dist/esm/wildo-applications-versions/wildo-applications-versions.custom.shared.resources-config.schemas.js.map +1 -1
  40. package/dist/esm/wildo-applications-versions/wildo-applications-versions.custom.shared.schemas.d.ts.map +1 -1
  41. package/dist/esm/workbench/workbench-aspect-resources.custom.shared.schemas.d.ts +13 -0
  42. package/dist/esm/workbench/workbench-aspect-resources.custom.shared.schemas.d.ts.map +1 -1
  43. package/dist/esm/workbench/workbench-aspect-resources.custom.shared.schemas.js +441 -1
  44. package/dist/esm/workbench/workbench-aspect-resources.custom.shared.schemas.js.map +1 -1
  45. package/dist/esm/workbench/workbench-creation-console.custom.shared.schemas.d.ts +279 -0
  46. package/dist/esm/workbench/workbench-creation-console.custom.shared.schemas.d.ts.map +1 -0
  47. package/dist/esm/workbench/workbench-creation-console.custom.shared.schemas.js +303 -0
  48. package/dist/esm/workbench/workbench-creation-console.custom.shared.schemas.js.map +1 -0
  49. package/dist/esm/workbench/workbench-creation-conversation.custom.shared.schemas.d.ts +199 -0
  50. package/dist/esm/workbench/workbench-creation-conversation.custom.shared.schemas.d.ts.map +1 -0
  51. package/dist/esm/workbench/workbench-creation-conversation.custom.shared.schemas.js +185 -0
  52. package/dist/esm/workbench/workbench-creation-conversation.custom.shared.schemas.js.map +1 -0
  53. package/dist/esm/workbench/workbench-creation-dossier.custom.shared.schemas.d.ts +49 -0
  54. package/dist/esm/workbench/workbench-creation-dossier.custom.shared.schemas.d.ts.map +1 -0
  55. package/dist/esm/workbench/workbench-creation-dossier.custom.shared.schemas.js +42 -0
  56. package/dist/esm/workbench/workbench-creation-dossier.custom.shared.schemas.js.map +1 -0
  57. package/dist/esm/workbench/workbench-creation-plane.custom.shared.resources-config.schemas.d.ts +461 -11
  58. package/dist/esm/workbench/workbench-creation-plane.custom.shared.resources-config.schemas.d.ts.map +1 -1
  59. package/dist/esm/workbench/workbench-creation-plane.custom.shared.resources-config.schemas.js +509 -6
  60. package/dist/esm/workbench/workbench-creation-plane.custom.shared.resources-config.schemas.js.map +1 -1
  61. package/dist/esm/workbench/workbench-creation-plane.custom.shared.schemas.d.ts +1102 -12
  62. package/dist/esm/workbench/workbench-creation-plane.custom.shared.schemas.d.ts.map +1 -1
  63. package/dist/esm/workbench/workbench-creation-plane.custom.shared.schemas.js +1520 -19
  64. package/dist/esm/workbench/workbench-creation-plane.custom.shared.schemas.js.map +1 -1
  65. package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.d.ts +123 -1
  66. package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.d.ts.map +1 -1
  67. package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.js +168 -0
  68. package/dist/esm/workbench/workbench-resources-types.custom.shared.schemas.js.map +1 -1
  69. package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.d.ts +229 -9
  70. package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.d.ts.map +1 -1
  71. package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.js +2 -2
  72. package/dist/esm/workbench/workbench-resources.custom.shared.resources-config.schemas.js.map +1 -1
  73. package/dist/esm/workbench/workbench-resources.custom.shared.schemas.d.ts +18 -3
  74. package/dist/esm/workbench/workbench-resources.custom.shared.schemas.d.ts.map +1 -1
  75. package/dist/esm/workbench/workbench-resources.custom.shared.schemas.js +35 -7
  76. package/dist/esm/workbench/workbench-resources.custom.shared.schemas.js.map +1 -1
  77. package/dist/tsconfig.build.tsbuildinfo +1 -1
  78. package/package.json +4 -13
  79. package/dist/esm/workbench/workbench-creation-board.custom.shared.schemas.d.ts +0 -98
  80. package/dist/esm/workbench/workbench-creation-board.custom.shared.schemas.d.ts.map +0 -1
  81. package/dist/esm/workbench/workbench-creation-board.custom.shared.schemas.js +0 -86
  82. package/dist/esm/workbench/workbench-creation-board.custom.shared.schemas.js.map +0 -1
@@ -0,0 +1,303 @@
1
+ import { z } from 'zod';
2
+ import { WorkbenchCreationHomeLineKind, WorkbenchCreationHomeSection } from './workbench-creation-plane.custom.shared.schemas.js';
3
+ /**
4
+ * The CREATION CONSOLE contract — how a coding-agent session (Claude Code, or any agent driving
5
+ * `wildo`) follows what the companion did and answers what the companion asks.
6
+ *
7
+ * ## Why a console needs its own contract beside the workbench's resources
8
+ *
9
+ * The companion is the master of application creation: it runs playbooks, dispatches coding
10
+ * workers over ACP, runs judges and generation steps. The person drives it from a CONSOLE — the
11
+ * coding-agent session they are already working in — and the workbench becomes the dashboard of
12
+ * that state (Paul, 2026-09-25). Two things are then owed to the console:
13
+ *
14
+ * 1. FEEDBACK: what the companion did (a run completed or was refused, a dispatch settled, a judge
15
+ * verdict) and what it now waits for.
16
+ * 2. ANSWERS: every question the companion asks must be answerable from the console, once, and
17
+ * the answer must reach the same service the workbench's own operation reaches.
18
+ *
19
+ * The facts already exist as creation-plane rows (Home's lines, the waiting runs, the parked coding
20
+ * questions, the dossier). The workbench reaches them through the resource plane, which needs a
21
+ * signed-in PERSON; a console reaches the companion through the local-token plane
22
+ * (`/api/companion/*`), which is how every `wildo` verb already talks to it. This contract is that
23
+ * plane's view of the SAME rows — no second derivation, and no second implementation of an answer:
24
+ * each answer kind calls the companion service the matching workbench operation calls.
25
+ *
26
+ * ## Why the question queue is ONE list rather than one read per kind
27
+ *
28
+ * A person (or an agent acting for them) asks "what is waiting on me?" once. Four reads, each with
29
+ * its own identity and answer route, is what makes a console skip one. So the companion folds the
30
+ * four row kinds into one list with one identity scheme and one answer door, and says per question
31
+ * which actions it admits — the console restates no policy.
32
+ */
33
+ /**
34
+ * WHAT KIND of question a queued item is — which companion lane asked it, and so which service an
35
+ * answer reaches.
36
+ */
37
+ export var CreationConsoleQuestionKind;
38
+ (function (CreationConsoleQuestionKind) {
39
+ /**
40
+ * A playbook run SUSPENDED mid-derivation on a round of questions it cannot decide alone. One item
41
+ * per round, carrying every question of the round: the run resumes on one answer to the round.
42
+ */
43
+ CreationConsoleQuestionKind["CLARIFICATION"] = "clarification";
44
+ /** A coding worker (an ACP session the companion dispatched) PARKED on a question it asked. */
45
+ CreationConsoleQuestionKind["PARKED_CODING_QUESTION"] = "parked-coding-question";
46
+ /**
47
+ * An interview question a step can run as soon as it is answered — the dossier entry the workbench
48
+ * shows as "asked of you now". Answering lands `creator-inputs`; a commit accepts it.
49
+ */
50
+ CreationConsoleQuestionKind["INTERVIEW"] = "interview";
51
+ /**
52
+ * A fact a drafted governed document still needs. LISTED so the queue is total over what waits on
53
+ * the person, NOT answerable here: landing governance facts is a whole-document sitting that also
54
+ * names the governance scope and who decided, and `compliance-is-derived-from-the-product.md`
55
+ * holds that questionnaire where it is until the evidence tier exists. Answer it in the workbench.
56
+ */
57
+ CreationConsoleQuestionKind["GOVERNANCE_FACT"] = "governance-fact";
58
+ })(CreationConsoleQuestionKind || (CreationConsoleQuestionKind = {}));
59
+ /**
60
+ * WHAT an answer does — the industry three-action model the playbook clarification already uses
61
+ * (MCP elicitation's vocabulary), so every kind of question speaks it.
62
+ */
63
+ export var CreationConsoleAnswerAction;
64
+ (function (CreationConsoleAnswerAction) {
65
+ /** Give the answer(s). */
66
+ CreationConsoleAnswerAction["ANSWER"] = "answer";
67
+ /**
68
+ * Let the asking derivation decide and state its assumption. Clarifications only. May carry the answers
69
+ * the person did give: the run then decides only the questions left unanswered.
70
+ */
71
+ CreationConsoleAnswerAction["DECLINE"] = "decline";
72
+ /** Abandon the run that asked. Clarifications and parked coding questions. */
73
+ CreationConsoleAnswerAction["CANCEL"] = "cancel";
74
+ })(CreationConsoleAnswerAction || (CreationConsoleAnswerAction = {}));
75
+ /** One question inside a queued item — a clarification round carries several, the others one. */
76
+ export const CreationConsole_QuestionField_Schema = z.object({
77
+ /** The ref an answer names. */
78
+ ref: z.string().min(1),
79
+ /** The question as a person reads it, verbatim from whoever asked. */
80
+ question: z.string().min(1),
81
+ /** Why it is asked — what cannot be decided without it. NULL when the asker states none. */
82
+ why: z.string().min(1).nullable(),
83
+ /**
84
+ * The answer's shape, in the ASKER's own vocabulary — deliberately a string, because this field carries
85
+ * two: `HumanDecision_FieldKind` (`free_text` | `choice` | `confirm`) for a playbook round, a parked run
86
+ * and an interview question, and the governed-document questionnaire's answer kind for a governance
87
+ * fact. One enum here would be false for one of them.
88
+ */
89
+ kind: z.string().min(1),
90
+ /** The closed answer set for a `choice`; empty otherwise. */
91
+ options: z.array(z.string()),
92
+ });
93
+ export const CreationConsole_Question_Schema = z.object({
94
+ /**
95
+ * `<kind>:<creation-plane row id>`. Row ids are sanitized to `[a-zA-Z0-9_-]`, so the first `:`
96
+ * always separates the kind — see {@link parseCreationConsoleQuestionId}.
97
+ */
98
+ questionId: z.string().min(1),
99
+ kind: z.enum(CreationConsoleQuestionKind),
100
+ /** When it was asked, ISO-8601. NULL when the row records no instant (an interview question has none). */
101
+ askedAt: z.string().nullable(),
102
+ /** The playbook that asks, when a playbook asks. */
103
+ playbookRef: z.string().nullable(),
104
+ /** The build-plan task the asking coding run was working on, for a parked coding question. */
105
+ taskRef: z.string().nullable(),
106
+ /**
107
+ * The opened INSTANCE of the step the question is asked for (#1609), for an interview question; NULL for
108
+ * the step itself and for other kinds. An answer lands on that instance, so the reader must see which.
109
+ */
110
+ instanceKey: z.string().nullable(),
111
+ /** The governed document, for a governance fact. */
112
+ definitionRef: z.string().nullable(),
113
+ /**
114
+ * WHICH revision of the question the console read — the clarification's round, the parked run's
115
+ * suspension ref. An answer must echo it: a run that has moved on to another question refuses an
116
+ * answer written for the previous one (#1584, #1581) instead of applying it to the wrong question.
117
+ * NULL for kinds that have no revision.
118
+ */
119
+ revision: z.string().nullable(),
120
+ /** The questions to answer, in order. */
121
+ fields: z.array(CreationConsole_QuestionField_Schema),
122
+ /** What an answer may do for THIS item — empty when the console cannot answer it. */
123
+ actions: z.array(z.enum(CreationConsoleAnswerAction)),
124
+ /*
125
+ * Facts that change what answering MEANS, for the reader to weigh first. Carried as facts rather
126
+ * than as a sentence: the words belong to whoever renders them (`display-text-comes-from-i18n.md`).
127
+ */
128
+ /** The family a suspended run was producing when it stopped to ask. */
129
+ producingFamily: z.string().nullable(),
130
+ /** The suspended run was a dry run: answering it writes nothing. NULL for other kinds. */
131
+ dryRun: z.boolean().nullable(),
132
+ /** FALSE when the parked coding run cannot re-enter its own session, so an answer starts a new one. NULL for other kinds. */
133
+ resumable: z.boolean().nullable(),
134
+ /** Every family an interview answer feeds — what goes stale when it changes. Empty for other kinds. */
135
+ affectsFamilies: z.array(z.string()),
136
+ /**
137
+ * The signed-in person a clarification is ROUTED to (#1751) — whoever started its run from the workbench
138
+ * or the conversation. Only they may answer it, and the console carries no person, so such an item has
139
+ * no actions here: it is answered in the workbench, signed in as them. NULL when it is unrouted.
140
+ */
141
+ routedToUserId: z.string().nullable(),
142
+ });
143
+ export const CreationConsole_QuestionQueue_Schema = z.object({
144
+ /** When the queue was read, ISO-8601. */
145
+ computedAt: z.string(),
146
+ questions: z.array(CreationConsole_Question_Schema),
147
+ });
148
+ /**
149
+ * One answer to one field. It carries its OWN author because a round is answered in one call while its
150
+ * fields may be answered by different parties (#1658): an agent derives one from a declared fact, the
151
+ * person decides the next. With one author per request, a mixed round either stamped the person's name
152
+ * on the agent's derivation or was refused as incomplete — the agent answering alone could not cover the
153
+ * judgement half, and the resume refuses a round answered in part.
154
+ */
155
+ export const CreationConsole_Answer_Schema = z.object({
156
+ ref: z.string().min(1),
157
+ value: z.string().min(1),
158
+ /** Who gave THIS answer; overrides the request's `answeredByRef` for this field. Same vocabulary. */
159
+ answeredByRef: z.string().min(1).optional(),
160
+ });
161
+ export const CreationConsole_AnswerRequest_Schema = z.object({
162
+ questionId: z.string().min(1),
163
+ /** The `revision` of the item as it was READ. Required for the kinds that carry one. */
164
+ revision: z.string().min(1).nullable().optional(),
165
+ action: z.enum(CreationConsoleAnswerAction),
166
+ /**
167
+ * One entry per answered field, by its `ref`. Required for `answer`, which must cover every field.
168
+ * A clarification's `decline` may carry the fields the person DID answer and delegates only the rest
169
+ * (#1658), so one round can mix what a person decided with what they left to the run.
170
+ */
171
+ answers: z.array(CreationConsole_Answer_Schema).optional(),
172
+ /**
173
+ * WHO answered — recorded for EVERY kind (#1658): on an interview answer in the dossier, on a
174
+ * clarification in the committed `DECISIONS.md`, on a parked coding answer in `CODING-ANSWERS.md`.
175
+ * The local-token plane proves only that the caller
176
+ * is on this machine — the same trust as a git commit author, which is what accepts the answer
177
+ * anyway (`one-source-of-truth.md` rule 7) — so `wildo` sends the workspace's git identity as
178
+ * `git:<email>` unless told otherwise, and an agent answering on its own sends `agent:<name>`. The
179
+ * prefix matters because the same dossier field holds the workbench's signed-in user ids: it says
180
+ * which door an answer came through. Required for an interview answer (the dossier cannot record
181
+ * one without it); optional for the others, which then record nothing rather than a guess.
182
+ *
183
+ * The DEFAULT author of every answer in the request: an answer carrying its own `answeredByRef` keeps
184
+ * it. A parked coding question and an interview answer are one field each, so the two cannot differ.
185
+ */
186
+ answeredByRef: z.string().min(1).optional(),
187
+ });
188
+ export const CreationConsole_AnswerOutcome_Schema = z.looseObject({
189
+ questionId: z.string().min(1),
190
+ kind: z.enum(CreationConsoleQuestionKind),
191
+ action: z.enum(CreationConsoleAnswerAction),
192
+ /** What the answering service returned — its own shape (a resumed run's outcome, a landed dossier file). */
193
+ outcome: z.unknown(),
194
+ });
195
+ /**
196
+ * One FEED line: a Home line (what happened, what is asked, what could come next) with the row it
197
+ * points at attached, so a console reads a run's verdict or a dispatch's error without a second call.
198
+ *
199
+ * `at` is ISO-8601 here — this is a JSON contract, not a resource row.
200
+ */
201
+ export const CreationConsole_FeedLine_Schema = z.object({
202
+ lineId: z.string().min(1),
203
+ section: z.enum(WorkbenchCreationHomeSection),
204
+ kind: z.enum(WorkbenchCreationHomeLineKind),
205
+ at: z.string().nullable(),
206
+ playbookRef: z.string().nullable(),
207
+ taskRef: z.string().nullable(),
208
+ subject: z.string().nullable(),
209
+ failed: z.boolean(),
210
+ acceptable: z.boolean(),
211
+ needsAnswers: z.boolean(),
212
+ stuckReason: z.string().nullable(),
213
+ targetResourceType: z.string().min(1),
214
+ targetResourceId: z.string().min(1),
215
+ /** The row the line points at, as the creation plane serves it. NULL when it has gone since. */
216
+ target: z.record(z.string(), z.unknown()).nullable(),
217
+ /** The queued question this line is about, when it is about exactly one — answer it by this id. */
218
+ questionId: z.string().nullable(),
219
+ });
220
+ export const CreationConsole_Feed_Schema = z.object({
221
+ computedAt: z.string(),
222
+ lines: z.array(CreationConsole_FeedLine_Schema),
223
+ });
224
+ /** The one identity rule, applied by the companion when it emits and when it resolves an answer. */
225
+ export function formatCreationConsoleQuestionId(kind, rowId) {
226
+ return `${kind}:${rowId}`;
227
+ }
228
+ /** The inverse of {@link formatCreationConsoleQuestionId}; `null` for anything that is not one. */
229
+ export function parseCreationConsoleQuestionId(questionId) {
230
+ const separator = questionId.indexOf(':');
231
+ if (separator <= 0 || separator === questionId.length - 1)
232
+ return null;
233
+ const kind = Object.values(CreationConsoleQuestionKind).find((candidate) => candidate === questionId.slice(0, separator));
234
+ return kind ? { kind, rowId: questionId.slice(separator + 1) } : null;
235
+ }
236
+ /**
237
+ * The workbench DEEP LINK (#1652): `?open=<resourceType>:<resourceId>` opens that creation-plane row
238
+ * in the workbench's detail pane, the way clicking its Home line does. `wildo workbench open <ref>`
239
+ * writes it; the workbench reads it once and drops it. One format, owned here, so the writer and the
240
+ * reader cannot disagree about it.
241
+ *
242
+ * The FIRST `:` separates the two, because a resource type never contains one and a row id may.
243
+ */
244
+ export const WORKBENCH_OPEN_DETAIL_QUERY_PARAM = 'open';
245
+ export function formatWorkbenchOpenDetailParam(resourceType, resourceId) {
246
+ return `${resourceType}:${resourceId}`;
247
+ }
248
+ /** The inverse of {@link formatWorkbenchOpenDetailParam}; `null` for anything that is not one. */
249
+ export function parseWorkbenchOpenDetailParam(value) {
250
+ const separator = value.indexOf(':');
251
+ if (separator <= 0 || separator === value.length - 1)
252
+ return null;
253
+ return { resourceType: value.slice(0, separator), resourceId: value.slice(separator + 1) };
254
+ }
255
+ /**
256
+ * The PULSE (#1657): a read cheap enough to poll every few seconds from a hook or a status line.
257
+ *
258
+ * Nothing in it is derived on request. `sequence` and `changedAt` move whenever the creation plane's
259
+ * boards are invalidated (every mutation path ends there) or a watched board is republished;
260
+ * `runsInFlight` is the process's own running-run count; `summary` is what the most recent FEED read
261
+ * counted, with its instant — `null` until someone has read the feed, because computing it here would
262
+ * make the pulse as slow as the feed. A poller compares pulses and reads the feed only when one moved.
263
+ */
264
+ export const CreationConsole_PulseSummary_Schema = z.object({
265
+ /** Lines in the ASKED section: questions waiting on the person. */
266
+ asked: z.number().int().nonnegative(),
267
+ /** Lines marked acceptable: finished work waiting to be committed. */
268
+ acceptable: z.number().int().nonnegative(),
269
+ /** SINCE lines that failed. */
270
+ failed: z.number().int().nonnegative(),
271
+ computedAt: z.string(),
272
+ });
273
+ export const CreationConsole_Pulse_Schema = z.object({
274
+ sequence: z.number().int().nonnegative(),
275
+ changedAt: z.string().nullable(),
276
+ runsInFlight: z.number().int().nonnegative(),
277
+ summary: CreationConsole_PulseSummary_Schema.nullable(),
278
+ });
279
+ /** The pulse a feed's lines imply — one counting rule, used by the companion when it serves a feed. */
280
+ export function summarizeCreationConsoleFeed(feed) {
281
+ return {
282
+ asked: feed.lines.filter((line) => line.section === WorkbenchCreationHomeSection.ASKED).length,
283
+ acceptable: feed.lines.filter((line) => line.acceptable).length,
284
+ failed: feed.lines.filter((line) => line.section === WorkbenchCreationHomeSection.SINCE && line.failed).length,
285
+ computedAt: feed.computedAt,
286
+ };
287
+ }
288
+ /**
289
+ * Where a running dev companion says it listens (#1657) — `<app>/.wildo-saas/state/companion-endpoint.json`.
290
+ *
291
+ * Written by the companion once its server is up, beside `companion.token`, because the one party that
292
+ * KNOWS the address is the process listening on it. It exists for callers that must answer in
293
+ * milliseconds — the console's per-prompt hook and its status line — which cannot afford the CLI's own
294
+ * address resolution (it evaluates the authored infrastructure config). The record may outlive the
295
+ * process; a caller treats a refused connection as "not running", never the file's presence.
296
+ */
297
+ export const COMPANION_ENDPOINT_FILE_NAME = 'companion-endpoint.json';
298
+ export const CompanionEndpointRecord_Schema = z.object({
299
+ origin: z.string().url(),
300
+ pid: z.number().int().positive(),
301
+ startedAt: z.string(),
302
+ });
303
+ //# sourceMappingURL=workbench-creation-console.custom.shared.schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbench-creation-console.custom.shared.schemas.js","sourceRoot":"","sources":["../../../../src/workbench/workbench-creation-console.custom.shared.schemas.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod';\n\nimport { WorkbenchCreationHomeLineKind, WorkbenchCreationHomeSection } from './workbench-creation-plane.custom.shared.schemas';\n\n/**\n * The CREATION CONSOLE contract — how a coding-agent session (Claude Code, or any agent driving\n * `wildo`) follows what the companion did and answers what the companion asks.\n *\n * ## Why a console needs its own contract beside the workbench's resources\n *\n * The companion is the master of application creation: it runs playbooks, dispatches coding\n * workers over ACP, runs judges and generation steps. The person drives it from a CONSOLE — the\n * coding-agent session they are already working in — and the workbench becomes the dashboard of\n * that state (Paul, 2026-09-25). Two things are then owed to the console:\n *\n * 1. FEEDBACK: what the companion did (a run completed or was refused, a dispatch settled, a judge\n * verdict) and what it now waits for.\n * 2. ANSWERS: every question the companion asks must be answerable from the console, once, and\n * the answer must reach the same service the workbench's own operation reaches.\n *\n * The facts already exist as creation-plane rows (Home's lines, the waiting runs, the parked coding\n * questions, the dossier). The workbench reaches them through the resource plane, which needs a\n * signed-in PERSON; a console reaches the companion through the local-token plane\n * (`/api/companion/*`), which is how every `wildo` verb already talks to it. This contract is that\n * plane's view of the SAME rows — no second derivation, and no second implementation of an answer:\n * each answer kind calls the companion service the matching workbench operation calls.\n *\n * ## Why the question queue is ONE list rather than one read per kind\n *\n * A person (or an agent acting for them) asks \"what is waiting on me?\" once. Four reads, each with\n * its own identity and answer route, is what makes a console skip one. So the companion folds the\n * four row kinds into one list with one identity scheme and one answer door, and says per question\n * which actions it admits — the console restates no policy.\n */\n\n/**\n * WHAT KIND of question a queued item is — which companion lane asked it, and so which service an\n * answer reaches.\n */\nexport enum CreationConsoleQuestionKind {\n /**\n * A playbook run SUSPENDED mid-derivation on a round of questions it cannot decide alone. One item\n * per round, carrying every question of the round: the run resumes on one answer to the round.\n */\n CLARIFICATION = 'clarification',\n /** A coding worker (an ACP session the companion dispatched) PARKED on a question it asked. */\n PARKED_CODING_QUESTION = 'parked-coding-question',\n /**\n * An interview question a step can run as soon as it is answered — the dossier entry the workbench\n * shows as \"asked of you now\". Answering lands `creator-inputs`; a commit accepts it.\n */\n INTERVIEW = 'interview',\n /**\n * A fact a drafted governed document still needs. LISTED so the queue is total over what waits on\n * the person, NOT answerable here: landing governance facts is a whole-document sitting that also\n * names the governance scope and who decided, and `compliance-is-derived-from-the-product.md`\n * holds that questionnaire where it is until the evidence tier exists. Answer it in the workbench.\n */\n GOVERNANCE_FACT = 'governance-fact',\n}\n\n/**\n * WHAT an answer does — the industry three-action model the playbook clarification already uses\n * (MCP elicitation's vocabulary), so every kind of question speaks it.\n */\nexport enum CreationConsoleAnswerAction {\n /** Give the answer(s). */\n ANSWER = 'answer',\n /**\n * Let the asking derivation decide and state its assumption. Clarifications only. May carry the answers\n * the person did give: the run then decides only the questions left unanswered.\n */\n DECLINE = 'decline',\n /** Abandon the run that asked. Clarifications and parked coding questions. */\n CANCEL = 'cancel',\n}\n\n/** One question inside a queued item — a clarification round carries several, the others one. */\nexport const CreationConsole_QuestionField_Schema = z.object({\n /** The ref an answer names. */\n ref: z.string().min(1),\n /** The question as a person reads it, verbatim from whoever asked. */\n question: z.string().min(1),\n /** Why it is asked — what cannot be decided without it. NULL when the asker states none. */\n why: z.string().min(1).nullable(),\n /**\n * The answer's shape, in the ASKER's own vocabulary — deliberately a string, because this field carries\n * two: `HumanDecision_FieldKind` (`free_text` | `choice` | `confirm`) for a playbook round, a parked run\n * and an interview question, and the governed-document questionnaire's answer kind for a governance\n * fact. One enum here would be false for one of them.\n */\n kind: z.string().min(1),\n /** The closed answer set for a `choice`; empty otherwise. */\n options: z.array(z.string()),\n});\nexport type CreationConsole_QuestionField = z.infer<typeof CreationConsole_QuestionField_Schema>;\n\nexport const CreationConsole_Question_Schema = z.object({\n /**\n * `<kind>:<creation-plane row id>`. Row ids are sanitized to `[a-zA-Z0-9_-]`, so the first `:`\n * always separates the kind — see {@link parseCreationConsoleQuestionId}.\n */\n questionId: z.string().min(1),\n kind: z.enum(CreationConsoleQuestionKind),\n /** When it was asked, ISO-8601. NULL when the row records no instant (an interview question has none). */\n askedAt: z.string().nullable(),\n /** The playbook that asks, when a playbook asks. */\n playbookRef: z.string().nullable(),\n /** The build-plan task the asking coding run was working on, for a parked coding question. */\n taskRef: z.string().nullable(),\n /**\n * The opened INSTANCE of the step the question is asked for (#1609), for an interview question; NULL for\n * the step itself and for other kinds. An answer lands on that instance, so the reader must see which.\n */\n instanceKey: z.string().nullable(),\n /** The governed document, for a governance fact. */\n definitionRef: z.string().nullable(),\n /**\n * WHICH revision of the question the console read — the clarification's round, the parked run's\n * suspension ref. An answer must echo it: a run that has moved on to another question refuses an\n * answer written for the previous one (#1584, #1581) instead of applying it to the wrong question.\n * NULL for kinds that have no revision.\n */\n revision: z.string().nullable(),\n /** The questions to answer, in order. */\n fields: z.array(CreationConsole_QuestionField_Schema),\n /** What an answer may do for THIS item — empty when the console cannot answer it. */\n actions: z.array(z.enum(CreationConsoleAnswerAction)),\n /*\n * Facts that change what answering MEANS, for the reader to weigh first. Carried as facts rather\n * than as a sentence: the words belong to whoever renders them (`display-text-comes-from-i18n.md`).\n */\n /** The family a suspended run was producing when it stopped to ask. */\n producingFamily: z.string().nullable(),\n /** The suspended run was a dry run: answering it writes nothing. NULL for other kinds. */\n dryRun: z.boolean().nullable(),\n /** FALSE when the parked coding run cannot re-enter its own session, so an answer starts a new one. NULL for other kinds. */\n resumable: z.boolean().nullable(),\n /** Every family an interview answer feeds — what goes stale when it changes. Empty for other kinds. */\n affectsFamilies: z.array(z.string()),\n /**\n * The signed-in person a clarification is ROUTED to (#1751) — whoever started its run from the workbench\n * or the conversation. Only they may answer it, and the console carries no person, so such an item has\n * no actions here: it is answered in the workbench, signed in as them. NULL when it is unrouted.\n */\n routedToUserId: z.string().nullable(),\n});\nexport type CreationConsole_Question = z.infer<typeof CreationConsole_Question_Schema>;\n\nexport const CreationConsole_QuestionQueue_Schema = z.object({\n /** When the queue was read, ISO-8601. */\n computedAt: z.string(),\n questions: z.array(CreationConsole_Question_Schema),\n});\nexport type CreationConsole_QuestionQueue = z.infer<typeof CreationConsole_QuestionQueue_Schema>;\n\n/**\n * One answer to one field. It carries its OWN author because a round is answered in one call while its\n * fields may be answered by different parties (#1658): an agent derives one from a declared fact, the\n * person decides the next. With one author per request, a mixed round either stamped the person's name\n * on the agent's derivation or was refused as incomplete — the agent answering alone could not cover the\n * judgement half, and the resume refuses a round answered in part.\n */\nexport const CreationConsole_Answer_Schema = z.object({\n ref: z.string().min(1),\n value: z.string().min(1),\n /** Who gave THIS answer; overrides the request's `answeredByRef` for this field. Same vocabulary. */\n answeredByRef: z.string().min(1).optional(),\n});\nexport type CreationConsole_Answer = z.infer<typeof CreationConsole_Answer_Schema>;\n\nexport const CreationConsole_AnswerRequest_Schema = z.object({\n questionId: z.string().min(1),\n /** The `revision` of the item as it was READ. Required for the kinds that carry one. */\n revision: z.string().min(1).nullable().optional(),\n action: z.enum(CreationConsoleAnswerAction),\n /**\n * One entry per answered field, by its `ref`. Required for `answer`, which must cover every field.\n * A clarification's `decline` may carry the fields the person DID answer and delegates only the rest\n * (#1658), so one round can mix what a person decided with what they left to the run.\n */\n answers: z.array(CreationConsole_Answer_Schema).optional(),\n /**\n * WHO answered — recorded for EVERY kind (#1658): on an interview answer in the dossier, on a\n * clarification in the committed `DECISIONS.md`, on a parked coding answer in `CODING-ANSWERS.md`.\n * The local-token plane proves only that the caller\n * is on this machine — the same trust as a git commit author, which is what accepts the answer\n * anyway (`one-source-of-truth.md` rule 7) — so `wildo` sends the workspace's git identity as\n * `git:<email>` unless told otherwise, and an agent answering on its own sends `agent:<name>`. The\n * prefix matters because the same dossier field holds the workbench's signed-in user ids: it says\n * which door an answer came through. Required for an interview answer (the dossier cannot record\n * one without it); optional for the others, which then record nothing rather than a guess.\n *\n * The DEFAULT author of every answer in the request: an answer carrying its own `answeredByRef` keeps\n * it. A parked coding question and an interview answer are one field each, so the two cannot differ.\n */\n answeredByRef: z.string().min(1).optional(),\n});\nexport type CreationConsole_AnswerRequest = z.infer<typeof CreationConsole_AnswerRequest_Schema>;\n\nexport const CreationConsole_AnswerOutcome_Schema = z.looseObject({\n questionId: z.string().min(1),\n kind: z.enum(CreationConsoleQuestionKind),\n action: z.enum(CreationConsoleAnswerAction),\n /** What the answering service returned — its own shape (a resumed run's outcome, a landed dossier file). */\n outcome: z.unknown(),\n});\nexport type CreationConsole_AnswerOutcome = z.infer<typeof CreationConsole_AnswerOutcome_Schema>;\n\n/**\n * One FEED line: a Home line (what happened, what is asked, what could come next) with the row it\n * points at attached, so a console reads a run's verdict or a dispatch's error without a second call.\n *\n * `at` is ISO-8601 here — this is a JSON contract, not a resource row.\n */\nexport const CreationConsole_FeedLine_Schema = z.object({\n lineId: z.string().min(1),\n section: z.enum(WorkbenchCreationHomeSection),\n kind: z.enum(WorkbenchCreationHomeLineKind),\n at: z.string().nullable(),\n playbookRef: z.string().nullable(),\n taskRef: z.string().nullable(),\n subject: z.string().nullable(),\n failed: z.boolean(),\n acceptable: z.boolean(),\n needsAnswers: z.boolean(),\n stuckReason: z.string().nullable(),\n targetResourceType: z.string().min(1),\n targetResourceId: z.string().min(1),\n /** The row the line points at, as the creation plane serves it. NULL when it has gone since. */\n target: z.record(z.string(), z.unknown()).nullable(),\n /** The queued question this line is about, when it is about exactly one — answer it by this id. */\n questionId: z.string().nullable(),\n});\nexport type CreationConsole_FeedLine = z.infer<typeof CreationConsole_FeedLine_Schema>;\n\nexport const CreationConsole_Feed_Schema = z.object({\n computedAt: z.string(),\n lines: z.array(CreationConsole_FeedLine_Schema),\n});\nexport type CreationConsole_Feed = z.infer<typeof CreationConsole_Feed_Schema>;\n\n/** The one identity rule, applied by the companion when it emits and when it resolves an answer. */\nexport function formatCreationConsoleQuestionId(kind: CreationConsoleQuestionKind, rowId: string): string {\n return `${kind}:${rowId}`;\n}\n\n/** The inverse of {@link formatCreationConsoleQuestionId}; `null` for anything that is not one. */\nexport function parseCreationConsoleQuestionId(questionId: string): { kind: CreationConsoleQuestionKind; rowId: string } | null {\n const separator = questionId.indexOf(':');\n if (separator <= 0 || separator === questionId.length - 1) return null;\n const kind = Object.values(CreationConsoleQuestionKind).find((candidate) => candidate === questionId.slice(0, separator));\n return kind ? { kind, rowId: questionId.slice(separator + 1) } : null;\n}\n\n/**\n * The workbench DEEP LINK (#1652): `?open=<resourceType>:<resourceId>` opens that creation-plane row\n * in the workbench's detail pane, the way clicking its Home line does. `wildo workbench open <ref>`\n * writes it; the workbench reads it once and drops it. One format, owned here, so the writer and the\n * reader cannot disagree about it.\n *\n * The FIRST `:` separates the two, because a resource type never contains one and a row id may.\n */\nexport const WORKBENCH_OPEN_DETAIL_QUERY_PARAM = 'open';\n\nexport function formatWorkbenchOpenDetailParam(resourceType: string, resourceId: string): string {\n return `${resourceType}:${resourceId}`;\n}\n\n/** The inverse of {@link formatWorkbenchOpenDetailParam}; `null` for anything that is not one. */\nexport function parseWorkbenchOpenDetailParam(value: string): { resourceType: string; resourceId: string } | null {\n const separator = value.indexOf(':');\n if (separator <= 0 || separator === value.length - 1) return null;\n return { resourceType: value.slice(0, separator), resourceId: value.slice(separator + 1) };\n}\n\n/**\n * The PULSE (#1657): a read cheap enough to poll every few seconds from a hook or a status line.\n *\n * Nothing in it is derived on request. `sequence` and `changedAt` move whenever the creation plane's\n * boards are invalidated (every mutation path ends there) or a watched board is republished;\n * `runsInFlight` is the process's own running-run count; `summary` is what the most recent FEED read\n * counted, with its instant — `null` until someone has read the feed, because computing it here would\n * make the pulse as slow as the feed. A poller compares pulses and reads the feed only when one moved.\n */\nexport const CreationConsole_PulseSummary_Schema = z.object({\n /** Lines in the ASKED section: questions waiting on the person. */\n asked: z.number().int().nonnegative(),\n /** Lines marked acceptable: finished work waiting to be committed. */\n acceptable: z.number().int().nonnegative(),\n /** SINCE lines that failed. */\n failed: z.number().int().nonnegative(),\n computedAt: z.string(),\n});\nexport type CreationConsole_PulseSummary = z.infer<typeof CreationConsole_PulseSummary_Schema>;\n\nexport const CreationConsole_Pulse_Schema = z.object({\n sequence: z.number().int().nonnegative(),\n changedAt: z.string().nullable(),\n runsInFlight: z.number().int().nonnegative(),\n summary: CreationConsole_PulseSummary_Schema.nullable(),\n});\nexport type CreationConsole_Pulse = z.infer<typeof CreationConsole_Pulse_Schema>;\n\n/** The pulse a feed's lines imply — one counting rule, used by the companion when it serves a feed. */\nexport function summarizeCreationConsoleFeed(feed: CreationConsole_Feed): CreationConsole_PulseSummary {\n return {\n asked: feed.lines.filter((line) => line.section === WorkbenchCreationHomeSection.ASKED).length,\n acceptable: feed.lines.filter((line) => line.acceptable).length,\n failed: feed.lines.filter((line) => line.section === WorkbenchCreationHomeSection.SINCE && line.failed).length,\n computedAt: feed.computedAt,\n };\n}\n\n/**\n * Where a running dev companion says it listens (#1657) — `<app>/.wildo-saas/state/companion-endpoint.json`.\n *\n * Written by the companion once its server is up, beside `companion.token`, because the one party that\n * KNOWS the address is the process listening on it. It exists for callers that must answer in\n * milliseconds — the console's per-prompt hook and its status line — which cannot afford the CLI's own\n * address resolution (it evaluates the authored infrastructure config). The record may outlive the\n * process; a caller treats a refused connection as \"not running\", never the file's presence.\n */\nexport const COMPANION_ENDPOINT_FILE_NAME = 'companion-endpoint.json';\n\nexport const CompanionEndpointRecord_Schema = z.object({\n origin: z.string().url(),\n pid: z.number().int().positive(),\n startedAt: z.string(),\n});\nexport type CompanionEndpointRecord = z.infer<typeof CompanionEndpointRecord_Schema>;\n"]}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * The application-creation CONVERSATION's identity — the surface that replaces the three-view board
3
+ * (#1454), shared for the same reason the board's is: the workbench declares the composite view,
4
+ * the companion authors its labels, and neither can see the other's source. A string literal on
5
+ * each side compiles and fails at runtime as a blank menubar item and a headless page, silently.
6
+ *
7
+ * ## What it is
8
+ *
9
+ * Paul, 2026-09-21: the workbench is "primarily a chatbot, with some elements for details that are
10
+ * displayed" beside it; what the creator must PROVIDE is kept apart from what the system is DOING;
11
+ * there is no user-facing journey in the playbook phases; and a free session is primordial. And
12
+ * 2026-09-22: no two-zone split navigation, the destinations on the menubar. So this view is the
13
+ * page: a stream and a composer, details opening OVER it as sheets, the workbench's destinations on
14
+ * the menubar. The board stays reachable as a destination until this surface covers it, then
15
+ * retires (#1454, Appendix 4, Step 9).
16
+ *
17
+ * This carries NO React and NO Node: it is a vocabulary, importable by a browser bundle and by a
18
+ * daemon at once.
19
+ */
20
+ /**
21
+ * The view's `ref` — the composite-view key, the launcher target, and the `/composite/<ref>` route.
22
+ *
23
+ * No dot, for the reason the board's ref records: both label readers split the whole path on `.`
24
+ * and walk it, so a dotted ref nests its labels one level deeper than anything expects and
25
+ * `tCompositeView` answers the empty string.
26
+ */
27
+ export declare const WORKBENCH_CREATION_CONVERSATION_VIEW_REF = "creation-conversation";
28
+ /**
29
+ * The flows-actors SYSTEM the conversation talks to — the creation assistant the companion hosts
30
+ * on the engine's conversational runtime (#1454, Step 4). Shared because the companion REGISTERS
31
+ * it and the workbench DECLARES a view on it, and neither can see the other's source: a mismatch
32
+ * would be a chat that lists no system and says `unavailable`, with nothing reporting why.
33
+ */
34
+ export declare const WORKBENCH_CREATION_CONVERSATION_SYSTEM_REF = "application-creation.conversation";
35
+ /**
36
+ * The label path the view's title and description hang off — `composite_views.<this>.title`.
37
+ * Derived by the engine's `buildApplicationViewTranslationRef` (`app.<ref>`) and restated here
38
+ * because the companion cannot import a frontend package to compute it; the workbench's own test
39
+ * asserts it against the engine's derivation.
40
+ */
41
+ export declare const WORKBENCH_CREATION_CONVERSATION_TRANSLATION_REF = "app.creation-conversation";
42
+ /**
43
+ * The full label path every word on the conversation page hangs off —
44
+ * `composite_views.app.creation-conversation`. A caller composes
45
+ * `${WORKBENCH_CREATION_CONVERSATION_LABEL_ROOT}.${block}` and reads leaves off it with `useI18n`.
46
+ */
47
+ export declare const WORKBENCH_CREATION_CONVERSATION_LABEL_ROOT = "composite_views.app.creation-conversation";
48
+ /**
49
+ * The page's copy BLOCKS — the contract between the words the page reads and the words the companion
50
+ * authors. A block added here stops the companion's label file compiling until it is authored; the
51
+ * leaves inside a block are the page's business and a leaf nobody authored renders as its own key,
52
+ * visibly (`display-text-comes-from-i18n.md`).
53
+ *
54
+ * One block per surface a reader meets, in the order they meet them.
55
+ */
56
+ export declare enum WorkbenchCreationConversationCopyBlock {
57
+ /**
58
+ * HOME: the question the page opens on ("what do you want to get done?"), the "since you were
59
+ * last here" lines, and the four outcomes (#1454, Step 3).
60
+ */
61
+ HOME = "home",
62
+ /** The thread switcher: the new-conversation affordance and how a thread's row reads. */
63
+ THREADS = "threads",
64
+ /**
65
+ * The STREAM: the assistant's name, the empty state, how a run card reads in each state
66
+ * (running, landed, cut short, waiting), the "filed under" receipt, and the pointer to a question
67
+ * asked elsewhere.
68
+ */
69
+ STREAM = "stream",
70
+ /** The COMPOSER: its placeholder, Send, and the suggestion chips above it. */
71
+ COMPOSER = "composer",
72
+ /**
73
+ * Every PLAYBOOK's words for a creator — a title and a one-line goal — keyed by its ref with dots
74
+ * replaced by `__` (`sanitizeWorkbenchCreationPlaneIdentity`), because a label leaf may not
75
+ * contain a dot: `top_down__vision-elicitation__title`, `…__goal`. The catalog's own `intent` is
76
+ * an engineering paragraph; these are the words Home and the stream use for it. A companion test
77
+ * holds the set equal to the compiled catalog (#1454, R13).
78
+ */
79
+ PLAYBOOKS = "playbooks",
80
+ /**
81
+ * The INTERVIEW: a playbook's declared questions asked one per turn, as chat, with each answer
82
+ * filed into the dossier (#1454, Step 5 — walk-through 1). Its intro line, the "filed under"
83
+ * receipt, the yes/no chips, the all-answered line and the accept-and-run affordance.
84
+ */
85
+ INTERVIEW = "interview",
86
+ /**
87
+ * The assistant's TOOLS in a creator's words — what the stream says while one runs, and what the
88
+ * approval card asks before one that costs money or commits runs. Keyed by
89
+ * {@link workbenchToolCopyLeaf}; authored per tool through {@link WorkbenchCreationConversationToolCopy},
90
+ * which is total over {@link WorkbenchCreationConversationTool}, so a tool added without its words
91
+ * stops the companion's label file compiling rather than rendering its identifier.
92
+ */
93
+ TOOLS = "tools"
94
+ }
95
+ /**
96
+ * The creation assistant's TOOLS — the function refs the companion registers and the workbench
97
+ * words (#1454). Shared for the reason every identity in this file is: the companion declares the
98
+ * tools, the workbench renders a status line and an approval card for each, and neither can see the
99
+ * other's source. Until 2026-09-24 the refs lived only in the companion, so the stream printed them
100
+ * verbatim ("Looking things up (creation_read_dossier)…") and the approval card showed the engine's
101
+ * generic tool-name-and-arguments form.
102
+ *
103
+ * The values are the model-facing names: no dot (the runtime makes a ref identifier-safe on its way
104
+ * to the model, and a ref with none survives that unchanged, so the name the browser receives on a
105
+ * tool status or an approval IS this value).
106
+ */
107
+ export declare enum WorkbenchCreationConversationTool {
108
+ /** Reads which families are landed, refused or missing, which steps can run, which tasks are ready. Free. */
109
+ READ_APPLICATION_STATE = "creation_read_application_state",
110
+ /** Reads one produced artifact so the assistant can discuss it. Free. */
111
+ READ_ARTIFACT = "creation_read_artifact",
112
+ /** Starts a playbook run in the background. Costs model calls — APPROVED first. */
113
+ RUN_PLAYBOOK = "creation_run_playbook",
114
+ /**
115
+ * Opens a separate INSTANCE of a step for one purpose (a segment, a feature), recorded in the dossier and
116
+ * committed (#1609). A decision about what the application builds — APPROVED first.
117
+ */
118
+ OPEN_PLAYBOOK_INSTANCE = "creation_open_playbook_instance",
119
+ /**
120
+ * Opens a SECONDARY LINE beside the main line (#1608): develop one feature, named and with what it is for.
121
+ * It is an opened instance of the line's entry composite, recorded and committed like one — APPROVED first.
122
+ */
123
+ OPEN_SECONDARY_LINE = "creation_open_secondary_line",
124
+ /** Reads the application's main line and the secondary lines open beside it (#1608). Free. */
125
+ READ_LINES = "creation_read_lines",
126
+ /**
127
+ * Closes a secondary line: completed, or abandoned (#1608). Recorded and committed; abandoning cancels its
128
+ * waiting runs — APPROVED first.
129
+ */
130
+ CLOSE_SECONDARY_LINE = "creation_close_secondary_line",
131
+ /**
132
+ * Opens a REFINEMENT line (#1608): refine families the application already holds, in place, named by the
133
+ * call. Its own tool because what is approved differs from a feature: WHICH families get re-derived for the
134
+ * whole application. Recorded and committed — APPROVED first.
135
+ */
136
+ OPEN_REFINEMENT_LINE = "creation_open_refinement_line",
137
+ /** Answers, declines or cancels a question a run stopped on. */
138
+ ANSWER_RUN_QUESTION = "creation_answer_run_question",
139
+ /** Researches one objective on the public web. Costs a research-agent run — APPROVED first. */
140
+ RESEARCH = "creation_research",
141
+ /** Reads a step's dossier: what is still needed from the creator. Free. */
142
+ READ_DOSSIER = "creation_read_dossier",
143
+ /** Files one answer the creator gave, in their words. Reversible, so not approved. */
144
+ RECORD_ANSWER = "creation_record_answer",
145
+ /** Adds one build task to the plan. APPROVED first — the approval is the review of the task. */
146
+ PROPOSE_BUILD_TASK = "creation_propose_build_task",
147
+ /** Says what running a task would cost and what it reads. Free. */
148
+ DESCRIBE_TASK = "creation_describe_task",
149
+ /** Runs a ready task on the coding agent. Costs a coding run — APPROVED first. */
150
+ DISPATCH_TASK = "creation_dispatch_task",
151
+ /** Commits what a finished coding run wrote. A commit — APPROVED first. */
152
+ ACCEPT_TASK = "creation_accept_task"
153
+ }
154
+ /**
155
+ * The words one tool carries. `working` is the stream's line while it runs. `askTitle` and `ask` are
156
+ * the approval card's heading and sentence, present exactly for the tools that stop for approval;
157
+ * `ask` takes `{subject}` — the playbook's title, the task's objective, or the research objective,
158
+ * resolved by the card from the call's own arguments.
159
+ */
160
+ export interface WorkbenchCreationConversationToolWords {
161
+ readonly working: string;
162
+ readonly askTitle?: string;
163
+ readonly ask?: string;
164
+ /**
165
+ * The approval sentence used INSTEAD of `ask` when the call carries the argument that changes what is
166
+ * approved (#1608): a secondary line opened with families it needs back, or one closed as abandoned. It
167
+ * takes `{subject}` and `{detail}`, the card supplying the detail from the call's arguments, so the person
168
+ * approves what is actually recorded rather than finding it behind "Show the details".
169
+ */
170
+ readonly askVariant?: string;
171
+ }
172
+ /** Every tool's words — total over the tool vocabulary, so a new tool cannot ship wordless. */
173
+ export type WorkbenchCreationConversationToolCopy = {
174
+ readonly [tool in WorkbenchCreationConversationTool]: WorkbenchCreationConversationToolWords;
175
+ };
176
+ /** The leaf one tool word lives under inside the `TOOLS` block: `<toolRef>__<word>`. */
177
+ export declare function workbenchToolCopyLeaf(tool: string, word: keyof WorkbenchCreationConversationToolWords): string;
178
+ /**
179
+ * The `TOOLS` block's flat leaves, from the per-tool words. A label leaf is a string, so the typed
180
+ * per-tool shape is authored and this flattens it; the companion's label file is the one caller.
181
+ */
182
+ export declare function flattenWorkbenchToolCopy(copy: WorkbenchCreationConversationToolCopy): Readonly<Record<string, string>>;
183
+ /**
184
+ * The playbook an UNTOUCHED application opens on, held as a conversation (decided by constraint,
185
+ * #1454): the vision interview. Read from the catalog by ref, never restated — the companion's
186
+ * playbook-words test pins that this ref is a compiled playbook, so a renamed catalog entry fails
187
+ * a test rather than opening a blank interview.
188
+ */
189
+ export declare const WORKBENCH_OPENING_INTERVIEW_PLAYBOOK_REF = "top_down.vision-elicitation";
190
+ /** The leaf a playbook's title or goal lives under, inside the `PLAYBOOKS` block. */
191
+ export declare function workbenchPlaybookCopyLeaf(playbookRef: string, word: 'title' | 'goal'): string;
192
+ /**
193
+ * The authored copy, keyed by block — the type the companion's label file satisfies. Same shape and
194
+ * same reasoning the retired board's copy type had (#1489: its blocks were re-homed per resource).
195
+ */
196
+ export type WorkbenchCreationConversationCopyLabels = {
197
+ readonly [block in WorkbenchCreationConversationCopyBlock]: Readonly<Record<string, string>>;
198
+ };
199
+ //# sourceMappingURL=workbench-creation-conversation.custom.shared.schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workbench-creation-conversation.custom.shared.schemas.d.ts","sourceRoot":"","sources":["../../../../src/workbench/workbench-creation-conversation.custom.shared.schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,wCAAwC,0BAA0B,CAAC;AAEhF;;;;;GAKG;AACH,eAAO,MAAM,0CAA0C,sCAAsC,CAAC;AAE9F;;;;;GAKG;AACH,eAAO,MAAM,+CAA+C,8BAAoD,CAAC;AAEjH;;;;GAIG;AACH,eAAO,MAAM,0CAA0C,8CAAuE,CAAC;AAE/H;;;;;;;GAOG;AACH,oBAAY,sCAAsC;IAChD;;;OAGG;IACH,IAAI,SAAS;IACb,yFAAyF;IACzF,OAAO,YAAY;IACnB;;;;OAIG;IACH,MAAM,WAAW;IACjB,8EAA8E;IAC9E,QAAQ,aAAa;IACrB;;;;;;OAMG;IACH,SAAS,cAAc;IACvB;;;;OAIG;IACH,SAAS,cAAc;IACvB;;;;;;OAMG;IACH,KAAK,UAAU;CAChB;AAED;;;;;;;;;;;GAWG;AACH,oBAAY,iCAAiC;IAC3C,6GAA6G;IAC7G,sBAAsB,oCAAoC;IAC1D,yEAAyE;IACzE,aAAa,2BAA2B;IACxC,mFAAmF;IACnF,YAAY,0BAA0B;IACtC;;;OAGG;IACH,sBAAsB,oCAAoC;IAC1D;;;OAGG;IACH,mBAAmB,iCAAiC;IACpD,8FAA8F;IAC9F,UAAU,wBAAwB;IAClC;;;OAGG;IACH,oBAAoB,kCAAkC;IACtD;;;;OAIG;IACH,oBAAoB,kCAAkC;IACtD,gEAAgE;IAChE,mBAAmB,iCAAiC;IACpD,+FAA+F;IAC/F,QAAQ,sBAAsB;IAC9B,2EAA2E;IAC3E,YAAY,0BAA0B;IACtC,sFAAsF;IACtF,aAAa,2BAA2B;IACxC,gGAAgG;IAChG,kBAAkB,gCAAgC;IAClD,mEAAmE;IACnE,aAAa,2BAA2B;IACxC,kFAAkF;IAClF,aAAa,2BAA2B;IACxC,2EAA2E;IAC3E,WAAW,yBAAyB;CACrC;AAED;;;;;GAKG;AACH,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,+FAA+F;AAC/F,MAAM,MAAM,qCAAqC,GAAG;IAClD,QAAQ,EAAE,IAAI,IAAI,iCAAiC,GAAG,sCAAsC;CAC7F,CAAC;AAEF,wFAAwF;AACxF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,sCAAsC,GAAG,MAAM,CAE9G;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,qCAAqC,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAQtH;AAED;;;;;GAKG;AACH,eAAO,MAAM,wCAAwC,gCAAgC,CAAC;AAEtF,qFAAqF;AACrF,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAE7F;AAED;;;GAGG;AACH,MAAM,MAAM,uCAAuC,GAAG;IACpD,QAAQ,EAAE,KAAK,IAAI,sCAAsC,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7F,CAAC"}