@agent-native/core 0.58.3 → 0.58.4

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 (64) hide show
  1. package/dist/agent/production-agent.d.ts +9 -0
  2. package/dist/agent/production-agent.d.ts.map +1 -1
  3. package/dist/agent/production-agent.js +80 -4
  4. package/dist/agent/production-agent.js.map +1 -1
  5. package/dist/cli/plan-local.d.ts +34 -0
  6. package/dist/cli/plan-local.d.ts.map +1 -1
  7. package/dist/cli/plan-local.js +205 -1
  8. package/dist/cli/plan-local.js.map +1 -1
  9. package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
  10. package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
  11. package/dist/cli/pr-visual-recap-workflow.js +1 -1
  12. package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
  13. package/dist/cli/recap.d.ts +5 -0
  14. package/dist/cli/recap.d.ts.map +1 -1
  15. package/dist/cli/recap.js +19 -2
  16. package/dist/cli/recap.js.map +1 -1
  17. package/dist/client/AgentPanel.d.ts +3 -1
  18. package/dist/client/AgentPanel.d.ts.map +1 -1
  19. package/dist/client/AgentPanel.js +6 -3
  20. package/dist/client/AgentPanel.js.map +1 -1
  21. package/dist/client/AssistantChat.d.ts +5 -0
  22. package/dist/client/AssistantChat.d.ts.map +1 -1
  23. package/dist/client/AssistantChat.js +141 -39
  24. package/dist/client/AssistantChat.js.map +1 -1
  25. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  26. package/dist/client/MultiTabAssistantChat.js +44 -31
  27. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  28. package/dist/client/blocks/library/diagram.d.ts.map +1 -1
  29. package/dist/client/blocks/library/diagram.js +85 -20
  30. package/dist/client/blocks/library/diagram.js.map +1 -1
  31. package/dist/client/blocks/library/tabs.d.ts.map +1 -1
  32. package/dist/client/blocks/library/tabs.js +5 -5
  33. package/dist/client/blocks/library/tabs.js.map +1 -1
  34. package/dist/client/chat/message-components.d.ts.map +1 -1
  35. package/dist/client/chat/message-components.js +13 -10
  36. package/dist/client/chat/message-components.js.map +1 -1
  37. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  38. package/dist/client/chat/run-recovery.js +3 -3
  39. package/dist/client/chat/run-recovery.js.map +1 -1
  40. package/dist/client/chat/tool-call-display.d.ts +0 -1
  41. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  42. package/dist/client/chat/tool-call-display.js +5 -2
  43. package/dist/client/chat/tool-call-display.js.map +1 -1
  44. package/dist/client/chat/widgets/DataChartRenderer.d.ts.map +1 -1
  45. package/dist/client/chat/widgets/DataChartRenderer.js +98 -21
  46. package/dist/client/chat/widgets/DataChartRenderer.js.map +1 -1
  47. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts +4 -1
  48. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
  49. package/dist/client/chat/widgets/builtin-tool-renderers.js +30 -4
  50. package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
  51. package/dist/client/composer/AgentComposerFrame.js +1 -1
  52. package/dist/client/composer/AgentComposerFrame.js.map +1 -1
  53. package/dist/server/agent-chat-plugin.d.ts +17 -0
  54. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  55. package/dist/server/agent-chat-plugin.js +6 -2
  56. package/dist/server/agent-chat-plugin.js.map +1 -1
  57. package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
  58. package/dist/sharing/actions/set-resource-visibility.js +25 -11
  59. package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
  60. package/dist/styles/agent-native.css +115 -2
  61. package/dist/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +100 -0
  62. package/docs/content/pr-visual-recap.md +2 -2
  63. package/package.json +1 -1
  64. package/src/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +100 -0
@@ -1 +1 @@
1
- {"version":3,"file":"set-resource-visibility.d.ts","sourceRoot":"","sources":["../../../src/sharing/actions/set-resource-visibility.ts"],"names":[],"mappings":";;;;;;;;AAeA,wBA2DG"}
1
+ {"version":3,"file":"set-resource-visibility.d.ts","sourceRoot":"","sources":["../../../src/sharing/actions/set-resource-visibility.ts"],"names":[],"mappings":";;;;;;;;AAeA,wBAwEG"}
@@ -23,20 +23,34 @@ export default defineAction({
23
23
  throw new ForbiddenError(`${reg.displayName} cannot be made public — share with specific people or your organization instead.`);
24
24
  }
25
25
  const access = await assertAccess(args.resourceType, args.resourceId, "admin");
26
- const beforeExtensionTargets = await getExtensionShareChangeTargets(args.resourceType, args.resourceId);
27
26
  const db = reg.getDb();
28
27
  const update = { visibility: args.visibility };
29
- const currentOrgId = resolveRegisteredAccessContext(reg, currentAccess()).orgId;
30
- // Only the resource owner may bind an org to a previously unscoped resource.
31
- // If a non-owner admin did this, the resource would adopt the admin's org
32
- // and ownerMatchesActiveScope would then lock the real owner out of their
33
- // own resource. Non-owner admins can still flip visibility once orgId is set.
34
- if (args.visibility === "org" &&
35
- currentOrgId &&
36
- !access.resource?.orgId &&
37
- access.role === "owner") {
38
- update.orgId = currentOrgId;
28
+ const rawAccess = currentAccess();
29
+ const currentOrgId = resolveRegisteredAccessContext(reg, rawAccess).orgId;
30
+ if (args.visibility === "org" && !access.resource?.orgId) {
31
+ if (!currentOrgId) {
32
+ const canKeepResourceUnscoped = !!rawAccess.orgId &&
33
+ !!reg.resolveAccessContext &&
34
+ access.role === "owner";
35
+ // Some templates intentionally normalize local single-user resources
36
+ // out of request org scope. In that mode, keep the row unbound while
37
+ // still allowing the owner to persist the visibility preference.
38
+ if (!canKeepResourceUnscoped) {
39
+ throw new ForbiddenError(`${reg.displayName} cannot be shared with your organization because no active organization is selected.`);
40
+ }
41
+ }
42
+ else {
43
+ // Only the resource owner may bind an org to a previously unscoped resource.
44
+ // If a non-owner admin did this, the resource would adopt the admin's org
45
+ // and ownerMatchesActiveScope would then lock the real owner out of their
46
+ // own resource. Non-owner admins can still flip visibility once orgId is set.
47
+ if (access.role !== "owner") {
48
+ throw new ForbiddenError(`${reg.displayName} can only be attached to an organization by its owner.`);
49
+ }
50
+ update.orgId = currentOrgId;
51
+ }
39
52
  }
53
+ const beforeExtensionTargets = await getExtensionShareChangeTargets(args.resourceType, args.resourceId);
40
54
  await db
41
55
  .update(reg.resourceTable)
42
56
  .set(update)
@@ -1 +1 @@
1
- {"version":3,"file":"set-resource-visibility.js","sourceRoot":"","sources":["../../../src/sharing/actions/set-resource-visibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EACL,YAAY,EACZ,aAAa,EACb,cAAc,EACd,8BAA8B,GAC/B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EACL,8BAA8B,EAC9B,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAE/B,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,wOAAwO;IAC1O,sEAAsE;IACtE,oEAAoE;IACpE,YAAY,EAAE,KAAK;IACnB,MAAM,EAAE;QACN,cAAc,EAAE,IAAI;KACrB;IACD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;KACjD,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAClB,MAAM,GAAG,GAAG,wBAAwB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,GAAG,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YAC9D,MAAM,IAAI,cAAc,CACtB,GAAG,GAAG,CAAC,WAAW,mFAAmF,CACtG,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,UAAU,EACf,OAAO,CACR,CAAC;QACF,MAAM,sBAAsB,GAAG,MAAM,8BAA8B,CACjE,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,UAAU,CAChB,CAAC;QACF,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,EAAS,CAAC;QAC9B,MAAM,MAAM,GAA4B,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QACxE,MAAM,YAAY,GAAG,8BAA8B,CACjD,GAAG,EACH,aAAa,EAAE,CAChB,CAAC,KAAK,CAAC;QACR,6EAA6E;QAC7E,0EAA0E;QAC1E,0EAA0E;QAC1E,8EAA8E;QAC9E,IACE,IAAI,CAAC,UAAU,KAAK,KAAK;YACzB,YAAY;YACZ,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK;YACvB,MAAM,CAAC,IAAI,KAAK,OAAO,EACvB,CAAC;YACD,MAAM,CAAC,KAAK,GAAG,YAAY,CAAC;QAC9B,CAAC;QACD,MAAM,EAAE;aACL,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;aACzB,GAAG,CAAC,MAAM,CAAC;aACX,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACpD,MAAM,2BAA2B,CAC/B,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,UAAU,EACf,sBAAsB,CACvB,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IACnD,CAAC;CACF,CAAC,CAAC","sourcesContent":["import { eq } from \"drizzle-orm\";\nimport { z } from \"zod\";\nimport { defineAction } from \"../../action.js\";\nimport {\n assertAccess,\n currentAccess,\n ForbiddenError,\n resolveRegisteredAccessContext,\n} from \"../access.js\";\nimport { requireShareableResource } from \"../registry.js\";\nimport {\n getExtensionShareChangeTargets,\n notifyExtensionShareChanged,\n} from \"./extension-change.js\";\n\nexport default defineAction({\n description:\n \"Change the coarse visibility of a shareable resource: 'private' keeps it owner-only, 'org' shares it with all members of the owner's organization, 'public' makes it accessible to anyone with the link. Owner or admin role required.\",\n // (audit H5) Visibility changes are admin-tier and can flip a private\n // resource org-wide or public. Refuse from the tools iframe bridge.\n toolCallable: false,\n mcpApp: {\n compactCatalog: true,\n },\n schema: z.object({\n resourceType: z.string(),\n resourceId: z.string(),\n visibility: z.enum([\"private\", \"org\", \"public\"]),\n }),\n run: async (args) => {\n const reg = requireShareableResource(args.resourceType);\n if (args.visibility === \"public\" && reg.allowPublic === false) {\n throw new ForbiddenError(\n `${reg.displayName} cannot be made public — share with specific people or your organization instead.`,\n );\n }\n const access = await assertAccess(\n args.resourceType,\n args.resourceId,\n \"admin\",\n );\n const beforeExtensionTargets = await getExtensionShareChangeTargets(\n args.resourceType,\n args.resourceId,\n );\n const db = reg.getDb() as any;\n const update: Record<string, unknown> = { visibility: args.visibility };\n const currentOrgId = resolveRegisteredAccessContext(\n reg,\n currentAccess(),\n ).orgId;\n // Only the resource owner may bind an org to a previously unscoped resource.\n // If a non-owner admin did this, the resource would adopt the admin's org\n // and ownerMatchesActiveScope would then lock the real owner out of their\n // own resource. Non-owner admins can still flip visibility once orgId is set.\n if (\n args.visibility === \"org\" &&\n currentOrgId &&\n !access.resource?.orgId &&\n access.role === \"owner\"\n ) {\n update.orgId = currentOrgId;\n }\n await db\n .update(reg.resourceTable)\n .set(update)\n .where(eq(reg.resourceTable.id, args.resourceId));\n await notifyExtensionShareChanged(\n args.resourceType,\n args.resourceId,\n beforeExtensionTargets,\n );\n return { ok: true, visibility: args.visibility };\n },\n});\n"]}
1
+ {"version":3,"file":"set-resource-visibility.js","sourceRoot":"","sources":["../../../src/sharing/actions/set-resource-visibility.ts"],"names":[],"mappings":"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","sourcesContent":["import { eq } from \"drizzle-orm\";\nimport { z } from \"zod\";\nimport { defineAction } from \"../../action.js\";\nimport {\n assertAccess,\n currentAccess,\n ForbiddenError,\n resolveRegisteredAccessContext,\n} from \"../access.js\";\nimport { requireShareableResource } from \"../registry.js\";\nimport {\n getExtensionShareChangeTargets,\n notifyExtensionShareChanged,\n} from \"./extension-change.js\";\n\nexport default defineAction({\n description:\n \"Change the coarse visibility of a shareable resource: 'private' keeps it owner-only, 'org' shares it with all members of the owner's organization, 'public' makes it accessible to anyone with the link. Owner or admin role required.\",\n // (audit H5) Visibility changes are admin-tier and can flip a private\n // resource org-wide or public. Refuse from the tools iframe bridge.\n toolCallable: false,\n mcpApp: {\n compactCatalog: true,\n },\n schema: z.object({\n resourceType: z.string(),\n resourceId: z.string(),\n visibility: z.enum([\"private\", \"org\", \"public\"]),\n }),\n run: async (args) => {\n const reg = requireShareableResource(args.resourceType);\n if (args.visibility === \"public\" && reg.allowPublic === false) {\n throw new ForbiddenError(\n `${reg.displayName} cannot be made public — share with specific people or your organization instead.`,\n );\n }\n const access = await assertAccess(\n args.resourceType,\n args.resourceId,\n \"admin\",\n );\n const db = reg.getDb() as any;\n const update: Record<string, unknown> = { visibility: args.visibility };\n const rawAccess = currentAccess();\n const currentOrgId = resolveRegisteredAccessContext(reg, rawAccess).orgId;\n if (args.visibility === \"org\" && !access.resource?.orgId) {\n if (!currentOrgId) {\n const canKeepResourceUnscoped =\n !!rawAccess.orgId &&\n !!reg.resolveAccessContext &&\n access.role === \"owner\";\n // Some templates intentionally normalize local single-user resources\n // out of request org scope. In that mode, keep the row unbound while\n // still allowing the owner to persist the visibility preference.\n if (!canKeepResourceUnscoped) {\n throw new ForbiddenError(\n `${reg.displayName} cannot be shared with your organization because no active organization is selected.`,\n );\n }\n } else {\n // Only the resource owner may bind an org to a previously unscoped resource.\n // If a non-owner admin did this, the resource would adopt the admin's org\n // and ownerMatchesActiveScope would then lock the real owner out of their\n // own resource. Non-owner admins can still flip visibility once orgId is set.\n if (access.role !== \"owner\") {\n throw new ForbiddenError(\n `${reg.displayName} can only be attached to an organization by its owner.`,\n );\n }\n update.orgId = currentOrgId;\n }\n }\n const beforeExtensionTargets = await getExtensionShareChangeTargets(\n args.resourceType,\n args.resourceId,\n );\n await db\n .update(reg.resourceTable)\n .set(update)\n .where(eq(reg.resourceTable.id, args.resourceId));\n await notifyExtensionShareChanged(\n args.resourceType,\n args.resourceId,\n beforeExtensionTargets,\n );\n return { ok: true, visibility: args.visibility };\n },\n});\n"]}
@@ -258,16 +258,17 @@
258
258
  min-height: 7.5rem;
259
259
  border-radius: 1rem;
260
260
  border-color: hsl(var(--border) / 0.75);
261
- background: hsl(var(--background) / 0.96);
261
+ background: hsl(var(--muted) / 0.62);
262
262
  box-shadow:
263
263
  0 18px 55px hsl(var(--foreground) / 0.08),
264
264
  0 1px 0 hsl(var(--foreground) / 0.04);
265
265
  }
266
266
 
267
267
  .agent-composer-root--hero:focus-within {
268
+ border-color: hsl(var(--ring) / 0.9);
268
269
  box-shadow:
269
270
  0 20px 60px hsl(var(--foreground) / 0.1),
270
- 0 0 0 1px hsl(var(--ring) / 0.22);
271
+ 0 1px 0 hsl(var(--foreground) / 0.04);
271
272
  }
272
273
 
273
274
  .agent-composer-root--hero [data-agent-composer-slot="editor-wrap"] {
@@ -290,6 +291,118 @@
290
291
  overflow: visible;
291
292
  }
292
293
 
294
+ .agent-thinking-indicator {
295
+ display: inline-flex;
296
+ align-items: center;
297
+ min-height: 1.125rem;
298
+ }
299
+
300
+ .agent-thinking-indicator__glyph {
301
+ display: block;
302
+ width: var(--agent-thinking-width);
303
+ height: 1.125rem;
304
+ overflow: visible;
305
+ }
306
+
307
+ .agent-thinking-indicator__base {
308
+ fill: hsl(var(--muted-foreground) / 0.48);
309
+ }
310
+
311
+ .agent-thinking-indicator__shimmer {
312
+ transform-box: fill-box;
313
+ transform-origin: left center;
314
+ will-change: transform, opacity;
315
+ animation: agent-thinking-shimmer 1.7s cubic-bezier(0.42, 0, 0.18, 1) infinite;
316
+ }
317
+
318
+ .agent-thinking-indicator__sheen-edge {
319
+ stop-color: hsl(var(--foreground));
320
+ stop-opacity: 0;
321
+ }
322
+
323
+ .agent-thinking-indicator__sheen-mid {
324
+ stop-color: hsl(var(--foreground));
325
+ stop-opacity: 0.92;
326
+ }
327
+
328
+ .agent-thinking-indicator__ellipsis-dot {
329
+ opacity: 0;
330
+ }
331
+
332
+ .agent-thinking-indicator__ellipsis-dot--1 {
333
+ animation: agent-thinking-ellipsis-one 1.35s steps(1, end) infinite;
334
+ }
335
+
336
+ .agent-thinking-indicator__ellipsis-dot--2 {
337
+ animation: agent-thinking-ellipsis-two 1.35s steps(1, end) infinite;
338
+ }
339
+
340
+ .agent-thinking-indicator__ellipsis-dot--3 {
341
+ animation: agent-thinking-ellipsis-three 1.35s steps(1, end) infinite;
342
+ }
343
+
344
+ @keyframes agent-thinking-shimmer {
345
+ 0% {
346
+ opacity: 0;
347
+ transform: translateX(-118%);
348
+ }
349
+ 22% {
350
+ opacity: 0.9;
351
+ }
352
+ 62% {
353
+ opacity: 0.9;
354
+ }
355
+ 100% {
356
+ opacity: 0;
357
+ transform: translateX(245%);
358
+ }
359
+ }
360
+
361
+ @keyframes agent-thinking-ellipsis-one {
362
+ 0%,
363
+ 24% {
364
+ opacity: 0;
365
+ }
366
+ 25%,
367
+ 100% {
368
+ opacity: 1;
369
+ }
370
+ }
371
+
372
+ @keyframes agent-thinking-ellipsis-two {
373
+ 0%,
374
+ 49% {
375
+ opacity: 0;
376
+ }
377
+ 50%,
378
+ 100% {
379
+ opacity: 1;
380
+ }
381
+ }
382
+
383
+ @keyframes agent-thinking-ellipsis-three {
384
+ 0%,
385
+ 74% {
386
+ opacity: 0;
387
+ }
388
+ 75%,
389
+ 100% {
390
+ opacity: 1;
391
+ }
392
+ }
393
+
394
+ @media (prefers-reduced-motion: reduce) {
395
+ .agent-thinking-indicator__shimmer {
396
+ animation: none;
397
+ opacity: 0;
398
+ }
399
+
400
+ .agent-thinking-indicator__ellipsis-dot {
401
+ animation: none;
402
+ opacity: 1;
403
+ }
404
+ }
405
+
293
406
  @media (prefers-reduced-motion: no-preference) {
294
407
  @supports (view-transition-name: agent-native-chat) {
295
408
  .agent-native-chat-view-transition {
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: visual-answer
3
+ description: >-
4
+ Answer code/product questions as visual Plan artifacts using repo, bridge, or
5
+ GitHub context; use for API specs, UI look, schema models, and architecture.
6
+ metadata:
7
+ visibility: exported
8
+ ---
9
+
10
+ # Visual Answer
11
+
12
+ `/visual-answer` turns a specific code or product question into a published
13
+ Agent-Native Plan artifact. It is for questions that need a visual, inspectable
14
+ answer rather than a chat paragraph: API contracts, schema/data models, UI
15
+ states, component behavior, architecture flows, and code evidence.
16
+
17
+ ## When To Use
18
+
19
+ Use this skill when the user asks:
20
+
21
+ - "what is the API spec for this?"
22
+ - "what does this UI look like?"
23
+ - "what is the schema model for x?"
24
+ - "draw the flow for this code path"
25
+ - "show me the current shape of this component/API/data model"
26
+
27
+ For history questions about what changed or shipped, search merged PR recaps
28
+ first with `search-pr-recaps`, then pull a relevant hit into the conversation
29
+ with `show-visual-plan` (it renders that plan or recap's blocks inline). Reach
30
+ for `get-visual-plan` only when you need the full bundle/MDX to edit, not to
31
+ display. Use `visual-answer` when the current codebase, a local bridge, or
32
+ GitHub source needs to be inspected to produce a new answer.
33
+
34
+ ## Workflow
35
+
36
+ 1. Inspect the real source first. Use the host agent's repo tools, the Plan
37
+ local bridge, or GitHub/source links. Do not invent endpoints, schema fields,
38
+ UI states, file names, or behavior.
39
+ 2. Call `get-plan-blocks` before authoring. Use the live registry, not memory.
40
+ If the question asks what components are available, call
41
+ `list-plan-components`.
42
+ 3. Pick the evidence blocks:
43
+ - API shape: `openapi-spec` plus `api-endpoint`; use before/after only when
44
+ comparing historical changes from recaps.
45
+ - UI look: `wireframe` or a `columns` before/after pair when comparing a
46
+ recap.
47
+ - Schema/data model: `data-model`, optionally with `diagram`.
48
+ - Code evidence: `file-tree`, `tabs`, `annotated-code`, and `diff` when the
49
+ answer depends on implementation details.
50
+ 4. Publish with the Plan `visual-answer` action. Include the user's question,
51
+ `repoPath`/`sourceUrl` when known, a concise title/brief, and MDX source
52
+ under `mdx`.
53
+ 5. In Agent-Native chat the published answer renders inline automatically — its
54
+ blocks appear in the conversation. Add a one-line summary of the evidence plus
55
+ the deep link; do not paste raw MDX or block source as text. (In terminal or
56
+ external MCP hosts that cannot render the blocks, return the URL.)
57
+
58
+ ## Terminal Handoff
59
+
60
+ When running from a terminal or coding-agent shell, write
61
+ `visual-answer-source.json`:
62
+
63
+ ```json
64
+ {
65
+ "question": "What is the billing API shape?",
66
+ "title": "Billing API visual answer",
67
+ "brief": "Shows the request and response contract.",
68
+ "repoPath": "owner/repo",
69
+ "sourceUrl": "https://github.com/owner/repo",
70
+ "mdx": {
71
+ "plan.mdx": "---\ntitle: Billing API visual answer\n---\n\n..."
72
+ }
73
+ }
74
+ ```
75
+
76
+ Then publish:
77
+
78
+ ```sh
79
+ agent-native plan visual-answer publish --question "What is the billing API shape?" --source visual-answer-source.json --repo owner/repo
80
+ ```
81
+
82
+ Use `--source-url` for a GitHub file/PR/commit/issue URL, `--prev-plan-id` to
83
+ refresh an existing answer, and `--visibility private` for owner-only output.
84
+ The command writes `visual-answer-url.txt`.
85
+
86
+ ## Don't
87
+
88
+ - Do not use `visual-answer` for a plain implementation plan; use
89
+ `visual-plan`.
90
+ - Do not use it for a PR diff recap; use `visual-recap`.
91
+ - Do not skip code inspection and infer from names alone.
92
+ - Do not publish screenshots, secrets, credential-looking values, or private
93
+ source excerpts beyond what the user has asked to visualize.
94
+
95
+ ## Related Skills
96
+
97
+ - `visual-plan`
98
+ - `visual-recap`
99
+ - `delegate-to-agent`
100
+ - `context-awareness`
@@ -308,7 +308,7 @@ name: PR Visual Recap
308
308
 
309
309
  on:
310
310
  pull_request:
311
- types: [opened, synchronize, reopened, ready_for_review]
311
+ types: [opened, synchronize, reopened, ready_for_review, closed]
312
312
 
313
313
  jobs:
314
314
  visual-recap:
@@ -360,7 +360,7 @@ The `cli-version` input controls which `@agent-native/core` CLI version runs ins
360
360
 
361
361
  ### workflow_call event context
362
362
 
363
- `workflow_call` workflows inherit the **caller's** event context. The reusable workflow uses `github.event.pull_request.*` expressions to read the PR number, head SHA, base SHA, and PR metadata — these work correctly only when the caller triggers on `pull_request`. The caller snippet above already includes the correct event types.
363
+ `workflow_call` workflows inherit the **caller's** event context. The reusable workflow uses `github.event.pull_request.*` expressions to read the PR number, head SHA, base SHA, merge timestamp, and PR metadata — these work correctly only when the caller triggers on `pull_request`. The caller snippet above already includes the correct event types. The `closed` event is included so merged PR recaps can be stamped with `merged_at` and later searched as shipped work.
364
364
 
365
365
  Do not trigger the caller on `workflow_dispatch` or `push` — those events do not carry a `pull_request` payload, and the gate will skip the recap with "no pull_request payload".
366
366
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.58.3",
3
+ "version": "0.58.4",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=22"
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: visual-answer
3
+ description: >-
4
+ Answer code/product questions as visual Plan artifacts using repo, bridge, or
5
+ GitHub context; use for API specs, UI look, schema models, and architecture.
6
+ metadata:
7
+ visibility: exported
8
+ ---
9
+
10
+ # Visual Answer
11
+
12
+ `/visual-answer` turns a specific code or product question into a published
13
+ Agent-Native Plan artifact. It is for questions that need a visual, inspectable
14
+ answer rather than a chat paragraph: API contracts, schema/data models, UI
15
+ states, component behavior, architecture flows, and code evidence.
16
+
17
+ ## When To Use
18
+
19
+ Use this skill when the user asks:
20
+
21
+ - "what is the API spec for this?"
22
+ - "what does this UI look like?"
23
+ - "what is the schema model for x?"
24
+ - "draw the flow for this code path"
25
+ - "show me the current shape of this component/API/data model"
26
+
27
+ For history questions about what changed or shipped, search merged PR recaps
28
+ first with `search-pr-recaps`, then pull a relevant hit into the conversation
29
+ with `show-visual-plan` (it renders that plan or recap's blocks inline). Reach
30
+ for `get-visual-plan` only when you need the full bundle/MDX to edit, not to
31
+ display. Use `visual-answer` when the current codebase, a local bridge, or
32
+ GitHub source needs to be inspected to produce a new answer.
33
+
34
+ ## Workflow
35
+
36
+ 1. Inspect the real source first. Use the host agent's repo tools, the Plan
37
+ local bridge, or GitHub/source links. Do not invent endpoints, schema fields,
38
+ UI states, file names, or behavior.
39
+ 2. Call `get-plan-blocks` before authoring. Use the live registry, not memory.
40
+ If the question asks what components are available, call
41
+ `list-plan-components`.
42
+ 3. Pick the evidence blocks:
43
+ - API shape: `openapi-spec` plus `api-endpoint`; use before/after only when
44
+ comparing historical changes from recaps.
45
+ - UI look: `wireframe` or a `columns` before/after pair when comparing a
46
+ recap.
47
+ - Schema/data model: `data-model`, optionally with `diagram`.
48
+ - Code evidence: `file-tree`, `tabs`, `annotated-code`, and `diff` when the
49
+ answer depends on implementation details.
50
+ 4. Publish with the Plan `visual-answer` action. Include the user's question,
51
+ `repoPath`/`sourceUrl` when known, a concise title/brief, and MDX source
52
+ under `mdx`.
53
+ 5. In Agent-Native chat the published answer renders inline automatically — its
54
+ blocks appear in the conversation. Add a one-line summary of the evidence plus
55
+ the deep link; do not paste raw MDX or block source as text. (In terminal or
56
+ external MCP hosts that cannot render the blocks, return the URL.)
57
+
58
+ ## Terminal Handoff
59
+
60
+ When running from a terminal or coding-agent shell, write
61
+ `visual-answer-source.json`:
62
+
63
+ ```json
64
+ {
65
+ "question": "What is the billing API shape?",
66
+ "title": "Billing API visual answer",
67
+ "brief": "Shows the request and response contract.",
68
+ "repoPath": "owner/repo",
69
+ "sourceUrl": "https://github.com/owner/repo",
70
+ "mdx": {
71
+ "plan.mdx": "---\ntitle: Billing API visual answer\n---\n\n..."
72
+ }
73
+ }
74
+ ```
75
+
76
+ Then publish:
77
+
78
+ ```sh
79
+ agent-native plan visual-answer publish --question "What is the billing API shape?" --source visual-answer-source.json --repo owner/repo
80
+ ```
81
+
82
+ Use `--source-url` for a GitHub file/PR/commit/issue URL, `--prev-plan-id` to
83
+ refresh an existing answer, and `--visibility private` for owner-only output.
84
+ The command writes `visual-answer-url.txt`.
85
+
86
+ ## Don't
87
+
88
+ - Do not use `visual-answer` for a plain implementation plan; use
89
+ `visual-plan`.
90
+ - Do not use it for a PR diff recap; use `visual-recap`.
91
+ - Do not skip code inspection and infer from names alone.
92
+ - Do not publish screenshots, secrets, credential-looking values, or private
93
+ source excerpts beyond what the user has asked to visualize.
94
+
95
+ ## Related Skills
96
+
97
+ - `visual-plan`
98
+ - `visual-recap`
99
+ - `delegate-to-agent`
100
+ - `context-awareness`