create-agdf 0.31.0 → 0.32.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 (121) hide show
  1. package/generated/.opencode/agdf-interaction-locales.json +148 -4
  2. package/generated/plugins/agdf/.claude-plugin/plugin.json +1 -1
  3. package/generated/plugins/agdf/.codex-plugin/plugin.json +1 -1
  4. package/generated/plugins/agdf/companion/events.mjs +5 -3
  5. package/generated/plugins/agdf/companion/figure.mjs +241 -110
  6. package/generated/plugins/agdf/companion/localization.mjs +5 -0
  7. package/generated/plugins/agdf/companion/notice.mjs +10 -2
  8. package/generated/plugins/agdf/companion/register.mjs +90 -32
  9. package/generated/plugins/agdf/companion/run-state.mjs +13 -1
  10. package/generated/plugins/agdf/companion/view.mjs +149 -19
  11. package/generated/plugins/agdf/mcp/server/package.json +2 -2
  12. package/generated/plugins/agdf/mcp/server/src/generation-runtime.js +6 -4
  13. package/generated/plugins/agdf/mcp/server/src/generation.js +8 -2
  14. package/generated/plugins/agdf/mcp/server/src/main.js +4 -1
  15. package/generated/plugins/agdf/mcp/server/src/server.js +19 -5
  16. package/generated/plugins/agdf/mcp/server/ui/cockpit.html +130 -33
  17. package/generated/plugins/agdf/mcp/server/ui/decision-manifest.json +3 -3
  18. package/generated/plugins/agdf/mcp/server/ui/decision.html +3 -3
  19. package/generated/plugins/agdf/mcp/server/ui/manifest.json +3 -3
  20. package/generated/plugins/agdf/meta/agdf-interaction-locales.json +148 -4
  21. package/generated/plugins/agdf/meta/agdf-mcp-capability.json +1 -1
  22. package/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
  23. package/generated/plugins/agdf/meta/copilot-payload-baseline.json +3 -3
  24. package/generated/plugins/agdf/meta/distribution-profile-history.json +7 -0
  25. package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-interaction-locales.json +148 -4
  26. package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
  27. package/generated/plugins/agdf/runtime/create-agdf/lib/mcp-dispatch-runtime.js +4 -1
  28. package/generated/plugins/agdf/runtime/create-agdf/lib/mcp-worker-runtime.js +77 -77
  29. package/generated/plugins/agdf/runtime/create-agdf/package.json +1 -1
  30. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/companion/events.js +4 -1
  31. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/companion/figure-state.js +6 -4
  32. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/companion/journal.js +6 -0
  33. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/companion/run-view.js +54 -11
  34. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/decision-content-placeholder.js +4 -1
  35. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/gate-check.js +5 -1
  36. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/cockpit-list.js +10 -8
  37. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/cockpit-session.js +11 -3
  38. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/cockpit-work.js +4 -2
  39. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/cockpit.js +43 -13
  40. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/work-situation.js +25 -0
  41. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-read/cockpit-worker.js +1 -0
  42. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-create-command.js +6 -1
  43. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-inventory-reader.js +50 -3
  44. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-inventory.js +12 -27
  45. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-presentation-render.js +29 -0
  46. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-title.js +43 -0
  47. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/interaction-catalog-validation.js +2 -1
  48. package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/interaction-presentation.js +5 -9
  49. package/generated/plugins/agdf/runtime/runtime-manifest.json +2 -2
  50. package/generated/plugins/agdf/submission/openai/availability.md +1 -1
  51. package/generated/plugins/agdf/submission/openai/capability-matrix.json +1 -1
  52. package/generated/plugins/agdf/submission/openai/release-notes.md +5 -8
  53. package/generated/plugins/agdf/submission/openai/reviewer-cases.json +1 -1
  54. package/generated/plugins/agdf-planning/.codex-plugin/plugin.json +1 -1
  55. package/generated/plugins/agdf-planning/plugin.json +1 -1
  56. package/generated/plugins/copilot/agdf/.agdf-payload-inventory.json +76 -58
  57. package/generated/plugins/copilot/agdf/mcp/server/package.json +2 -2
  58. package/generated/plugins/copilot/agdf/mcp/server/src/generation-runtime.js +6 -4
  59. package/generated/plugins/copilot/agdf/mcp/server/src/generation.js +8 -2
  60. package/generated/plugins/copilot/agdf/mcp/server/src/main.js +4 -1
  61. package/generated/plugins/copilot/agdf/mcp/server/src/server.js +19 -5
  62. package/generated/plugins/copilot/agdf/meta/agdf-plugin.definition.json +1 -1
  63. package/generated/plugins/copilot/agdf/meta/distribution-profile-history.json +7 -0
  64. package/generated/plugins/copilot/agdf/plugin.json +1 -1
  65. package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-interaction-locales.json +148 -4
  66. package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
  67. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/mcp-dispatch-runtime.js +4 -1
  68. package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/mcp-worker-runtime.js +62 -62
  69. package/generated/plugins/copilot/agdf/runtime/create-agdf/package.json +1 -1
  70. package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/companion/events.js +4 -1
  71. package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/companion/figure-state.js +6 -4
  72. package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/companion/journal.js +6 -0
  73. package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/companion/run-view.js +54 -11
  74. package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/decision-content-placeholder.js +4 -1
  75. package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/gate-check.js +5 -1
  76. package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/work-situation.js +25 -0
  77. package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-create-command.js +6 -1
  78. package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-inventory-reader.js +50 -3
  79. package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-inventory.js +12 -27
  80. package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-presentation-render.js +29 -0
  81. package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-title.js +43 -0
  82. package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/interaction-catalog-validation.js +2 -1
  83. package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/interaction-presentation.js +5 -9
  84. package/generated/plugins/copilot/agdf/runtime/runtime-manifest.json +2 -2
  85. package/generated/plugins/copilot/agdf/skills/agdf-interaction-locales.json +1 -1
  86. package/generated/submissions/openai/agdf/.codex-plugin/plugin.json +1 -1
  87. package/generated/submissions/openai/agdf/meta/agdf-interaction-locales.json +148 -4
  88. package/generated/submissions/openai/agdf/meta/agdf-plugin.definition.json +1 -1
  89. package/generated/submissions/openai/agdf/meta/copilot-payload-baseline.json +3 -3
  90. package/generated/submissions/openai/agdf/meta/distribution-profile-history.json +7 -0
  91. package/generated/submissions/openai/agdf/plugin.json +1 -1
  92. package/generated/submissions/openai/agdf/submission/openai/availability.md +1 -1
  93. package/generated/submissions/openai/agdf/submission/openai/capability-matrix.json +1 -1
  94. package/generated/submissions/openai/agdf/submission/openai/inventory.json +13 -13
  95. package/generated/submissions/openai/agdf/submission/openai/listing.json +1 -1
  96. package/generated/submissions/openai/agdf/submission/openai/readiness.json +2 -2
  97. package/generated/submissions/openai/agdf/submission/openai/readiness.md +2 -2
  98. package/generated/submissions/openai/agdf/submission/openai/release-notes.md +5 -8
  99. package/generated/submissions/openai/agdf/submission/openai/reviewer-cases.json +1 -1
  100. package/lib/mcp-dispatch-runtime.js +4 -1
  101. package/lib/mcp-worker-runtime.js +77 -77
  102. package/package.json +1 -1
  103. package/runtime/core/lib/companion/events.js +4 -1
  104. package/runtime/core/lib/companion/figure-state.js +6 -4
  105. package/runtime/core/lib/companion/journal.js +6 -0
  106. package/runtime/core/lib/companion/run-view.js +54 -11
  107. package/runtime/core/lib/control-evaluation/decision-content-placeholder.js +4 -1
  108. package/runtime/core/lib/control-evaluation/gate-check.js +5 -1
  109. package/runtime/core/lib/control-inspect/cockpit-list.js +10 -8
  110. package/runtime/core/lib/control-inspect/cockpit-session.js +11 -3
  111. package/runtime/core/lib/control-inspect/cockpit-work.js +4 -2
  112. package/runtime/core/lib/control-inspect/cockpit.js +43 -13
  113. package/runtime/core/lib/control-inspect/work-situation.js +25 -0
  114. package/runtime/core/lib/control-read/cockpit-worker.js +1 -0
  115. package/runtime/core/lib/control-state/run-create-command.js +6 -1
  116. package/runtime/core/lib/control-state/run-inventory-reader.js +50 -3
  117. package/runtime/core/lib/control-state/run-inventory.js +12 -27
  118. package/runtime/core/lib/control-state/run-presentation-render.js +29 -0
  119. package/runtime/core/lib/control-state/run-title.js +43 -0
  120. package/runtime/core/lib/interaction-catalog-validation.js +2 -1
  121. package/runtime/core/lib/interaction-presentation.js +5 -9
@@ -15,7 +15,7 @@ export function startGenerationRuntime({ epoch, generation, channel }) {
15
15
  // Companion events (SD SDD-006): this generation executed the call, so it journals the final result
16
16
  // once, before the result leaves; a failing journal never changes or delays the result.
17
17
  function journal(name, args, projected) {
18
- try { runtime.observeOutcome?.(name, args, projected); } catch { /* notification only */ }
18
+ try { return runtime.observeOutcome?.(name, args, projected) === true; } catch { return false; /* notification only */ }
19
19
  }
20
20
  function send(input, kind, payload) {
21
21
  const reply = generationMessage(epoch, generation, kind, payload, {}, input.original_operation_id, input.request_id);
@@ -41,6 +41,7 @@ export function startGenerationRuntime({ epoch, generation, channel }) {
41
41
  runtime = await createMcpDecisionRuntime({ runtime, ui });
42
42
  }
43
43
  if (runtime.ui) uiDigest = loadCockpitResource(runtime.ui).digest;
44
+ if (runtime.mode === 'cockpit' && uiDigest) runtime.bindResourceIdentity({ digest: uiDigest, version: inspected.expectedVersion });
44
45
  // Inspect reports package-owned immutable identities, not caller evidence.
45
46
  sdkDigest = inspected.generationIdentity.sdk_digest; serverDigest = inspected.generationIdentity.server_digest;
46
47
  executor = runtime.mode === 'cockpit' ? null : createAgdfWorkerExecutor(runtime, { releaseOwnedLock: releaseAbandonedOwnedLock });
@@ -68,7 +69,7 @@ export function startGenerationRuntime({ epoch, generation, channel }) {
68
69
  ++inflight;
69
70
  const parentOwned = typeof tool.parentOwned === 'function' ? tool.parentOwned(args) : tool.parentOwned;
70
71
  const started = performance.now();
71
- let result, phase = parentOwned || !executor ? 'parse' : 'execute';
72
+ let result, journaled = false, phase = parentOwned || !executor ? 'parse' : 'execute';
72
73
  try {
73
74
  phase = 'parse';
74
75
  args = runtime.prepareInput?.(name, args) ?? args;
@@ -82,13 +83,14 @@ export function startGenerationRuntime({ epoch, generation, channel }) {
82
83
  if (name === 'agdf_inspect' && args.operation === 'operation-status' && result.report?.status === 'recorded'
83
84
  && (result.report.receipt?.operation_id ?? result.report.receipt?.operation?.operation_id) === args.module.split('/').at(-1)) unknown.delete(args.module.split('/').at(-1));
84
85
  const projected = runtime.projectToolResult(name, args, result);
85
- journal(name, args, projected);
86
+ journaled = journal(name, args, projected);
86
87
  send(input, 'result', projected);
87
88
  } catch (error) {
88
89
  const facts = runtime.normalizeFailure(error, { phase });
89
90
  if (input.original_operation_id && facts.dispatch !== 'not_dispatched') unknown.add(input.original_operation_id);
90
91
  const projected = runtime.projectToolResult(name, args, runtime.failure(facts.code, name, args, { ...facts, elapsed_ms: performance.now() - started }), facts);
91
- journal(name, args, projected);
92
+ // One call leaves at most one event: a failure after its result left an event adds none.
93
+ if (!journaled) journal(name, args, projected);
92
94
  send(input, 'result', projected);
93
95
  } finally { --inflight; }
94
96
  }
@@ -211,8 +211,9 @@ export async function createOwnedGenerationFacade({ runtime, publisher, createCo
211
211
  operations.set(key, row);
212
212
  }
213
213
  ++row.inflight; event(row, 'invoke', name);
214
+ let replied;
214
215
  try {
215
- const result = (await request(row, 'invoke', { name, arguments: args }, actualContext, canonical ? args.operation_id : null, invokeMs)).payload;
216
+ const result = replied = (await request(row, 'invoke', { name, arguments: args }, actualContext, canonical ? args.operation_id : null, invokeMs)).payload;
216
217
  if (canonical && result.outcome === 'effect_unknown') row.unknown.add(key);
217
218
  if (name === 'agdf_inspect' && args.operation === 'operation-status' && result.report?.status === 'recorded'
218
219
  && (result.report.receipt?.operation_id ?? result.report.receipt?.operation?.operation_id) === id) row.unknown.delete(key);
@@ -228,7 +229,12 @@ export async function createOwnedGenerationFacade({ runtime, publisher, createCo
228
229
  }
229
230
  }
230
231
  return result;
231
- } catch (error) { if (canonical && error.dispatch !== 'not_dispatched') row.unknown.add(key); throw error; }
232
+ } catch (error) {
233
+ // The generation journaled the reply it sent; a failure raised here afterwards carries it, so the
234
+ // server adds no second companion event for the same call.
235
+ if (replied && error && typeof error === 'object') error.generationResult = replied;
236
+ if (canonical && error.dispatch !== 'not_dispatched') row.unknown.add(key); throw error;
237
+ }
232
238
  finally { --row.inflight; if (closed && !row.inflight && !row.unknown.size) void retire(row, true); }
233
239
  }
234
240
  current = await reserve(publisher.initial, {}); current.state = 'current'; event(current, 'admitted');
@@ -41,7 +41,10 @@ export async function runMcpServer({ surface, cockpitDir, cockpitMode, runtime,
41
41
  runtime = thin ? await dispatcherRuntime.createMcpDecisionTransportRuntime({ runtime, ui })
42
42
  : await dispatcherRuntime.createMcpDecisionRuntime({ runtime, ui });
43
43
  }
44
- if (runtime.mode === 'cockpit') loadCockpitResource(runtime.ui);
44
+ if (runtime.mode === 'cockpit') {
45
+ const resource = loadCockpitResource(runtime.ui);
46
+ runtime.bindResourceIdentity?.({ digest: resource.digest, version: serverVersion });
47
+ }
45
48
  let transport;
46
49
  if (ownedPublication) {
47
50
  const { createOwnedGenerationFacade } = await import('./generation.js');
@@ -156,7 +156,12 @@ export function buildAgdfServer({ runtime, executor, era, preparedCallStore } =
156
156
  const journaling = () => !runtime.requiresProjectedResult && typeof runtime.observeOutcome === 'function';
157
157
  const journalingFailures = () => typeof runtime.observeOutcome === 'function';
158
158
  const journal = (name, input, projected) => {
159
- try { runtime.observeOutcome(name, input, projected); } catch { /* notification only */ }
159
+ try { return runtime.observeOutcome(name, input, projected) === true; } catch { return false; /* notification only */ }
160
+ };
161
+ // Whether a result the generation returned left an event there (it journals what it produces).
162
+ const generationJournaled = (name, input, result) => {
163
+ if (!runtime.requiresProjectedResult || !result) return false;
164
+ try { return runtime.observesOutcome?.(name, input, result) === true; } catch { return false; }
160
165
  };
161
166
  const uiAllowed = (context) => !gated || requestDeclaresMcpAppUi(server.server, context, runtime.ui.mimeType);
162
167
  const supportsUi = context => !!runtime.ui && requestDeclaresMcpAppUi(server.server, context, runtime.ui.mimeType);
@@ -217,6 +222,8 @@ export function buildAgdfServer({ runtime, executor, era, preparedCallStore } =
217
222
  }
218
223
  let parentOwned;
219
224
  let phase = 'parse';
225
+ // Whether this call's result already left a companion event (written here or by its generation).
226
+ let journaled = false;
220
227
  try {
221
228
  phase = 'parse';
222
229
  argumentsValue = preparedCalls.resolve(name, argumentsValue);
@@ -228,8 +235,12 @@ export function buildAgdfServer({ runtime, executor, era, preparedCallStore } =
228
235
  const parsed = tool.parse(argumentsValue); phase = 'execute';
229
236
  result = await tool.execute(parsed, context.signal,
230
237
  { client: requestMcpClientInfo(server.server, context), uiSupported: supportsUi(context) });
231
- } else result = await dispatchExecutor.execute(argumentsValue, { signal: context.signal, toolName: name,
232
- trusted: runtime.prepareDispatch?.(name, argumentsValue) });
238
+ } else {
239
+ result = await dispatchExecutor.execute(argumentsValue, { signal: context.signal, toolName: name,
240
+ trusted: runtime.prepareDispatch?.(name, argumentsValue) });
241
+ }
242
+ // Behind the facade the generation journaled the result it returned.
243
+ journaled = generationJournaled(name, argumentsValue, result);
233
244
  if (runtime.postprocessToolResult) result = await runtime.postprocessToolResult(name, argumentsValue, result,
234
245
  { uiSupported: supportsUi(context), client: requestMcpClientInfo(server.server, context) });
235
246
  // Validate the producer and its canonical domain before consuming any
@@ -237,10 +248,12 @@ export function buildAgdfServer({ runtime, executor, era, preparedCallStore } =
237
248
  const checked = Object.hasOwn(result._meta ?? {}, 'agdf/tool-result') || runtime.requiresProjectedResult ? result
238
249
  : runtime.projectToolResult(name, argumentsValue, result);
239
250
  const { domain } = consume(name, checked);
240
- if (journaling()) journal(name, argumentsValue, checked);
251
+ if (journaling()) journaled = journal(name, argumentsValue, checked);
241
252
  const continued = await nextRead(domain, context);
242
253
  return respond(name, argumentsValue, checked, serialize ?? runtime.serialize, context, undefined, continued.next_read);
243
254
  } catch (error) {
255
+ // A facade failure raised after its generation had replied carries that reply.
256
+ journaled ||= generationJournaled(name, argumentsValue, error?.generationResult);
244
257
  const facts = runtime.normalizeFailure(error, { phase });
245
258
  const help = phase === 'parse' ? preparedCalls.validationHint(name, argumentsValue) : '';
246
259
  const failure = { ...runtime.failure(facts.code, name, argumentsValue, { ...facts, elapsed_ms: performance.now() - started }),
@@ -248,7 +261,8 @@ export function buildAgdfServer({ runtime, executor, era, preparedCallStore } =
248
261
  // A local execution/delivery failure is owned here, including malformed
249
262
  // producer output. It never causes re-execution or a second write.
250
263
  const projected = runtime.projectToolResult(name, argumentsValue, failure, facts);
251
- if (journalingFailures()) journal(name, argumentsValue, projected);
264
+ // One call leaves at most one event: a failure after its result left an event adds none.
265
+ if (journalingFailures() && !journaled) journal(name, argumentsValue, projected);
252
266
  return respond(name, argumentsValue, projected, serialize ?? runtime.serialize, context, facts);
253
267
  }
254
268
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "id": "agdf",
4
- "version": "0.31.0",
4
+ "version": "0.32.0",
5
5
  "planning": {
6
6
  "schema": "planned-ur-v1",
7
7
  "protocol_version": 1,
@@ -162,6 +162,13 @@
162
162
  "profile_id": "runtime-plugin",
163
163
  "entry_digest": "d3a3b0a1fc9e3312cb8a9437a4acf8ba99a563b2dab665b38feec8e2257e4f23",
164
164
  "status": "supported"
165
+ },
166
+ "0.32.0": {
167
+ "contract_id": "five-profile-v1",
168
+ "provenance_schema_version": 1,
169
+ "profile_id": "runtime-plugin",
170
+ "entry_digest": "de32d75f665191ff8aebe1a4186f6e156164a3394c968640f109a6c5d58b0cb7",
171
+ "status": "supported"
165
172
  }
166
173
  }
167
174
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "agdf",
4
- "version": "0.31.0",
4
+ "version": "0.32.0",
5
5
  "description": "Control layer for governed AI-assisted delivery.",
6
6
  "author": {
7
7
  "name": "Arndt Gold",
@@ -1379,7 +1379,12 @@
1379
1379
  "moreRuns": "+ {count} more",
1380
1380
  "position": "{position} of {count} open runs",
1381
1381
  "events": "Events",
1382
- "material": "Material"
1382
+ "material": "Material",
1383
+ "newRun": "New run",
1384
+ "gatePurpose": "What this gate decides",
1385
+ "checkedFolder": "Checked project folder",
1386
+ "finding": "Finding",
1387
+ "step": "Step {position} of {count}"
1383
1388
  },
1384
1389
  "actions": {
1385
1390
  "retry": "Read again",
@@ -1391,6 +1396,8 @@
1391
1396
  "soundOff": "Sound off",
1392
1397
  "expand": "More",
1393
1398
  "collapse": "Less",
1399
+ "infoShow": "ⓘ Details",
1400
+ "infoHide": "ⓘ Hide details",
1394
1401
  "previous": "Previous run",
1395
1402
  "next": "Next run",
1396
1403
  "about": "About",
@@ -1426,6 +1433,7 @@
1426
1433
  "blockiert": "blocked",
1427
1434
  "fertig": "done",
1428
1435
  "bereit": "idle",
1436
+ "notSetUp": "not set up",
1429
1437
  "unreadable": "unreadable"
1430
1438
  },
1431
1439
  "reasons": {
@@ -1438,8 +1446,67 @@
1438
1446
  "building": "In progress: {gate}",
1439
1447
  "ended": "Run ended",
1440
1448
  "idle": "No run shown",
1449
+ "completionUnconfirmed": "Completion not confirmed",
1441
1450
  "unreadable": "Run not readable: {reason}"
1442
1451
  },
1452
+ "routes": {
1453
+ "quick_task": "Compact Delivery",
1454
+ "verified_change": "Verified Change",
1455
+ "structured": "Structured delivery",
1456
+ "undecided": "Delivery path open"
1457
+ },
1458
+ "activity": {
1459
+ "draft": {
1460
+ "working": "drafting the {gate}",
1461
+ "idle": "{gate} draft is next"
1462
+ },
1463
+ "analysis": {
1464
+ "working": "analysing the existing system",
1465
+ "idle": "System analysis is next"
1466
+ },
1467
+ "route": {
1468
+ "working": "choosing the delivery path",
1469
+ "idle": "Delivery path is next"
1470
+ },
1471
+ "build": {
1472
+ "working": "building and testing",
1473
+ "idle": "Implementation is next"
1474
+ },
1475
+ "review": {
1476
+ "working": "reviewing the code",
1477
+ "idle": "Code review is next"
1478
+ },
1479
+ "quality": {
1480
+ "working": "checking the quality",
1481
+ "idle": "Quality check is next"
1482
+ },
1483
+ "acceptance": {
1484
+ "working": "preparing the acceptance",
1485
+ "idle": "Acceptance is next"
1486
+ },
1487
+ "closeout": {
1488
+ "working": "closing out",
1489
+ "idle": "Closeout is next"
1490
+ },
1491
+ "other": {
1492
+ "working": "working on: {step}",
1493
+ "idle": "{step} is next"
1494
+ }
1495
+ },
1496
+ "turn": {
1497
+ "you": "Your turn",
1498
+ "claude": "Claude is working",
1499
+ "blocked": "Blocked",
1500
+ "approve": "Approve {gate}",
1501
+ "decide": "Decide: {gate}",
1502
+ "inChat": "In the chat with “{approval}”",
1503
+ "moment": "One moment",
1504
+ "next": "Up next",
1505
+ "drafting": "I'm preparing a draft for you: {step}",
1506
+ "workingOn": "I'm working on it: {step}",
1507
+ "draft": "Draft: {step}",
1508
+ "resume": "Tell me in the chat when I should carry on."
1509
+ },
1443
1510
  "unreadable": {
1444
1511
  "missing": "run state file missing or not readable",
1445
1512
  "too_large": "run state file too large",
@@ -1459,8 +1526,13 @@
1459
1526
  "messages": {
1460
1527
  "reading": "Reading run state …",
1461
1528
  "noControl": "No AGDF control folder in “{folder}”.",
1462
- "noControlHint": "Checked project folder: {path}",
1529
+ "notSetUp": "AGDF isn't set up in this project yet.",
1530
+ "notSetUpHint": "Tell me in the chat if you'd like to use AGDF here – I'll set it up with you.",
1463
1531
  "noOpenRuns": "No open runs in this project.",
1532
+ "allRunsDone": "All runs across the line. 🏁",
1533
+ "allRunsDoneHint": "What's next? Just tell me in the chat.",
1534
+ "noRunsYet": "Starting grid empty.",
1535
+ "noRunsYetHint": "Tell me in the chat what you have in mind – I'll get the first run ready.",
1464
1536
  "noRunAssigned": "No run assigned",
1465
1537
  "noRunAssignedHint": "No run changed in this session. Choose an open run to show it here.",
1466
1538
  "unreadable": "Run state not readable: {reason}",
@@ -2858,7 +2930,12 @@
2858
2930
  "moreRuns": "+ {count} weitere",
2859
2931
  "position": "{position} von {count} offenen Runs",
2860
2932
  "events": "Ereignisse",
2861
- "material": "Material"
2933
+ "material": "Material",
2934
+ "newRun": "Neues Vorhaben",
2935
+ "gatePurpose": "Wozu dieses Gate da ist",
2936
+ "checkedFolder": "Geprüfter Projektordner",
2937
+ "finding": "Befund",
2938
+ "step": "Schritt {position} von {count}"
2862
2939
  },
2863
2940
  "actions": {
2864
2941
  "retry": "Neu lesen",
@@ -2870,6 +2947,8 @@
2870
2947
  "soundOff": "Ton aus",
2871
2948
  "expand": "Mehr",
2872
2949
  "collapse": "Weniger",
2950
+ "infoShow": "ⓘ Details",
2951
+ "infoHide": "ⓘ Details ausblenden",
2873
2952
  "previous": "Vorheriger Run",
2874
2953
  "next": "Nächster Run",
2875
2954
  "about": "About",
@@ -2905,6 +2984,7 @@
2905
2984
  "blockiert": "blockiert",
2906
2985
  "fertig": "fertig",
2907
2986
  "bereit": "bereit",
2987
+ "notSetUp": "nicht eingerichtet",
2908
2988
  "unreadable": "nicht lesbar"
2909
2989
  },
2910
2990
  "reasons": {
@@ -2917,8 +2997,67 @@
2917
2997
  "building": "In Arbeit: {gate}",
2918
2998
  "ended": "Run beendet",
2919
2999
  "idle": "Kein Run angezeigt",
3000
+ "completionUnconfirmed": "Abschluss nicht bestätigt",
2920
3001
  "unreadable": "Run nicht lesbar: {reason}"
2921
3002
  },
3003
+ "routes": {
3004
+ "quick_task": "Compact Delivery",
3005
+ "verified_change": "Verified Change",
3006
+ "structured": "Strukturierte Lieferung",
3007
+ "undecided": "Lieferweg noch offen"
3008
+ },
3009
+ "activity": {
3010
+ "draft": {
3011
+ "working": "schreibt am {gate}-Entwurf",
3012
+ "idle": "{gate}-Entwurf steht an"
3013
+ },
3014
+ "analysis": {
3015
+ "working": "analysiert den Bestand",
3016
+ "idle": "Bestandsanalyse steht an"
3017
+ },
3018
+ "route": {
3019
+ "working": "wählt den Lieferweg",
3020
+ "idle": "Lieferweg steht an"
3021
+ },
3022
+ "build": {
3023
+ "working": "baut und testet",
3024
+ "idle": "Umsetzung steht an"
3025
+ },
3026
+ "review": {
3027
+ "working": "prüft den Code",
3028
+ "idle": "Code-Prüfung steht an"
3029
+ },
3030
+ "quality": {
3031
+ "working": "prüft die Qualität",
3032
+ "idle": "Qualitätsprüfung steht an"
3033
+ },
3034
+ "acceptance": {
3035
+ "working": "bereitet die Abnahme vor",
3036
+ "idle": "Abnahme steht an"
3037
+ },
3038
+ "closeout": {
3039
+ "working": "schließt ab",
3040
+ "idle": "Abschluss steht an"
3041
+ },
3042
+ "other": {
3043
+ "working": "arbeitet an: {step}",
3044
+ "idle": "{step} steht an"
3045
+ }
3046
+ },
3047
+ "turn": {
3048
+ "you": "Du bist dran",
3049
+ "claude": "Claude arbeitet",
3050
+ "blocked": "Blockiert",
3051
+ "approve": "{gate} freigeben",
3052
+ "decide": "Entscheidung treffen: {gate}",
3053
+ "inChat": "Im Chat mit „{approval}“",
3054
+ "moment": "Einen Augenblick",
3055
+ "next": "Als Nächstes",
3056
+ "drafting": "Ich bereite einen Entwurf für dich vor: {step}",
3057
+ "workingOn": "Ich arbeite gerade daran: {step}",
3058
+ "draft": "Entwurf: {step}",
3059
+ "resume": "Sag mir im Chat, wenn ich weitermachen soll."
3060
+ },
2922
3061
  "unreadable": {
2923
3062
  "missing": "Run-Datei fehlt oder ist nicht lesbar",
2924
3063
  "too_large": "Run-Datei ist zu groß",
@@ -2938,8 +3077,13 @@
2938
3077
  "messages": {
2939
3078
  "reading": "Run-Status wird gelesen …",
2940
3079
  "noControl": "Kein AGDF-Kontrollordner in „{folder}“.",
2941
- "noControlHint": "Geprüfter Projektordner: {path}",
3080
+ "notSetUp": "AGDF ist in diesem Projekt noch nicht eingerichtet.",
3081
+ "notSetUpHint": "Sag mir im Chat, wenn du AGDF hier nutzen möchtest – ich richte es mit dir ein.",
2942
3082
  "noOpenRuns": "Keine offenen Runs in diesem Projekt.",
3083
+ "allRunsDone": "Alle Runs im Ziel. 🏁",
3084
+ "allRunsDoneHint": "Was steht als Nächstes an? Sag's mir im Chat.",
3085
+ "noRunsYet": "Startaufstellung leer.",
3086
+ "noRunsYetHint": "Erzähl mir im Chat, was du vorhast – ich mach den ersten Run startklar.",
2943
3087
  "noRunAssigned": "Kein Run zugeordnet",
2944
3088
  "noRunAssignedHint": "In dieser Sitzung hat sich kein Run geändert. Wähle einen offenen Run, um ihn hier zu zeigen.",
2945
3089
  "unreadable": "Run-Status nicht lesbar: {reason}",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "id": "agdf",
4
- "version": "0.31.0",
4
+ "version": "0.32.0",
5
5
  "planning": {
6
6
  "schema": "planned-ur-v1",
7
7
  "protocol_version": 1,
@@ -44,7 +44,7 @@ export async function createMcpCockpitRuntime({ surface, cockpitDir, cockpitMode
44
44
  import("#agdf-core/control-inspect/cockpit-session.js"),
45
45
  import("#agdf-core/control-read/snapshot.js"),
46
46
  ]);
47
- const session = createCockpitSessionService(root, { pluginMode });
47
+ const session = createCockpitSessionService(root, { pluginMode, integrationSurface: surface });
48
48
  const renderDefinition = pluginMode ? COCKPIT_PLUGIN_RENDER_DEFINITION : COCKPIT_RENDER_DEFINITION;
49
49
  const tools = [
50
50
  { name: renderDefinition.name, definition: renderDefinition,
@@ -54,6 +54,7 @@ export async function createMcpCockpitRuntime({ surface, cockpitDir, cockpitMode
54
54
  ];
55
55
  // Claude Code renders no MCP app UI today; its cockpit stays hidden until a client declares support.
56
56
  return Object.freeze({ ...errorSupport(true), mode: 'cockpit', definition: renderDefinition, tools,
57
+ bindResourceIdentity: identity => session.bindResourceIdentity(identity),
57
58
  producerIdentity: inspected.generationIdentity ?? null,
58
59
  uiCapabilityRequired: pluginMode || surface === 'claude', responseLimit: READ_LIMITS.response,
59
60
  ...(pluginMode ? { unsupportedUiCode: 'host_ui_unsupported' } : {}),
@@ -106,6 +107,7 @@ export function createMcpDispatchRuntime({ surface, inspected = inspectMcpDispat
106
107
  readBudget,
107
108
  delivery,
108
109
  observeOutcome: (name, input, result) => journal.observe(name, input, result),
110
+ observesOutcome: (name, input, result) => journal.observes(name, input, result),
109
111
  async postprocessToolResult(name, input, result) {
110
112
  const configuration = protocol.configurationProjection(input);
111
113
  if (configuration && name === 'agdf_inspect' && result.report) result = { ...result, report: { ...result.report, effective_configuration: configuration } };
@@ -142,6 +144,7 @@ export async function createMcpDecisionRuntime({ runtime, ui, appOnlyMediationQu
142
144
  action: (input, host) => session.action(input, host), close: () => session.close() });
143
145
  return Object.freeze({ ...protocol,
144
146
  observeOutcome: (name, input, result) => runtime.observeOutcome?.(name, input, result) ?? false,
147
+ observesOutcome: (name, input, result) => runtime.observesOutcome?.(name, input, result) ?? false,
145
148
  async postprocessToolResult(name, input, result, { uiSupported, client } = {}) {
146
149
  if (name === 'agdf_inspect' && input.operation === 'native-qualification' && result.report?.available) {
147
150
  return { ...result, report: { ...result.report, ui_rendering_support: uiSupported ? 'supported' : 'unsupported',