@particle-academy/agent-integrations 0.8.0 → 0.9.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 (131) hide show
  1. package/dist/bridges/artboard.d.cts +3 -3
  2. package/dist/bridges/artboard.d.ts +3 -3
  3. package/dist/bridges/charts.d.cts +3 -3
  4. package/dist/bridges/charts.d.ts +3 -3
  5. package/dist/bridges/code.d.cts +3 -3
  6. package/dist/bridges/code.d.ts +3 -3
  7. package/dist/bridges/flow.d.cts +3 -3
  8. package/dist/bridges/flow.d.ts +3 -3
  9. package/dist/bridges/forms.d.cts +3 -3
  10. package/dist/bridges/forms.d.ts +3 -3
  11. package/dist/bridges/scene.d.cts +3 -3
  12. package/dist/bridges/scene.d.ts +3 -3
  13. package/dist/bridges/screens.d.cts +3 -3
  14. package/dist/bridges/screens.d.ts +3 -3
  15. package/dist/bridges/sheets.d.cts +3 -3
  16. package/dist/bridges/sheets.d.ts +3 -3
  17. package/dist/bridges/slides.d.cts +3 -3
  18. package/dist/bridges/slides.d.ts +3 -3
  19. package/dist/bridges/whiteboard.d.cts +3 -3
  20. package/dist/bridges/whiteboard.d.ts +3 -3
  21. package/dist/bridges-artboard.cjs +15 -54
  22. package/dist/bridges-artboard.cjs.map +1 -1
  23. package/dist/bridges-artboard.js +3 -3
  24. package/dist/bridges-charts.cjs +3 -5
  25. package/dist/bridges-charts.cjs.map +1 -1
  26. package/dist/bridges-charts.js +3 -3
  27. package/dist/bridges-code.cjs +3 -5
  28. package/dist/bridges-code.cjs.map +1 -1
  29. package/dist/bridges-code.js +3 -3
  30. package/dist/bridges-flow.cjs +3 -5
  31. package/dist/bridges-flow.cjs.map +1 -1
  32. package/dist/bridges-flow.js +2 -2
  33. package/dist/bridges-forms.cjs +3 -5
  34. package/dist/bridges-forms.cjs.map +1 -1
  35. package/dist/bridges-forms.js +3 -3
  36. package/dist/bridges-scene.cjs +3 -5
  37. package/dist/bridges-scene.cjs.map +1 -1
  38. package/dist/bridges-scene.js +3 -3
  39. package/dist/bridges-screens.cjs +3 -5
  40. package/dist/bridges-screens.cjs.map +1 -1
  41. package/dist/bridges-screens.js +3 -3
  42. package/dist/bridges-sheets.cjs +3 -5
  43. package/dist/bridges-sheets.cjs.map +1 -1
  44. package/dist/bridges-sheets.js +3 -3
  45. package/dist/bridges-slides.cjs +2 -5
  46. package/dist/bridges-slides.cjs.map +1 -1
  47. package/dist/bridges-slides.js +3 -3
  48. package/dist/bridges-whiteboard.cjs +10 -49
  49. package/dist/bridges-whiteboard.cjs.map +1 -1
  50. package/dist/bridges-whiteboard.js +4 -4
  51. package/dist/{chunk-3KSZNGNW.js → chunk-3QJSOS7G.js} +4 -4
  52. package/dist/{chunk-3KSZNGNW.js.map → chunk-3QJSOS7G.js.map} +1 -1
  53. package/dist/{chunk-4BL5M3U3.js → chunk-5AD35HS5.js} +3 -3
  54. package/dist/{chunk-4BL5M3U3.js.map → chunk-5AD35HS5.js.map} +1 -1
  55. package/dist/chunk-C3TYI5TJ.js +3 -0
  56. package/dist/chunk-C3TYI5TJ.js.map +1 -0
  57. package/dist/{chunk-57ZDHD53.js → chunk-CKK4QKD2.js} +3 -3
  58. package/dist/{chunk-57ZDHD53.js.map → chunk-CKK4QKD2.js.map} +1 -1
  59. package/dist/{chunk-LVQXIUJH.js → chunk-CPNOF4HI.js} +3 -3
  60. package/dist/{chunk-LVQXIUJH.js.map → chunk-CPNOF4HI.js.map} +1 -1
  61. package/dist/{chunk-HSTW7ZNO.js → chunk-FYGMFIY5.js} +3 -3
  62. package/dist/{chunk-HSTW7ZNO.js.map → chunk-FYGMFIY5.js.map} +1 -1
  63. package/dist/{chunk-RGO42EQ6.js → chunk-GHY3PBPN.js} +3 -3
  64. package/dist/{chunk-RGO42EQ6.js.map → chunk-GHY3PBPN.js.map} +1 -1
  65. package/dist/{chunk-IANI25IT.js → chunk-GSVVIT2O.js} +3 -3
  66. package/dist/{chunk-IANI25IT.js.map → chunk-GSVVIT2O.js.map} +1 -1
  67. package/dist/{chunk-ZHAK2DQR.js → chunk-J5KYPEYB.js} +3 -3
  68. package/dist/{chunk-ZHAK2DQR.js.map → chunk-J5KYPEYB.js.map} +1 -1
  69. package/dist/{chunk-5XELJIJR.js → chunk-KHKSQEMC.js} +3 -3
  70. package/dist/{chunk-5XELJIJR.js.map → chunk-KHKSQEMC.js.map} +1 -1
  71. package/dist/{chunk-GQ7XXK7G.js → chunk-KJ5AOOV7.js} +5 -46
  72. package/dist/chunk-KJ5AOOV7.js.map +1 -0
  73. package/dist/{chunk-KABXGJJ4.js → chunk-R5OA26MJ.js} +3 -3
  74. package/dist/{chunk-KABXGJJ4.js.map → chunk-R5OA26MJ.js.map} +1 -1
  75. package/dist/{chunk-NTDZWGYB.js → chunk-SJ7H242B.js} +3 -3
  76. package/dist/{chunk-NTDZWGYB.js.map → chunk-SJ7H242B.js.map} +1 -1
  77. package/dist/{chunk-X66JWQBB.js → chunk-UCKJAUBY.js} +3 -3
  78. package/dist/{chunk-X66JWQBB.js.map → chunk-UCKJAUBY.js.map} +1 -1
  79. package/dist/{chunk-52S7XYZK.js → chunk-ULJL53DL.js} +3 -3
  80. package/dist/{chunk-52S7XYZK.js.map → chunk-ULJL53DL.js.map} +1 -1
  81. package/dist/{chunk-XRAJSOPS.js → chunk-VUMFO2UW.js} +3 -3
  82. package/dist/{chunk-XRAJSOPS.js.map → chunk-VUMFO2UW.js.map} +1 -1
  83. package/dist/components/SharedWhiteboard/index.d.cts +3 -3
  84. package/dist/components/SharedWhiteboard/index.d.ts +3 -3
  85. package/dist/components-shared-whiteboard.cjs +13 -79
  86. package/dist/components-shared-whiteboard.cjs.map +1 -1
  87. package/dist/components-shared-whiteboard.js +6 -6
  88. package/dist/index.cjs +60 -102
  89. package/dist/index.cjs.map +1 -1
  90. package/dist/index.d.cts +16 -15
  91. package/dist/index.d.ts +16 -15
  92. package/dist/index.js +17 -17
  93. package/dist/mcp/index.d.cts +5 -5
  94. package/dist/mcp/index.d.ts +5 -5
  95. package/dist/presence/index.d.cts +10 -64
  96. package/dist/presence/index.d.ts +10 -64
  97. package/dist/presence.cjs +21 -37
  98. package/dist/presence.cjs.map +1 -1
  99. package/dist/presence.js +3 -3
  100. package/dist/registry-TFWVXQOU.js +3 -0
  101. package/dist/{registry-2DRURS6U.js.map → registry-TFWVXQOU.js.map} +1 -1
  102. package/dist/{server-C2OpfPEo.d.cts → server-BsSwfemr.d.cts} +3 -3
  103. package/dist/{server-CKAqFTyc.d.ts → server-Du3-IGqM.d.ts} +3 -3
  104. package/dist/sharing/index.d.cts +4 -4
  105. package/dist/sharing/index.d.ts +4 -4
  106. package/dist/sharing.cjs +6 -34
  107. package/dist/sharing.cjs.map +1 -1
  108. package/dist/sharing.js +1 -1
  109. package/dist/sheets-adapter.cjs +2 -9
  110. package/dist/sheets-adapter.cjs.map +1 -1
  111. package/dist/sheets-adapter.d.cts +3 -3
  112. package/dist/sheets-adapter.d.ts +3 -3
  113. package/dist/sheets-adapter.js +2 -2
  114. package/dist/{token-C1O22GxJ.d.ts → token-CrJF76oH.d.cts} +1 -1
  115. package/dist/{token-C1O22GxJ.d.cts → token-CrJF76oH.d.ts} +1 -1
  116. package/dist/{tool-host-CX3WFXgh.d.cts → tool-host-BQuUygLF.d.cts} +1 -1
  117. package/dist/{tool-host-DldwGNqR.d.ts → tool-host-C8JMMGYq.d.ts} +1 -1
  118. package/dist/{types-Cq5u8MJ8.d.cts → types-CCSBGW9T.d.cts} +1 -1
  119. package/dist/{types-DyaHnqNC.d.ts → types-DIVNcIQO.d.ts} +1 -1
  120. package/dist/{types-C2zdUpzn.d.cts → types-aOQLTW0E.d.cts} +1 -1
  121. package/dist/{types-C2zdUpzn.d.ts → types-aOQLTW0E.d.ts} +1 -1
  122. package/dist/undo/index.d.cts +6 -43
  123. package/dist/undo/index.d.ts +6 -43
  124. package/dist/undo.cjs +31 -53
  125. package/dist/undo.cjs.map +1 -1
  126. package/dist/undo.js +2 -2
  127. package/package.json +5 -2
  128. package/dist/chunk-GQ7XXK7G.js.map +0 -1
  129. package/dist/chunk-JU2N4KK6.js +0 -34
  130. package/dist/chunk-JU2N4KK6.js.map +0 -1
  131. package/dist/registry-2DRURS6U.js +0 -3
package/dist/index.d.cts CHANGED
@@ -1,9 +1,9 @@
1
- import { a as MicroMcpServer } from './server-C2OpfPEo.cjs';
2
- export { M as McpServerOptions, T as Transport, e as errorResult, r as rpcError, t as textResult } from './server-C2OpfPEo.cjs';
3
- export { T as ToolHost, a as ToolRegistry } from './tool-host-CX3WFXgh.cjs';
1
+ import { M as MicroMcpServer } from './server-BsSwfemr.cjs';
2
+ export { a as McpServerOptions, T as Transport, e as errorResult, r as rpcError, t as textResult } from './server-BsSwfemr.cjs';
3
+ export { T as ToolHost, a as ToolRegistry } from './tool-host-BQuUygLF.cjs';
4
4
  export { InProcessTransport, RelayChannel, RelayTransport, attachInProcess, attachRelay } from './mcp/index.cjs';
5
- export { C as CallToolResult, a as ContentBlock, I as InitializeResult, f as JsonObject, i as JsonRpcMessage, j as JsonRpcNotification, k as JsonRpcRequest, m as JsonValue, M as MCP_PROTOCOL_VERSION, S as ServerCapabilities, n as ServerInfo, T as ToolDefinition, o as ToolHandler } from './types-C2zdUpzn.cjs';
6
- export { B as Bridge, a as BridgeFactory } from './types-Cq5u8MJ8.cjs';
5
+ export { C as CallToolResult, d as ContentBlock, I as InitializeResult, c as JsonObject, J as JsonRpcMessage, e as JsonRpcNotification, f as JsonRpcRequest, g as JsonValue, M as MCP_PROTOCOL_VERSION, a as ServerCapabilities, S as ServerInfo, T as ToolDefinition, b as ToolHandler } from './types-aOQLTW0E.cjs';
6
+ export { B as Bridge, a as BridgeFactory } from './types-CCSBGW9T.cjs';
7
7
  import { FormFieldDescriptor } from './bridges/forms.cjs';
8
8
  export { FormBridgeAdapter, FormBridgeOptions, registerFormBridge } from './bridges/forms.cjs';
9
9
  export { SheetsBridgeAdapter, SheetsBridgeOptions, registerSheetsBridge } from './bridges/sheets.cjs';
@@ -13,12 +13,13 @@ export { ChartsBridgeAdapter, ChartsBridgeOptions, registerChartsBridge } from '
13
13
  export { SceneBridgeAdapter, SceneBridgeOptions, SceneCamera, SceneObject, SceneObjectKind, SceneState, registerSceneBridge } from './bridges/scene.cjs';
14
14
  export { ScreenSnapshot, ScreensBridgeAdapter, ScreensBridgeOptions, registerScreensBridge } from './bridges/screens.cjs';
15
15
  export { SlidesBridgeAdapter, SlidesBridgeOptions, registerSlidesBridge } from './bridges/slides.cjs';
16
- import * as react_jsx_runtime from 'react/jsx-runtime';
16
+ import * as react from 'react';
17
17
  import { ReactNode, CSSProperties } from 'react';
18
- import { S as SessionDescriptor } from './token-C1O22GxJ.cjs';
19
- export { b as buildShareConfig, a as buildShareUrl, d as createSessionDescriptor, e as describeSession, r as readSessionFromUrl } from './token-C1O22GxJ.cjs';
20
- export { ActivityAgent, ActivityFilter, ActivityResolverContext, ActivityTargetResolver, ToolHandler as ActivityWrappedHandler, AgentActivityEvent, AgentActivityListener, AgentTarget, AgentTargetKind, emitActivity, onActivity, readActivityHistory, resetActivityRegistry, useAgentActivity, useAgentActivityForScreen, wrapToolWithActivity } from './presence/index.cjs';
21
- export { UndoEntry, UndoToolsOptions, clearStack as clearUndoStack, ensureUndoToolsRegistered, pushUndoEntry, readHistory as readUndoHistory, redoOne, registerUndoTools, resetAllUndoStacks, undoOne, useUndoStack } from './undo/index.cjs';
18
+ import { S as SessionDescriptor } from './token-CrJF76oH.cjs';
19
+ export { b as buildShareConfig, a as buildShareUrl, c as createSessionDescriptor, d as describeSession, r as readSessionFromUrl } from './token-CrJF76oH.cjs';
20
+ export { ActivityFilter, AutoActivityEvent as AgentActivityEvent, AutoActivityListener as AgentActivityListener, AutoTarget as AgentTarget, AutoTargetKind as AgentTargetKind, UndoEntry, clearStack as clearUndoStack, emitActivity, onActivity, pushUndoEntry, readActivityHistory, readHistory as readUndoHistory, redoOne, resetActivityRegistry, resetAllUndoStacks, undoOne } from '@particle-academy/fancy-auto-common';
21
+ export { ActivityAgent, ActivityResolverContext, ActivityTargetResolver, ToolHandler as ActivityWrappedHandler, useAgentActivity, useAgentActivityForScreen, wrapToolWithActivity } from './presence/index.cjs';
22
+ export { UndoToolsOptions, ensureUndoToolsRegistered, registerUndoTools, useUndoStack } from './undo/index.cjs';
22
23
  export { RelayState, SseRelayOptions, SseRelayTransport, attachSseRelay } from './sharing/index.cjs';
23
24
  import '@particle-academy/fancy-slides';
24
25
 
@@ -57,7 +58,7 @@ type AgentPanelProps = {
57
58
  * and an optional input composer. Pure presentational: hosts feed it the
58
59
  * activity stream from their own state (typically the MCP transport log).
59
60
  */
60
- declare function AgentPanel({ agent, activity, onSubmit, busy, actions, className, style }: AgentPanelProps): react_jsx_runtime.JSX.Element;
61
+ declare function AgentPanel({ agent, activity, onSubmit, busy, actions, className, style }: AgentPanelProps): react.JSX.Element;
61
62
 
62
63
  type AgentCursorProps = {
63
64
  x: number;
@@ -74,7 +75,7 @@ type AgentCursorProps = {
74
75
  * (or alongside) a fancy-whiteboard <Board> at screen coords matching
75
76
  * the agent's reported position.
76
77
  */
77
- declare function AgentCursor({ x, y, name, color, status, className, style }: AgentCursorProps): react_jsx_runtime.JSX.Element;
78
+ declare function AgentCursor({ x, y, name, color, status, className, style }: AgentCursorProps): react.JSX.Element;
78
79
 
79
80
  type AgentActivityHighlightProps = {
80
81
  /** Bounds of the highlighted item in the parent's coord system. */
@@ -96,7 +97,7 @@ type AgentActivityHighlightProps = {
96
97
  * item the agent just touched. Position the parent so this can be placed
97
98
  * absolutely matching the item's bounds.
98
99
  */
99
- declare function AgentActivityHighlight({ x, y, width, height, pulseKey, color, duration, className, style, }: AgentActivityHighlightProps): react_jsx_runtime.JSX.Element | null;
100
+ declare function AgentActivityHighlight({ x, y, width, height, pulseKey, color, duration, className, style, }: AgentActivityHighlightProps): react.JSX.Element | null;
100
101
 
101
102
  type BridgedFormProps = {
102
103
  /** Stable id for this form. Used by agents in `form_*` tool calls. */
@@ -142,7 +143,7 @@ type BridgedFormProps = {
142
143
  *
143
144
  * Agents can then call form_describe, form_set_value, form_submit, etc.
144
145
  */
145
- declare function BridgedForm({ id, title, screenId, fields, values, onChange, onSubmit, server, agent, children, }: BridgedFormProps): react_jsx_runtime.JSX.Element;
146
+ declare function BridgedForm({ id, title, screenId, fields, values, onChange, onSubmit, server, agent, children, }: BridgedFormProps): react.JSX.Element;
146
147
 
147
148
  /**
148
149
  * Loose shape of the fancy-screens system context — kept here so this
@@ -197,6 +198,6 @@ type ShareControlsProps = {
197
198
  * ShareControls — the host-facing UI for turning sharing on/off and
198
199
  * surfacing the resulting connection details (URL / JSON / cURL).
199
200
  */
200
- declare function ShareControls({ session, onStart, onStop, status, shareBaseUrl, className, style, }: ShareControlsProps): react_jsx_runtime.JSX.Element;
201
+ declare function ShareControls({ session, onStart, onStop, status, shareBaseUrl, className, style, }: ShareControlsProps): react.JSX.Element;
201
202
 
202
203
  export { type AgentActivity, AgentActivityHighlight, type AgentActivityHighlightProps, AgentCursor, type AgentCursorProps, AgentPanel, type AgentPanelProps, BridgedForm, type BridgedFormProps, FormFieldDescriptor, MicroMcpServer, ScreensActivityBridge, type ScreensActivityBridgeProps, SessionDescriptor, ShareControls, type ShareControlsProps };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
- import { a as MicroMcpServer } from './server-CKAqFTyc.js';
2
- export { M as McpServerOptions, T as Transport, e as errorResult, r as rpcError, t as textResult } from './server-CKAqFTyc.js';
3
- export { T as ToolHost, a as ToolRegistry } from './tool-host-DldwGNqR.js';
1
+ import { M as MicroMcpServer } from './server-Du3-IGqM.js';
2
+ export { a as McpServerOptions, T as Transport, e as errorResult, r as rpcError, t as textResult } from './server-Du3-IGqM.js';
3
+ export { T as ToolHost, a as ToolRegistry } from './tool-host-C8JMMGYq.js';
4
4
  export { InProcessTransport, RelayChannel, RelayTransport, attachInProcess, attachRelay } from './mcp/index.js';
5
- export { C as CallToolResult, a as ContentBlock, I as InitializeResult, f as JsonObject, i as JsonRpcMessage, j as JsonRpcNotification, k as JsonRpcRequest, m as JsonValue, M as MCP_PROTOCOL_VERSION, S as ServerCapabilities, n as ServerInfo, T as ToolDefinition, o as ToolHandler } from './types-C2zdUpzn.js';
6
- export { B as Bridge, a as BridgeFactory } from './types-DyaHnqNC.js';
5
+ export { C as CallToolResult, d as ContentBlock, I as InitializeResult, c as JsonObject, J as JsonRpcMessage, e as JsonRpcNotification, f as JsonRpcRequest, g as JsonValue, M as MCP_PROTOCOL_VERSION, a as ServerCapabilities, S as ServerInfo, T as ToolDefinition, b as ToolHandler } from './types-aOQLTW0E.js';
6
+ export { B as Bridge, a as BridgeFactory } from './types-DIVNcIQO.js';
7
7
  import { FormFieldDescriptor } from './bridges/forms.js';
8
8
  export { FormBridgeAdapter, FormBridgeOptions, registerFormBridge } from './bridges/forms.js';
9
9
  export { SheetsBridgeAdapter, SheetsBridgeOptions, registerSheetsBridge } from './bridges/sheets.js';
@@ -13,12 +13,13 @@ export { ChartsBridgeAdapter, ChartsBridgeOptions, registerChartsBridge } from '
13
13
  export { SceneBridgeAdapter, SceneBridgeOptions, SceneCamera, SceneObject, SceneObjectKind, SceneState, registerSceneBridge } from './bridges/scene.js';
14
14
  export { ScreenSnapshot, ScreensBridgeAdapter, ScreensBridgeOptions, registerScreensBridge } from './bridges/screens.js';
15
15
  export { SlidesBridgeAdapter, SlidesBridgeOptions, registerSlidesBridge } from './bridges/slides.js';
16
- import * as react_jsx_runtime from 'react/jsx-runtime';
16
+ import * as react from 'react';
17
17
  import { ReactNode, CSSProperties } from 'react';
18
- import { S as SessionDescriptor } from './token-C1O22GxJ.js';
19
- export { b as buildShareConfig, a as buildShareUrl, d as createSessionDescriptor, e as describeSession, r as readSessionFromUrl } from './token-C1O22GxJ.js';
20
- export { ActivityAgent, ActivityFilter, ActivityResolverContext, ActivityTargetResolver, ToolHandler as ActivityWrappedHandler, AgentActivityEvent, AgentActivityListener, AgentTarget, AgentTargetKind, emitActivity, onActivity, readActivityHistory, resetActivityRegistry, useAgentActivity, useAgentActivityForScreen, wrapToolWithActivity } from './presence/index.js';
21
- export { UndoEntry, UndoToolsOptions, clearStack as clearUndoStack, ensureUndoToolsRegistered, pushUndoEntry, readHistory as readUndoHistory, redoOne, registerUndoTools, resetAllUndoStacks, undoOne, useUndoStack } from './undo/index.js';
18
+ import { S as SessionDescriptor } from './token-CrJF76oH.js';
19
+ export { b as buildShareConfig, a as buildShareUrl, c as createSessionDescriptor, d as describeSession, r as readSessionFromUrl } from './token-CrJF76oH.js';
20
+ export { ActivityFilter, AutoActivityEvent as AgentActivityEvent, AutoActivityListener as AgentActivityListener, AutoTarget as AgentTarget, AutoTargetKind as AgentTargetKind, UndoEntry, clearStack as clearUndoStack, emitActivity, onActivity, pushUndoEntry, readActivityHistory, readHistory as readUndoHistory, redoOne, resetActivityRegistry, resetAllUndoStacks, undoOne } from '@particle-academy/fancy-auto-common';
21
+ export { ActivityAgent, ActivityResolverContext, ActivityTargetResolver, ToolHandler as ActivityWrappedHandler, useAgentActivity, useAgentActivityForScreen, wrapToolWithActivity } from './presence/index.js';
22
+ export { UndoToolsOptions, ensureUndoToolsRegistered, registerUndoTools, useUndoStack } from './undo/index.js';
22
23
  export { RelayState, SseRelayOptions, SseRelayTransport, attachSseRelay } from './sharing/index.js';
23
24
  import '@particle-academy/fancy-slides';
24
25
 
@@ -57,7 +58,7 @@ type AgentPanelProps = {
57
58
  * and an optional input composer. Pure presentational: hosts feed it the
58
59
  * activity stream from their own state (typically the MCP transport log).
59
60
  */
60
- declare function AgentPanel({ agent, activity, onSubmit, busy, actions, className, style }: AgentPanelProps): react_jsx_runtime.JSX.Element;
61
+ declare function AgentPanel({ agent, activity, onSubmit, busy, actions, className, style }: AgentPanelProps): react.JSX.Element;
61
62
 
62
63
  type AgentCursorProps = {
63
64
  x: number;
@@ -74,7 +75,7 @@ type AgentCursorProps = {
74
75
  * (or alongside) a fancy-whiteboard <Board> at screen coords matching
75
76
  * the agent's reported position.
76
77
  */
77
- declare function AgentCursor({ x, y, name, color, status, className, style }: AgentCursorProps): react_jsx_runtime.JSX.Element;
78
+ declare function AgentCursor({ x, y, name, color, status, className, style }: AgentCursorProps): react.JSX.Element;
78
79
 
79
80
  type AgentActivityHighlightProps = {
80
81
  /** Bounds of the highlighted item in the parent's coord system. */
@@ -96,7 +97,7 @@ type AgentActivityHighlightProps = {
96
97
  * item the agent just touched. Position the parent so this can be placed
97
98
  * absolutely matching the item's bounds.
98
99
  */
99
- declare function AgentActivityHighlight({ x, y, width, height, pulseKey, color, duration, className, style, }: AgentActivityHighlightProps): react_jsx_runtime.JSX.Element | null;
100
+ declare function AgentActivityHighlight({ x, y, width, height, pulseKey, color, duration, className, style, }: AgentActivityHighlightProps): react.JSX.Element | null;
100
101
 
101
102
  type BridgedFormProps = {
102
103
  /** Stable id for this form. Used by agents in `form_*` tool calls. */
@@ -142,7 +143,7 @@ type BridgedFormProps = {
142
143
  *
143
144
  * Agents can then call form_describe, form_set_value, form_submit, etc.
144
145
  */
145
- declare function BridgedForm({ id, title, screenId, fields, values, onChange, onSubmit, server, agent, children, }: BridgedFormProps): react_jsx_runtime.JSX.Element;
146
+ declare function BridgedForm({ id, title, screenId, fields, values, onChange, onSubmit, server, agent, children, }: BridgedFormProps): react.JSX.Element;
146
147
 
147
148
  /**
148
149
  * Loose shape of the fancy-screens system context — kept here so this
@@ -197,6 +198,6 @@ type ShareControlsProps = {
197
198
  * ShareControls — the host-facing UI for turning sharing on/off and
198
199
  * surfacing the resulting connection details (URL / JSON / cURL).
199
200
  */
200
- declare function ShareControls({ session, onStart, onStop, status, shareBaseUrl, className, style, }: ShareControlsProps): react_jsx_runtime.JSX.Element;
201
+ declare function ShareControls({ session, onStart, onStop, status, shareBaseUrl, className, style, }: ShareControlsProps): react.JSX.Element;
201
202
 
202
203
  export { type AgentActivity, AgentActivityHighlight, type AgentActivityHighlightProps, AgentCursor, type AgentCursorProps, AgentPanel, type AgentPanelProps, BridgedForm, type BridgedFormProps, FormFieldDescriptor, MicroMcpServer, ScreensActivityBridge, type ScreensActivityBridgeProps, SessionDescriptor, ShareControls, type ShareControlsProps };
package/dist/index.js CHANGED
@@ -1,23 +1,23 @@
1
- export { useUndoStack } from './chunk-RGO42EQ6.js';
2
- export { registerChartsBridge } from './chunk-NTDZWGYB.js';
3
- export { registerSceneBridge } from './chunk-XRAJSOPS.js';
4
- export { registerScreensBridge } from './chunk-57ZDHD53.js';
5
- export { registerSlidesBridge } from './chunk-KABXGJJ4.js';
6
- export { useSheetsActivityHighlights, useSheetsAdapter } from './chunk-5XELJIJR.js';
7
- export { AgentActivityHighlight, AgentCursor, AgentPanel, ShareControls } from './chunk-ZHAK2DQR.js';
1
+ export { useUndoStack } from './chunk-GHY3PBPN.js';
2
+ export { registerChartsBridge } from './chunk-SJ7H242B.js';
3
+ export { registerSceneBridge } from './chunk-VUMFO2UW.js';
4
+ export { registerScreensBridge } from './chunk-CKK4QKD2.js';
5
+ export { registerSlidesBridge } from './chunk-R5OA26MJ.js';
6
+ export { useSheetsActivityHighlights, useSheetsAdapter } from './chunk-KHKSQEMC.js';
7
+ export { AgentActivityHighlight, AgentCursor, AgentPanel, ShareControls } from './chunk-J5KYPEYB.js';
8
8
  import './chunk-IJ6JX5VC.js';
9
- export { SseRelayTransport, attachSseRelay, buildShareConfig, buildShareUrl, createSessionDescriptor, describeSession, readSessionFromUrl } from './chunk-LVQXIUJH.js';
10
- export { useAgentActivity, useAgentActivityForScreen } from './chunk-X66JWQBB.js';
9
+ export { SseRelayTransport, attachSseRelay, buildShareConfig, buildShareUrl, createSessionDescriptor, describeSession, readSessionFromUrl } from './chunk-CPNOF4HI.js';
10
+ export { useAgentActivity, useAgentActivityForScreen } from './chunk-UCKJAUBY.js';
11
11
  export { RelayTransport, attachRelay } from './chunk-G6N2TQVO.js';
12
12
  export { InProcessTransport, attachInProcess } from './chunk-AFUULW5E.js';
13
- export { clearStack as clearUndoStack, ensureUndoToolsRegistered, pushUndoEntry, readHistory as readUndoHistory, redoOne, registerUndoTools, resetAllUndoStacks, undoOne } from './chunk-GQ7XXK7G.js';
14
- import { registerFormBridge } from './chunk-4BL5M3U3.js';
15
- export { registerFormBridge } from './chunk-4BL5M3U3.js';
16
- export { registerSheetsBridge } from './chunk-IANI25IT.js';
17
- export { registerCodeBridge } from './chunk-HSTW7ZNO.js';
18
- export { wrapToolWithActivity } from './chunk-52S7XYZK.js';
19
- import { onActivity } from './chunk-JU2N4KK6.js';
20
- export { emitActivity, onActivity, readActivityHistory, resetActivityRegistry } from './chunk-JU2N4KK6.js';
13
+ export { clearStack as clearUndoStack, ensureUndoToolsRegistered, pushUndoEntry, readHistory as readUndoHistory, redoOne, registerUndoTools, resetAllUndoStacks, undoOne } from './chunk-KJ5AOOV7.js';
14
+ import { registerFormBridge } from './chunk-5AD35HS5.js';
15
+ export { registerFormBridge } from './chunk-5AD35HS5.js';
16
+ export { registerSheetsBridge } from './chunk-GSVVIT2O.js';
17
+ export { registerCodeBridge } from './chunk-FYGMFIY5.js';
18
+ export { wrapToolWithActivity } from './chunk-ULJL53DL.js';
19
+ import { onActivity } from './chunk-C3TYI5TJ.js';
20
+ export { emitActivity, onActivity, readActivityHistory, resetActivityRegistry } from './chunk-C3TYI5TJ.js';
21
21
  export { MCP_PROTOCOL_VERSION, MicroMcpServer, ToolRegistry, errorResult, rpcError, textResult } from './chunk-4KAIV6OD.js';
22
22
  import { useRef, useEffect, useMemo } from 'react';
23
23
  import { jsx } from 'react/jsx-runtime';
@@ -1,8 +1,8 @@
1
- import { T as Transport, a as MicroMcpServer } from '../server-C2OpfPEo.cjs';
2
- export { M as McpServerOptions, e as errorResult, r as rpcError, t as textResult } from '../server-C2OpfPEo.cjs';
3
- import { i as JsonRpcMessage } from '../types-C2zdUpzn.cjs';
4
- export { C as CallToolResult, a as ContentBlock, I as InitializeResult, J as JSONRPC_INTERNAL_ERROR, b as JSONRPC_INVALID_PARAMS, c as JSONRPC_INVALID_REQUEST, d as JSONRPC_METHOD_NOT_FOUND, e as JSONRPC_PARSE_ERROR, f as JsonObject, g as JsonRpcError, h as JsonRpcId, j as JsonRpcNotification, k as JsonRpcRequest, l as JsonRpcSuccess, m as JsonValue, M as MCP_PROTOCOL_VERSION, R as RegisteredTool, S as ServerCapabilities, n as ServerInfo, T as ToolDefinition, o as ToolHandler, p as ToolInputSchema } from '../types-C2zdUpzn.cjs';
5
- import '../tool-host-CX3WFXgh.cjs';
1
+ import { T as Transport, M as MicroMcpServer } from '../server-BsSwfemr.cjs';
2
+ export { a as McpServerOptions, e as errorResult, r as rpcError, t as textResult } from '../server-BsSwfemr.cjs';
3
+ import { J as JsonRpcMessage } from '../types-aOQLTW0E.cjs';
4
+ export { C as CallToolResult, d as ContentBlock, I as InitializeResult, h as JSONRPC_INTERNAL_ERROR, i as JSONRPC_INVALID_PARAMS, j as JSONRPC_INVALID_REQUEST, k as JSONRPC_METHOD_NOT_FOUND, l as JSONRPC_PARSE_ERROR, c as JsonObject, m as JsonRpcError, n as JsonRpcId, e as JsonRpcNotification, f as JsonRpcRequest, o as JsonRpcSuccess, g as JsonValue, M as MCP_PROTOCOL_VERSION, R as RegisteredTool, a as ServerCapabilities, S as ServerInfo, T as ToolDefinition, b as ToolHandler, p as ToolInputSchema } from '../types-aOQLTW0E.cjs';
5
+ import '../tool-host-BQuUygLF.cjs';
6
6
 
7
7
  /**
8
8
  * InProcessTransport — direct function-call wiring between an in-page MCP
@@ -1,8 +1,8 @@
1
- import { T as Transport, a as MicroMcpServer } from '../server-CKAqFTyc.js';
2
- export { M as McpServerOptions, e as errorResult, r as rpcError, t as textResult } from '../server-CKAqFTyc.js';
3
- import { i as JsonRpcMessage } from '../types-C2zdUpzn.js';
4
- export { C as CallToolResult, a as ContentBlock, I as InitializeResult, J as JSONRPC_INTERNAL_ERROR, b as JSONRPC_INVALID_PARAMS, c as JSONRPC_INVALID_REQUEST, d as JSONRPC_METHOD_NOT_FOUND, e as JSONRPC_PARSE_ERROR, f as JsonObject, g as JsonRpcError, h as JsonRpcId, j as JsonRpcNotification, k as JsonRpcRequest, l as JsonRpcSuccess, m as JsonValue, M as MCP_PROTOCOL_VERSION, R as RegisteredTool, S as ServerCapabilities, n as ServerInfo, T as ToolDefinition, o as ToolHandler, p as ToolInputSchema } from '../types-C2zdUpzn.js';
5
- import '../tool-host-DldwGNqR.js';
1
+ import { T as Transport, M as MicroMcpServer } from '../server-Du3-IGqM.js';
2
+ export { a as McpServerOptions, e as errorResult, r as rpcError, t as textResult } from '../server-Du3-IGqM.js';
3
+ import { J as JsonRpcMessage } from '../types-aOQLTW0E.js';
4
+ export { C as CallToolResult, d as ContentBlock, I as InitializeResult, h as JSONRPC_INTERNAL_ERROR, i as JSONRPC_INVALID_PARAMS, j as JSONRPC_INVALID_REQUEST, k as JSONRPC_METHOD_NOT_FOUND, l as JSONRPC_PARSE_ERROR, c as JsonObject, m as JsonRpcError, n as JsonRpcId, e as JsonRpcNotification, f as JsonRpcRequest, o as JsonRpcSuccess, g as JsonValue, M as MCP_PROTOCOL_VERSION, R as RegisteredTool, a as ServerCapabilities, S as ServerInfo, T as ToolDefinition, b as ToolHandler, p as ToolInputSchema } from '../types-aOQLTW0E.js';
5
+ import '../tool-host-C8JMMGYq.js';
6
6
 
7
7
  /**
8
8
  * InProcessTransport — direct function-call wiring between an in-page MCP
@@ -1,60 +1,6 @@
1
- import { C as CallToolResult } from '../types-C2zdUpzn.cjs';
2
-
3
- /**
4
- * Presence layer types — describe what the agent is doing right now and
5
- * where. Every bridge tool emits one of these when it runs; the registry
6
- * fans them out to in-process subscribers + the SSE relay so external
7
- * clients can render presence indicators across the whole app.
8
- */
9
- type AgentTargetKind = "whiteboard" | "flow" | "form" | "sheet" | "code" | "chart" | "scene" | "custom";
10
- type AgentTarget = {
11
- /** Which package surface the action affects. */
12
- kind: AgentTargetKind | string;
13
- /** Optional fancy-screens screen id, for screen-scoped UIs. */
14
- screenId?: string;
15
- /** Optional element id within the surface (sticky id, node id, field name, …). */
16
- elementId?: string;
17
- /** Free-form label the host can render (e.g. "the 'email' field"). */
18
- label?: string;
19
- };
20
- type AgentActivityEvent = {
21
- /** Stable identifier for the acting agent. */
22
- agentId: string;
23
- /** Human-friendly name (used by indicators / activity log). */
24
- agentName?: string;
25
- /** Color for cursor / highlight CSS. */
26
- agentColor?: string;
27
- /** What the agent is touching. */
28
- target: AgentTarget;
29
- /** Snake-case action verb mirroring the tool name (e.g. "whiteboard_add_sticky"). */
30
- action: string;
31
- /** Wall-clock ms — when the action ran. */
32
- timestamp: number;
33
- /** Optional small structured payload describing the action's effect. */
34
- meta?: Record<string, unknown>;
35
- /** Optional duration in ms — how long the activity should "stick" on the
36
- * UI before fading. Default 1500. */
37
- ttlMs?: number;
38
- };
39
- type AgentActivityListener = (event: AgentActivityEvent) => void;
40
- type ActivityFilter = {
41
- agentId?: string;
42
- screenId?: string;
43
- kind?: string;
44
- };
45
-
46
- /** Emit an activity event. All current listeners receive it synchronously. */
47
- declare function emitActivity(event: AgentActivityEvent): void;
48
- /**
49
- * Subscribe to all events (or a filtered subset). Returns an unsubscribe
50
- * function. Filter checks all provided keys with strict equality; omit a
51
- * key to ignore it.
52
- */
53
- declare function onActivity(listener: AgentActivityListener, filter?: ActivityFilter): () => void;
54
- /** Read the recent history (newest last). Optional filter. */
55
- declare function readActivityHistory(filter?: ActivityFilter): AgentActivityEvent[];
56
- /** Wipe history + clear listeners. Test/teardown helper. */
57
- declare function resetActivityRegistry(): void;
1
+ import { AutoTarget, ActivityFilter, AutoActivityEvent } from '@particle-academy/fancy-auto-common';
2
+ export { ActivityFilter, AutoActivityEvent as AgentActivityEvent, AutoActivityListener as AgentActivityListener, AutoTarget as AgentTarget, AutoTargetKind as AgentTargetKind, emitActivity, onActivity, readActivityHistory, resetActivityRegistry } from '@particle-academy/fancy-auto-common';
3
+ import { C as CallToolResult } from '../types-aOQLTW0E.cjs';
58
4
 
59
5
  type ActivityAgent = {
60
6
  id: string;
@@ -77,7 +23,7 @@ type ActivityResolverContext<TArgs = Record<string, unknown>> = {
77
23
  * The resolver runs AFTER the tool handler so it can inspect the result
78
24
  * (e.g. read a newly-created item id from `structuredContent`).
79
25
  */
80
- type ActivityTargetResolver<TArgs = Record<string, unknown>> = (ctx: ActivityResolverContext<TArgs>) => AgentTarget | null;
26
+ type ActivityTargetResolver<TArgs = Record<string, unknown>> = (ctx: ActivityResolverContext<TArgs>) => AutoTarget | null;
81
27
  type ToolHandler<TArgs = Record<string, unknown>> = (args: TArgs) => Promise<CallToolResult> | CallToolResult;
82
28
  /**
83
29
  * wrapToolWithActivity — decorate a bridge tool handler so every successful
@@ -101,7 +47,7 @@ declare function wrapToolWithActivity<TArgs = Record<string, unknown>>(handler:
101
47
  /** Optional fancy-screens screen id this bridge is scoped to. */
102
48
  screenId?: string;
103
49
  /** Default target kind if the resolver returns one without `kind`. */
104
- kind: AgentTarget["kind"];
50
+ kind: AutoTarget["kind"];
105
51
  /** Per-call resolver. Return `null` to skip emitting (e.g. for read-only tools). */
106
52
  resolveTarget?: ActivityTargetResolver<TArgs>;
107
53
  /** Optional ttl override. */
@@ -118,8 +64,8 @@ declare function wrapToolWithActivity<TArgs = Record<string, unknown>>(handler:
118
64
  declare function useAgentActivity(filter?: ActivityFilter, options?: {
119
65
  capacity?: number;
120
66
  }): {
121
- events: AgentActivityEvent[];
122
- latest: AgentActivityEvent | null;
67
+ events: AutoActivityEvent[];
68
+ latest: AutoActivityEvent | null;
123
69
  };
124
70
  /**
125
71
  * useAgentActivityForScreen — convenience wrapper that filters by screen id.
@@ -128,9 +74,9 @@ declare function useAgentActivity(filter?: ActivityFilter, options?: {
128
74
  declare function useAgentActivityForScreen(screenId: string, options?: {
129
75
  capacity?: number;
130
76
  }): {
131
- events: AgentActivityEvent[];
132
- latest: AgentActivityEvent | null;
77
+ events: AutoActivityEvent[];
78
+ latest: AutoActivityEvent | null;
133
79
  isAgentActive: boolean;
134
80
  };
135
81
 
136
- export { type ActivityAgent, type ActivityFilter, type ActivityResolverContext, type ActivityTargetResolver, type AgentActivityEvent, type AgentActivityListener, type AgentTarget, type AgentTargetKind, type ToolHandler, emitActivity, onActivity, readActivityHistory, resetActivityRegistry, useAgentActivity, useAgentActivityForScreen, wrapToolWithActivity };
82
+ export { type ActivityAgent, type ActivityResolverContext, type ActivityTargetResolver, type ToolHandler, useAgentActivity, useAgentActivityForScreen, wrapToolWithActivity };
@@ -1,60 +1,6 @@
1
- import { C as CallToolResult } from '../types-C2zdUpzn.js';
2
-
3
- /**
4
- * Presence layer types — describe what the agent is doing right now and
5
- * where. Every bridge tool emits one of these when it runs; the registry
6
- * fans them out to in-process subscribers + the SSE relay so external
7
- * clients can render presence indicators across the whole app.
8
- */
9
- type AgentTargetKind = "whiteboard" | "flow" | "form" | "sheet" | "code" | "chart" | "scene" | "custom";
10
- type AgentTarget = {
11
- /** Which package surface the action affects. */
12
- kind: AgentTargetKind | string;
13
- /** Optional fancy-screens screen id, for screen-scoped UIs. */
14
- screenId?: string;
15
- /** Optional element id within the surface (sticky id, node id, field name, …). */
16
- elementId?: string;
17
- /** Free-form label the host can render (e.g. "the 'email' field"). */
18
- label?: string;
19
- };
20
- type AgentActivityEvent = {
21
- /** Stable identifier for the acting agent. */
22
- agentId: string;
23
- /** Human-friendly name (used by indicators / activity log). */
24
- agentName?: string;
25
- /** Color for cursor / highlight CSS. */
26
- agentColor?: string;
27
- /** What the agent is touching. */
28
- target: AgentTarget;
29
- /** Snake-case action verb mirroring the tool name (e.g. "whiteboard_add_sticky"). */
30
- action: string;
31
- /** Wall-clock ms — when the action ran. */
32
- timestamp: number;
33
- /** Optional small structured payload describing the action's effect. */
34
- meta?: Record<string, unknown>;
35
- /** Optional duration in ms — how long the activity should "stick" on the
36
- * UI before fading. Default 1500. */
37
- ttlMs?: number;
38
- };
39
- type AgentActivityListener = (event: AgentActivityEvent) => void;
40
- type ActivityFilter = {
41
- agentId?: string;
42
- screenId?: string;
43
- kind?: string;
44
- };
45
-
46
- /** Emit an activity event. All current listeners receive it synchronously. */
47
- declare function emitActivity(event: AgentActivityEvent): void;
48
- /**
49
- * Subscribe to all events (or a filtered subset). Returns an unsubscribe
50
- * function. Filter checks all provided keys with strict equality; omit a
51
- * key to ignore it.
52
- */
53
- declare function onActivity(listener: AgentActivityListener, filter?: ActivityFilter): () => void;
54
- /** Read the recent history (newest last). Optional filter. */
55
- declare function readActivityHistory(filter?: ActivityFilter): AgentActivityEvent[];
56
- /** Wipe history + clear listeners. Test/teardown helper. */
57
- declare function resetActivityRegistry(): void;
1
+ import { AutoTarget, ActivityFilter, AutoActivityEvent } from '@particle-academy/fancy-auto-common';
2
+ export { ActivityFilter, AutoActivityEvent as AgentActivityEvent, AutoActivityListener as AgentActivityListener, AutoTarget as AgentTarget, AutoTargetKind as AgentTargetKind, emitActivity, onActivity, readActivityHistory, resetActivityRegistry } from '@particle-academy/fancy-auto-common';
3
+ import { C as CallToolResult } from '../types-aOQLTW0E.js';
58
4
 
59
5
  type ActivityAgent = {
60
6
  id: string;
@@ -77,7 +23,7 @@ type ActivityResolverContext<TArgs = Record<string, unknown>> = {
77
23
  * The resolver runs AFTER the tool handler so it can inspect the result
78
24
  * (e.g. read a newly-created item id from `structuredContent`).
79
25
  */
80
- type ActivityTargetResolver<TArgs = Record<string, unknown>> = (ctx: ActivityResolverContext<TArgs>) => AgentTarget | null;
26
+ type ActivityTargetResolver<TArgs = Record<string, unknown>> = (ctx: ActivityResolverContext<TArgs>) => AutoTarget | null;
81
27
  type ToolHandler<TArgs = Record<string, unknown>> = (args: TArgs) => Promise<CallToolResult> | CallToolResult;
82
28
  /**
83
29
  * wrapToolWithActivity — decorate a bridge tool handler so every successful
@@ -101,7 +47,7 @@ declare function wrapToolWithActivity<TArgs = Record<string, unknown>>(handler:
101
47
  /** Optional fancy-screens screen id this bridge is scoped to. */
102
48
  screenId?: string;
103
49
  /** Default target kind if the resolver returns one without `kind`. */
104
- kind: AgentTarget["kind"];
50
+ kind: AutoTarget["kind"];
105
51
  /** Per-call resolver. Return `null` to skip emitting (e.g. for read-only tools). */
106
52
  resolveTarget?: ActivityTargetResolver<TArgs>;
107
53
  /** Optional ttl override. */
@@ -118,8 +64,8 @@ declare function wrapToolWithActivity<TArgs = Record<string, unknown>>(handler:
118
64
  declare function useAgentActivity(filter?: ActivityFilter, options?: {
119
65
  capacity?: number;
120
66
  }): {
121
- events: AgentActivityEvent[];
122
- latest: AgentActivityEvent | null;
67
+ events: AutoActivityEvent[];
68
+ latest: AutoActivityEvent | null;
123
69
  };
124
70
  /**
125
71
  * useAgentActivityForScreen — convenience wrapper that filters by screen id.
@@ -128,9 +74,9 @@ declare function useAgentActivity(filter?: ActivityFilter, options?: {
128
74
  declare function useAgentActivityForScreen(screenId: string, options?: {
129
75
  capacity?: number;
130
76
  }): {
131
- events: AgentActivityEvent[];
132
- latest: AgentActivityEvent | null;
77
+ events: AutoActivityEvent[];
78
+ latest: AutoActivityEvent | null;
133
79
  isAgentActive: boolean;
134
80
  };
135
81
 
136
- export { type ActivityAgent, type ActivityFilter, type ActivityResolverContext, type ActivityTargetResolver, type AgentActivityEvent, type AgentActivityListener, type AgentTarget, type AgentTargetKind, type ToolHandler, emitActivity, onActivity, readActivityHistory, resetActivityRegistry, useAgentActivity, useAgentActivityForScreen, wrapToolWithActivity };
82
+ export { type ActivityAgent, type ActivityResolverContext, type ActivityTargetResolver, type ToolHandler, useAgentActivity, useAgentActivityForScreen, wrapToolWithActivity };
package/dist/presence.cjs CHANGED
@@ -1,37 +1,9 @@
1
1
  'use strict';
2
2
 
3
+ var fancyAutoCommon = require('@particle-academy/fancy-auto-common');
3
4
  var react = require('react');
4
5
 
5
6
  // src/presence/registry.ts
6
- var HISTORY_CAP = 200;
7
- var listeners = /* @__PURE__ */ new Set();
8
- var history = [];
9
- function emitActivity(event) {
10
- history.push(event);
11
- if (history.length > HISTORY_CAP) history.splice(0, history.length - HISTORY_CAP);
12
- for (const l of listeners) l(event);
13
- }
14
- function onActivity(listener, filter) {
15
- const wrapped = filter ? (e) => {
16
- if (matches(e, filter)) listener(e);
17
- } : listener;
18
- listeners.add(wrapped);
19
- return () => listeners.delete(wrapped);
20
- }
21
- function readActivityHistory(filter) {
22
- if (!filter) return history.slice();
23
- return history.filter((e) => matches(e, filter));
24
- }
25
- function resetActivityRegistry() {
26
- listeners.clear();
27
- history.length = 0;
28
- }
29
- function matches(e, f) {
30
- if (f.agentId !== void 0 && e.agentId !== f.agentId) return false;
31
- if (f.screenId !== void 0 && e.target.screenId !== f.screenId) return false;
32
- if (f.kind !== void 0 && e.target.kind !== f.kind) return false;
33
- return true;
34
- }
35
7
 
36
8
  // src/presence/wrap-tool-with-activity.ts
37
9
  function wrapToolWithActivity(handler, options) {
@@ -45,7 +17,7 @@ function wrapToolWithActivity(handler, options) {
45
17
  target = { kind: options.kind, screenId: options.screenId };
46
18
  }
47
19
  if (!target) return result;
48
- emitActivity({
20
+ fancyAutoCommon.emitActivity({
49
21
  agentId: options.agent.id,
50
22
  agentName: options.agent.name,
51
23
  agentColor: options.agent.color,
@@ -67,10 +39,10 @@ function extractMeta(result) {
67
39
  }
68
40
  function useAgentActivity(filter, options = {}) {
69
41
  const cap = options.capacity ?? 50;
70
- const [events, setEvents] = react.useState(() => readActivityHistory(filter).slice(-cap));
42
+ const [events, setEvents] = react.useState(() => fancyAutoCommon.readActivityHistory(filter).slice(-cap));
71
43
  react.useEffect(() => {
72
- setEvents(readActivityHistory(filter).slice(-cap));
73
- return onActivity((event) => {
44
+ setEvents(fancyAutoCommon.readActivityHistory(filter).slice(-cap));
45
+ return fancyAutoCommon.onActivity((event) => {
74
46
  setEvents((prev) => {
75
47
  const next = prev.length >= cap ? prev.slice(prev.length - cap + 1) : prev.slice();
76
48
  next.push(event);
@@ -96,10 +68,22 @@ function useAgentActivityForScreen(screenId, options = {}) {
96
68
  return { events, latest, isAgentActive };
97
69
  }
98
70
 
99
- exports.emitActivity = emitActivity;
100
- exports.onActivity = onActivity;
101
- exports.readActivityHistory = readActivityHistory;
102
- exports.resetActivityRegistry = resetActivityRegistry;
71
+ Object.defineProperty(exports, "emitActivity", {
72
+ enumerable: true,
73
+ get: function () { return fancyAutoCommon.emitActivity; }
74
+ });
75
+ Object.defineProperty(exports, "onActivity", {
76
+ enumerable: true,
77
+ get: function () { return fancyAutoCommon.onActivity; }
78
+ });
79
+ Object.defineProperty(exports, "readActivityHistory", {
80
+ enumerable: true,
81
+ get: function () { return fancyAutoCommon.readActivityHistory; }
82
+ });
83
+ Object.defineProperty(exports, "resetActivityRegistry", {
84
+ enumerable: true,
85
+ get: function () { return fancyAutoCommon.resetActivityRegistry; }
86
+ });
103
87
  exports.useAgentActivity = useAgentActivity;
104
88
  exports.useAgentActivityForScreen = useAgentActivityForScreen;
105
89
  exports.wrapToolWithActivity = wrapToolWithActivity;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/presence/registry.ts","../src/presence/wrap-tool-with-activity.ts","../src/presence/use-agent-activity.ts"],"names":["useState","useEffect"],"mappings":"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","file":"presence.cjs","sourcesContent":["import type { ActivityFilter, AgentActivityEvent, AgentActivityListener } from \"./types\";\n\n/**\n * In-process registry of agent activity events. Bridges call `emitActivity`\n * after a tool runs; React hooks + the SSE relay subscribe via\n * `onActivity()`.\n *\n * Holds a short scrollback of recent events (default 200) so newly-mounted\n * subscribers can render the recent past — useful for activity-log UIs\n * that rejoin a session mid-stream.\n */\n\nconst HISTORY_CAP = 200;\n\nconst listeners = new Set<AgentActivityListener>();\nconst history: AgentActivityEvent[] = [];\n\n/** Emit an activity event. All current listeners receive it synchronously. */\nexport function emitActivity(event: AgentActivityEvent): void {\n history.push(event);\n if (history.length > HISTORY_CAP) history.splice(0, history.length - HISTORY_CAP);\n for (const l of listeners) l(event);\n}\n\n/**\n * Subscribe to all events (or a filtered subset). Returns an unsubscribe\n * function. Filter checks all provided keys with strict equality; omit a\n * key to ignore it.\n */\nexport function onActivity(listener: AgentActivityListener, filter?: ActivityFilter): () => void {\n const wrapped: AgentActivityListener = filter\n ? (e) => { if (matches(e, filter)) listener(e); }\n : listener;\n listeners.add(wrapped);\n return () => listeners.delete(wrapped);\n}\n\n/** Read the recent history (newest last). Optional filter. */\nexport function readActivityHistory(filter?: ActivityFilter): AgentActivityEvent[] {\n if (!filter) return history.slice();\n return history.filter((e) => matches(e, filter));\n}\n\n/** Wipe history + clear listeners. Test/teardown helper. */\nexport function resetActivityRegistry(): void {\n listeners.clear();\n history.length = 0;\n}\n\nfunction matches(e: AgentActivityEvent, f: ActivityFilter): boolean {\n if (f.agentId !== undefined && e.agentId !== f.agentId) return false;\n if (f.screenId !== undefined && e.target.screenId !== f.screenId) return false;\n if (f.kind !== undefined && e.target.kind !== f.kind) return false;\n return true;\n}\n","import type { CallToolResult } from \"../mcp/types\";\nimport { emitActivity } from \"./registry\";\nimport type { AgentTarget } from \"./types\";\n\nexport type ActivityAgent = { id: string; name?: string; color?: string };\n\nexport type ActivityResolverContext<TArgs = Record<string, unknown>> = {\n /** Tool name as registered. */\n toolName: string;\n /** Arguments the tool was called with. */\n args: TArgs;\n /** The CallToolResult the underlying handler produced. */\n result: CallToolResult;\n};\n\n/**\n * Resolves an `AgentTarget` for an executed tool. Bridges declare one of\n * these per registration so the wrapper knows which surface / element /\n * screen the activity belongs to.\n *\n * The resolver runs AFTER the tool handler so it can inspect the result\n * (e.g. read a newly-created item id from `structuredContent`).\n */\nexport type ActivityTargetResolver<TArgs = Record<string, unknown>> = (\n ctx: ActivityResolverContext<TArgs>,\n) => AgentTarget | null;\n\nexport type ToolHandler<TArgs = Record<string, unknown>> = (\n args: TArgs,\n) => Promise<CallToolResult> | CallToolResult;\n\n/**\n * wrapToolWithActivity — decorate a bridge tool handler so every successful\n * call emits an `AgentActivityEvent`. Returns a new handler with the same shape.\n *\n * Usage in a bridge:\n *\n * server.registerTool(\n * definition,\n * wrapToolWithActivity(\n * handler,\n * { agent, kind: \"whiteboard\", resolveTarget: ({ args }) => ({\n * kind: \"whiteboard\", elementId: args.id as string,\n * }) },\n * ),\n * );\n */\nexport function wrapToolWithActivity<TArgs = Record<string, unknown>>(\n handler: ToolHandler<TArgs>,\n options: {\n toolName: string;\n agent: ActivityAgent;\n /** Optional fancy-screens screen id this bridge is scoped to. */\n screenId?: string;\n /** Default target kind if the resolver returns one without `kind`. */\n kind: AgentTarget[\"kind\"];\n /** Per-call resolver. Return `null` to skip emitting (e.g. for read-only tools). */\n resolveTarget?: ActivityTargetResolver<TArgs>;\n /** Optional ttl override. */\n ttlMs?: number;\n },\n): ToolHandler<TArgs> {\n return async (args) => {\n const result = await handler(args);\n if (result.isError) return result;\n\n let target: AgentTarget | null;\n if (options.resolveTarget) {\n target = options.resolveTarget({ toolName: options.toolName, args, result });\n } else {\n target = { kind: options.kind, screenId: options.screenId };\n }\n if (!target) return result;\n\n emitActivity({\n agentId: options.agent.id,\n agentName: options.agent.name,\n agentColor: options.agent.color,\n target: { ...target, kind: target.kind ?? options.kind, screenId: target.screenId ?? options.screenId },\n action: options.toolName,\n timestamp: Date.now(),\n meta: extractMeta(result),\n ttlMs: options.ttlMs,\n });\n return result;\n };\n}\n\nfunction extractMeta(result: CallToolResult): Record<string, unknown> | undefined {\n const sc = result.structuredContent;\n if (sc && typeof sc === \"object\" && !Array.isArray(sc)) {\n return sc as Record<string, unknown>;\n }\n return undefined;\n}\n","import { useEffect, useState } from \"react\";\nimport { onActivity, readActivityHistory } from \"./registry\";\nimport type { ActivityFilter, AgentActivityEvent } from \"./types\";\n\n/**\n * useAgentActivity — React subscription to the in-process activity stream.\n *\n * Returns:\n * - `events`: capped scrollback of recent events matching the filter\n * - `latest`: the most recent event (handy for transient highlights)\n */\nexport function useAgentActivity(\n filter?: ActivityFilter,\n options: { capacity?: number } = {},\n): { events: AgentActivityEvent[]; latest: AgentActivityEvent | null } {\n const cap = options.capacity ?? 50;\n const [events, setEvents] = useState<AgentActivityEvent[]>(() => readActivityHistory(filter).slice(-cap));\n\n useEffect(() => {\n setEvents(readActivityHistory(filter).slice(-cap));\n return onActivity((event) => {\n setEvents((prev) => {\n const next = prev.length >= cap ? prev.slice(prev.length - cap + 1) : prev.slice();\n next.push(event);\n return next;\n });\n }, filter);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filter?.agentId, filter?.screenId, filter?.kind, cap]);\n\n return { events, latest: events.length > 0 ? events[events.length - 1] : null };\n}\n\n/**\n * useAgentActivityForScreen — convenience wrapper that filters by screen id.\n * Drives \"agent is here\" badges in fancy-screens-based shells.\n */\nexport function useAgentActivityForScreen(\n screenId: string,\n options: { capacity?: number } = {},\n): { events: AgentActivityEvent[]; latest: AgentActivityEvent | null; isAgentActive: boolean } {\n const { events, latest } = useAgentActivity({ screenId }, options);\n const fadeAfter = latest?.ttlMs ?? 1500;\n const [isAgentActive, setActive] = useState(false);\n\n useEffect(() => {\n if (!latest) {\n setActive(false);\n return;\n }\n setActive(true);\n const timer = setTimeout(() => setActive(false), fadeAfter);\n return () => clearTimeout(timer);\n }, [latest, fadeAfter]);\n\n return { events, latest, isAgentActive };\n}\n"]}
1
+ {"version":3,"sources":["../src/presence/wrap-tool-with-activity.ts","../src/presence/use-agent-activity.ts"],"names":["emitActivity","useState","readActivityHistory","useEffect","onActivity"],"mappings":"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","file":"presence.cjs","sourcesContent":["import type { CallToolResult } from \"../mcp/types\";\nimport { emitActivity } from \"./registry\";\nimport type { AgentTarget } from \"./types\";\n\nexport type ActivityAgent = { id: string; name?: string; color?: string };\n\nexport type ActivityResolverContext<TArgs = Record<string, unknown>> = {\n /** Tool name as registered. */\n toolName: string;\n /** Arguments the tool was called with. */\n args: TArgs;\n /** The CallToolResult the underlying handler produced. */\n result: CallToolResult;\n};\n\n/**\n * Resolves an `AgentTarget` for an executed tool. Bridges declare one of\n * these per registration so the wrapper knows which surface / element /\n * screen the activity belongs to.\n *\n * The resolver runs AFTER the tool handler so it can inspect the result\n * (e.g. read a newly-created item id from `structuredContent`).\n */\nexport type ActivityTargetResolver<TArgs = Record<string, unknown>> = (\n ctx: ActivityResolverContext<TArgs>,\n) => AgentTarget | null;\n\nexport type ToolHandler<TArgs = Record<string, unknown>> = (\n args: TArgs,\n) => Promise<CallToolResult> | CallToolResult;\n\n/**\n * wrapToolWithActivity — decorate a bridge tool handler so every successful\n * call emits an `AgentActivityEvent`. Returns a new handler with the same shape.\n *\n * Usage in a bridge:\n *\n * server.registerTool(\n * definition,\n * wrapToolWithActivity(\n * handler,\n * { agent, kind: \"whiteboard\", resolveTarget: ({ args }) => ({\n * kind: \"whiteboard\", elementId: args.id as string,\n * }) },\n * ),\n * );\n */\nexport function wrapToolWithActivity<TArgs = Record<string, unknown>>(\n handler: ToolHandler<TArgs>,\n options: {\n toolName: string;\n agent: ActivityAgent;\n /** Optional fancy-screens screen id this bridge is scoped to. */\n screenId?: string;\n /** Default target kind if the resolver returns one without `kind`. */\n kind: AgentTarget[\"kind\"];\n /** Per-call resolver. Return `null` to skip emitting (e.g. for read-only tools). */\n resolveTarget?: ActivityTargetResolver<TArgs>;\n /** Optional ttl override. */\n ttlMs?: number;\n },\n): ToolHandler<TArgs> {\n return async (args) => {\n const result = await handler(args);\n if (result.isError) return result;\n\n let target: AgentTarget | null;\n if (options.resolveTarget) {\n target = options.resolveTarget({ toolName: options.toolName, args, result });\n } else {\n target = { kind: options.kind, screenId: options.screenId };\n }\n if (!target) return result;\n\n emitActivity({\n agentId: options.agent.id,\n agentName: options.agent.name,\n agentColor: options.agent.color,\n target: { ...target, kind: target.kind ?? options.kind, screenId: target.screenId ?? options.screenId },\n action: options.toolName,\n timestamp: Date.now(),\n meta: extractMeta(result),\n ttlMs: options.ttlMs,\n });\n return result;\n };\n}\n\nfunction extractMeta(result: CallToolResult): Record<string, unknown> | undefined {\n const sc = result.structuredContent;\n if (sc && typeof sc === \"object\" && !Array.isArray(sc)) {\n return sc as Record<string, unknown>;\n }\n return undefined;\n}\n","import { useEffect, useState } from \"react\";\nimport { onActivity, readActivityHistory } from \"./registry\";\nimport type { ActivityFilter, AgentActivityEvent } from \"./types\";\n\n/**\n * useAgentActivity — React subscription to the in-process activity stream.\n *\n * Returns:\n * - `events`: capped scrollback of recent events matching the filter\n * - `latest`: the most recent event (handy for transient highlights)\n */\nexport function useAgentActivity(\n filter?: ActivityFilter,\n options: { capacity?: number } = {},\n): { events: AgentActivityEvent[]; latest: AgentActivityEvent | null } {\n const cap = options.capacity ?? 50;\n const [events, setEvents] = useState<AgentActivityEvent[]>(() => readActivityHistory(filter).slice(-cap));\n\n useEffect(() => {\n setEvents(readActivityHistory(filter).slice(-cap));\n return onActivity((event) => {\n setEvents((prev) => {\n const next = prev.length >= cap ? prev.slice(prev.length - cap + 1) : prev.slice();\n next.push(event);\n return next;\n });\n }, filter);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filter?.agentId, filter?.screenId, filter?.kind, cap]);\n\n return { events, latest: events.length > 0 ? events[events.length - 1] : null };\n}\n\n/**\n * useAgentActivityForScreen — convenience wrapper that filters by screen id.\n * Drives \"agent is here\" badges in fancy-screens-based shells.\n */\nexport function useAgentActivityForScreen(\n screenId: string,\n options: { capacity?: number } = {},\n): { events: AgentActivityEvent[]; latest: AgentActivityEvent | null; isAgentActive: boolean } {\n const { events, latest } = useAgentActivity({ screenId }, options);\n const fadeAfter = latest?.ttlMs ?? 1500;\n const [isAgentActive, setActive] = useState(false);\n\n useEffect(() => {\n if (!latest) {\n setActive(false);\n return;\n }\n setActive(true);\n const timer = setTimeout(() => setActive(false), fadeAfter);\n return () => clearTimeout(timer);\n }, [latest, fadeAfter]);\n\n return { events, latest, isAgentActive };\n}\n"]}
package/dist/presence.js CHANGED
@@ -1,5 +1,5 @@
1
- export { useAgentActivity, useAgentActivityForScreen } from './chunk-X66JWQBB.js';
2
- export { wrapToolWithActivity } from './chunk-52S7XYZK.js';
3
- export { emitActivity, onActivity, readActivityHistory, resetActivityRegistry } from './chunk-JU2N4KK6.js';
1
+ export { useAgentActivity, useAgentActivityForScreen } from './chunk-UCKJAUBY.js';
2
+ export { wrapToolWithActivity } from './chunk-ULJL53DL.js';
3
+ export { emitActivity, onActivity, readActivityHistory, resetActivityRegistry } from './chunk-C3TYI5TJ.js';
4
4
  //# sourceMappingURL=presence.js.map
5
5
  //# sourceMappingURL=presence.js.map
@@ -0,0 +1,3 @@
1
+ export { emitActivity, onActivity, readActivityHistory, resetActivityRegistry } from './chunk-C3TYI5TJ.js';
2
+ //# sourceMappingURL=registry-TFWVXQOU.js.map
3
+ //# sourceMappingURL=registry-TFWVXQOU.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"registry-2DRURS6U.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"registry-TFWVXQOU.js"}
@@ -1,5 +1,5 @@
1
- import { n as ServerInfo, S as ServerCapabilities, i as JsonRpcMessage, C as CallToolResult } from './types-C2zdUpzn.cjs';
2
- import { a as ToolRegistry } from './tool-host-CX3WFXgh.cjs';
1
+ import { S as ServerInfo, a as ServerCapabilities, J as JsonRpcMessage, C as CallToolResult } from './types-aOQLTW0E.cjs';
2
+ import { a as ToolRegistry } from './tool-host-BQuUygLF.cjs';
3
3
 
4
4
  type McpServerOptions = {
5
5
  info: ServerInfo;
@@ -60,4 +60,4 @@ declare function rpcError(code: number, message: string, data?: any): {
60
60
  declare function textResult(text: string, structured?: any): CallToolResult;
61
61
  declare function errorResult(text: string): CallToolResult;
62
62
 
63
- export { type McpServerOptions as M, type Transport as T, MicroMcpServer as a, errorResult as e, rpcError as r, textResult as t };
63
+ export { MicroMcpServer as M, type Transport as T, type McpServerOptions as a, errorResult as e, rpcError as r, textResult as t };