@agent-native/core 0.35.3 → 0.37.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 (80) hide show
  1. package/dist/cli/index.js +1 -1
  2. package/dist/cli/index.js.map +1 -1
  3. package/dist/cli/skills.d.ts.map +1 -1
  4. package/dist/cli/skills.js +249 -11
  5. package/dist/cli/skills.js.map +1 -1
  6. package/dist/client/AssistantChat.d.ts.map +1 -1
  7. package/dist/client/AssistantChat.js +25 -25
  8. package/dist/client/AssistantChat.js.map +1 -1
  9. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  10. package/dist/client/MultiTabAssistantChat.js +32 -15
  11. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  12. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  13. package/dist/client/agent-chat-adapter.js +68 -24
  14. package/dist/client/agent-chat-adapter.js.map +1 -1
  15. package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
  16. package/dist/client/composer/ComposerPlusMenu.js +174 -8
  17. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  18. package/dist/client/composer/PromptComposer.d.ts +2 -0
  19. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  20. package/dist/client/composer/PromptComposer.js +2 -2
  21. package/dist/client/composer/PromptComposer.js.map +1 -1
  22. package/dist/client/composer/TiptapComposer.js +1 -1
  23. package/dist/client/composer/TiptapComposer.js.map +1 -1
  24. package/dist/client/context-xray/ContextMeter.d.ts +2 -1
  25. package/dist/client/context-xray/ContextMeter.d.ts.map +1 -1
  26. package/dist/client/context-xray/ContextMeter.js +19 -25
  27. package/dist/client/context-xray/ContextMeter.js.map +1 -1
  28. package/dist/client/context-xray/ContextXRayPanel.d.ts +1 -3
  29. package/dist/client/context-xray/ContextXRayPanel.d.ts.map +1 -1
  30. package/dist/client/context-xray/ContextXRayPanel.js +27 -24
  31. package/dist/client/context-xray/ContextXRayPanel.js.map +1 -1
  32. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  33. package/dist/client/conversation/AgentConversation.js +2 -1
  34. package/dist/client/conversation/AgentConversation.js.map +1 -1
  35. package/dist/client/dynamic-suggestions.d.ts +13 -7
  36. package/dist/client/dynamic-suggestions.d.ts.map +1 -1
  37. package/dist/client/dynamic-suggestions.js +23 -12
  38. package/dist/client/dynamic-suggestions.js.map +1 -1
  39. package/dist/client/index.d.ts +1 -0
  40. package/dist/client/index.d.ts.map +1 -1
  41. package/dist/client/index.js +1 -0
  42. package/dist/client/index.js.map +1 -1
  43. package/dist/client/route-state.d.ts +116 -0
  44. package/dist/client/route-state.d.ts.map +1 -0
  45. package/dist/client/route-state.js +205 -0
  46. package/dist/client/route-state.js.map +1 -0
  47. package/dist/client/sse-event-processor.d.ts +1 -0
  48. package/dist/client/sse-event-processor.d.ts.map +1 -1
  49. package/dist/client/sse-event-processor.js +62 -15
  50. package/dist/client/sse-event-processor.js.map +1 -1
  51. package/dist/client/tool-display.d.ts +4 -0
  52. package/dist/client/tool-display.d.ts.map +1 -0
  53. package/dist/client/tool-display.js +28 -0
  54. package/dist/client/tool-display.js.map +1 -0
  55. package/dist/client/use-chat-threads.d.ts.map +1 -1
  56. package/dist/client/use-chat-threads.js +40 -31
  57. package/dist/client/use-chat-threads.js.map +1 -1
  58. package/dist/client/use-external-value.d.ts.map +1 -1
  59. package/dist/client/use-external-value.js +14 -7
  60. package/dist/client/use-external-value.js.map +1 -1
  61. package/dist/extensions/html-shell.d.ts +3 -2
  62. package/dist/extensions/html-shell.d.ts.map +1 -1
  63. package/dist/extensions/html-shell.js +12 -2
  64. package/dist/extensions/html-shell.js.map +1 -1
  65. package/dist/extensions/routes.js +2 -7
  66. package/dist/extensions/routes.js.map +1 -1
  67. package/dist/server/core-routes-plugin.js +2 -2
  68. package/dist/server/core-routes-plugin.js.map +1 -1
  69. package/dist/server/security-headers.d.ts +16 -19
  70. package/dist/server/security-headers.d.ts.map +1 -1
  71. package/dist/server/security-headers.js +24 -25
  72. package/dist/server/security-headers.js.map +1 -1
  73. package/dist/templates/default/AGENTS.md +7 -1
  74. package/dist/templates/default/app/hooks/use-navigation-state.ts +10 -76
  75. package/docs/content/context-awareness.md +90 -48
  76. package/docs/content/creating-templates.md +22 -1
  77. package/docs/content/external-agents.md +1 -1
  78. package/package.json +2 -1
  79. package/src/templates/default/AGENTS.md +7 -1
  80. package/src/templates/default/app/hooks/use-navigation-state.ts +10 -76
@@ -1 +1 @@
1
- {"version":3,"file":"MultiTabAssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAUf,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;AAc5B,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,uBAAuB,CAAC;AAioB/B,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IACzC,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA4ED,MAAM,WAAW,gCAAgC;IAC/C,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,kBAAkB,EAClB,OAAO,GAAG,UAAU,CACrB,GAAG;IACF,sCAAsC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,KAAK,CAAC,SAAS,CAAC;IAC5E,2DAA2D;IAC3D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7E,sGAAsG;IACtG,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EACpC,UAAiB,EACjB,YAAY,EACZ,aAAa,EACb,aAAqB,EACrB,MAAqD,EACrD,UAAU,EACV,mBAA0B,EAC1B,YAAY,EACZ,KAAY,EACZ,GAAG,KAAK,EACT,EAAE,0BAA0B,2CAkoD5B"}
1
+ {"version":3,"file":"MultiTabAssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/MultiTabAssistantChat.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAUf,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,oBAAoB,CAAC;AAc5B,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,uBAAuB,CAAC;AAioB/B,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IACzC,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA8ED,MAAM,WAAW,gCAAgC;IAC/C,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,+BAA+B;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,6EAA6E;IAC7E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAC3C,kBAAkB,EAClB,OAAO,GAAG,UAAU,CACrB,GAAG;IACF,sCAAsC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iDAAiD;IACjD,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,KAAK,CAAC,SAAS,CAAC;IAC5E,2DAA2D;IAC3D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7E,sGAAsG;IACtG,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EACpC,UAAiB,EACjB,YAAY,EACZ,aAAa,EACb,aAAqB,EACrB,MAAqD,EACrD,UAAU,EACV,mBAA0B,EAC1B,YAAY,EACZ,KAAY,EACZ,GAAG,KAAK,EACT,EAAE,0BAA0B,2CAqpD5B"}
@@ -281,6 +281,7 @@ function chatTabStatusFromAgentTeamStatus(status) {
281
281
  return undefined;
282
282
  return isActiveAgentTeamStatus(status) ? "running" : "completed";
283
283
  }
284
+ const STALE_THREAD_THRESHOLD_MS = 12 * 60 * 60 * 1000;
284
285
  function runToAgentTeamTabInfo(run) {
285
286
  if (run.sourceRecord?.type && run.sourceRecord.type !== "agent-team-task") {
286
287
  return null;
@@ -698,11 +699,12 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
698
699
  const threadMap = new Map(threads.map((t) => [t.id, t]));
699
700
  // Hide tabs that have had no activity for more than 12 hours. Stale tabs
700
701
  // are removed from the sidebar on load but remain accessible via history.
701
- const STALE_THRESHOLD_MS = 12 * 60 * 60 * 1000;
702
702
  const now = Date.now();
703
703
  const isStale = (id) => {
704
704
  const thread = threadMap.get(id);
705
- return thread ? now - thread.updatedAt > STALE_THRESHOLD_MS : false;
705
+ return thread
706
+ ? now - thread.updatedAt > STALE_THREAD_THRESHOLD_MS
707
+ : false;
706
708
  };
707
709
  // If the active thread is a sub-agent, switch to its parent or the most recent main thread
708
710
  if (parentMap[activeThreadId]) {
@@ -736,11 +738,22 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
736
738
  // Ensure active thread is always in open tabs.
737
739
  // Use functional update to check inside the setter — avoids race with the
738
740
  // initialization effect that may have already added the ID in the same batch.
741
+ //
742
+ // Scoped navigation can reset openTabIds from a different localStorage key
743
+ // without changing activeThreadId. Re-check after tab-list resets so the
744
+ // sidebar cannot end up with a live active thread but no mounted chat.
739
745
  useEffect(() => {
740
- if (activeThreadId) {
741
- setOpenTabIds((prev) => prev.includes(activeThreadId) ? prev : [...prev, activeThreadId]);
746
+ if (!activeThreadId || openTabIds.includes(activeThreadId))
747
+ return;
748
+ if (parentMap[activeThreadId])
749
+ return;
750
+ const activeThread = threads.find((thread) => thread.id === activeThreadId);
751
+ if (activeThread &&
752
+ Date.now() - activeThread.updatedAt > STALE_THREAD_THRESHOLD_MS) {
753
+ return;
742
754
  }
743
- }, [activeThreadId]);
755
+ setOpenTabIds((prev) => prev.includes(activeThreadId) ? prev : [...prev, activeThreadId]);
756
+ }, [activeThreadId, openTabIds, parentMap, threads]);
744
757
  // Ensure at least one tab is always open — auto-create if sidebar is empty.
745
758
  // Skipped when an active thread already exists (e.g. the hook generated an
746
759
  // optimistic id for a brand-new session); the activeThreadId effect above
@@ -1417,9 +1430,14 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
1417
1430
  switchThread(forkedId);
1418
1431
  return true;
1419
1432
  }, [forkThread, switchThread]);
1420
- // Build tabs from open thread IDs
1433
+ // Build tabs from open thread IDs. During the first thread-list fetch,
1434
+ // `activeThreadId` is seeded synchronously so the chat can mount before
1435
+ // persisted open tabs have been reconciled.
1436
+ const visibleOpenTabIds = activeThreadId && !openTabIds.includes(activeThreadId)
1437
+ ? [...openTabIds, activeThreadId]
1438
+ : openTabIds;
1421
1439
  const threadMap = new Map(threads.map((t) => [t.id, t]));
1422
- const tabs = openTabIds
1440
+ const tabs = visibleOpenTabIds
1423
1441
  .filter((id) => threadMap.has(id) || id === activeThreadId)
1424
1442
  .map((id) => {
1425
1443
  const t = threadMap.get(id);
@@ -1438,7 +1456,7 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
1438
1456
  };
1439
1457
  });
1440
1458
  // Include sub-agent tabs that aren't in threadMap yet (just created, not refreshed)
1441
- for (const id of openTabIds) {
1459
+ for (const id of visibleOpenTabIds) {
1442
1460
  if (!tabs.some((t) => t.id === id)) {
1443
1461
  tabs.push({
1444
1462
  id,
@@ -1464,13 +1482,12 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
1464
1482
  clearActiveTab,
1465
1483
  showHistory,
1466
1484
  toggleHistory: () => setShowHistory((v) => !v),
1467
- tabCount: openTabIds.length,
1485
+ tabCount: visibleOpenTabIds.length,
1468
1486
  };
1469
- // Wait for the first thread-list pass before mounting restored tabs. Saved
1470
- // localStorage ids may be empty client-only tabs or old ids from another
1471
- // deployment; rendering AssistantChat before validation causes harmless but
1472
- // noisy /threads/:id 404s during app startup.
1473
- if (isLoading) {
1487
+ // Wait for the first thread-list pass only when there is no synchronously
1488
+ // seeded active thread. Suggestion loading and thread-list reconciliation
1489
+ // should not block the chat shell from mounting.
1490
+ if (isLoading && !activeThreadId) {
1474
1491
  return (_jsx(ChatSkeleton, { header: renderHeader?.(headerProps), headerOnly: contentHidden }));
1475
1492
  }
1476
1493
  return (_jsxs("div", { className: "flex flex-1 flex-col h-full min-h-0 overflow-x-hidden", children: [_jsx("style", { dangerouslySetInnerHTML: {
@@ -1528,7 +1545,7 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
1528
1545
  }, children: _jsx(IconX, { size: 12 }) })] }, tab.id)))] }) }))] }));
1529
1546
  })()
1530
1547
  : null, _jsxs("div", { className: "relative flex-1 flex flex-col min-h-0", children: [renderOverlay ? renderOverlay(headerProps) : null, !contentHidden &&
1531
- (activeThreadScope && activeThreadId ? (_jsx(ScopeBadge, { scope: activeThreadScope, currentScope: scope, onDetach: handleDetachActiveThread, otherScopedThreads: otherScopedThreads, activeThreadId: activeThreadId, openTabIds: new Set(openTabIds), onSelectThread: openFromHistory })) : detachConfirmType ? (_jsx(DetachConfirmationBanner, {})) : null), showHistory && (_jsx(HistoryPopover, { threads: threads, openTabIds: new Set(openTabIds), activeThreadId: activeThreadId, currentScope: scope, onSelect: openFromHistory, onClose: () => setShowHistory(false), onSearch: searchThreads })), helpVisible && _jsx(HelpPopover, { onClose: () => setHelpVisible(false) }), [...new Set(openTabIds)]
1548
+ (activeThreadScope && activeThreadId ? (_jsx(ScopeBadge, { scope: activeThreadScope, currentScope: scope, onDetach: handleDetachActiveThread, otherScopedThreads: otherScopedThreads, activeThreadId: activeThreadId, openTabIds: new Set(openTabIds), onSelectThread: openFromHistory })) : detachConfirmType ? (_jsx(DetachConfirmationBanner, {})) : null), showHistory && (_jsx(HistoryPopover, { threads: threads, openTabIds: new Set(openTabIds), activeThreadId: activeThreadId, currentScope: scope, onSelect: openFromHistory, onClose: () => setShowHistory(false), onSearch: searchThreads })), helpVisible && _jsx(HelpPopover, { onClose: () => setHelpVisible(false) }), [...new Set(visibleOpenTabIds)]
1532
1549
  .filter((tabId) => tabId === activeThreadId || mountedTabsRef.current.has(tabId))
1533
1550
  .map((tabId) => {
1534
1551
  const modelSelection = resolveThreadModelSelection(tabId);