@agent-native/core 0.109.2 → 0.109.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.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +16 -0
- package/corpus/core/docs/content/agent-native-toolkit.mdx +46 -13
- package/corpus/core/docs/content/locales/ar-SA/agent-native-toolkit.mdx +79 -55
- package/corpus/core/docs/content/locales/ar-SA/toolkit-capability-packages.mdx +21 -0
- package/corpus/core/docs/content/locales/ar-SA/toolkit-context-knowledge.mdx +12 -0
- package/corpus/core/docs/content/locales/ar-SA/toolkit-editors-canvases.mdx +17 -0
- package/corpus/core/docs/content/locales/de-DE/agent-native-toolkit.mdx +82 -54
- package/corpus/core/docs/content/locales/de-DE/toolkit-capability-packages.mdx +21 -0
- package/corpus/core/docs/content/locales/de-DE/toolkit-context-knowledge.mdx +12 -0
- package/corpus/core/docs/content/locales/de-DE/toolkit-editors-canvases.mdx +17 -0
- package/corpus/core/docs/content/locales/es-ES/agent-native-toolkit.mdx +81 -52
- package/corpus/core/docs/content/locales/es-ES/toolkit-capability-packages.mdx +21 -0
- package/corpus/core/docs/content/locales/es-ES/toolkit-context-knowledge.mdx +12 -0
- package/corpus/core/docs/content/locales/es-ES/toolkit-editors-canvases.mdx +21 -0
- package/corpus/core/docs/content/locales/fr-FR/agent-native-toolkit.mdx +84 -54
- package/corpus/core/docs/content/locales/fr-FR/toolkit-capability-packages.mdx +21 -0
- package/corpus/core/docs/content/locales/fr-FR/toolkit-context-knowledge.mdx +12 -0
- package/corpus/core/docs/content/locales/fr-FR/toolkit-editors-canvases.mdx +21 -0
- package/corpus/core/docs/content/locales/hi-IN/agent-native-toolkit.mdx +69 -62
- package/corpus/core/docs/content/locales/hi-IN/toolkit-capability-packages.mdx +21 -0
- package/corpus/core/docs/content/locales/hi-IN/toolkit-context-knowledge.mdx +12 -0
- package/corpus/core/docs/content/locales/hi-IN/toolkit-editors-canvases.mdx +17 -0
- package/corpus/core/docs/content/locales/ja-JP/agent-native-toolkit.mdx +69 -62
- package/corpus/core/docs/content/locales/ja-JP/toolkit-capability-packages.mdx +21 -0
- package/corpus/core/docs/content/locales/ja-JP/toolkit-context-knowledge.mdx +12 -0
- package/corpus/core/docs/content/locales/ja-JP/toolkit-editors-canvases.mdx +17 -0
- package/corpus/core/docs/content/locales/ko-KR/agent-native-toolkit.mdx +69 -62
- package/corpus/core/docs/content/locales/ko-KR/toolkit-capability-packages.mdx +21 -0
- package/corpus/core/docs/content/locales/ko-KR/toolkit-context-knowledge.mdx +12 -0
- package/corpus/core/docs/content/locales/ko-KR/toolkit-editors-canvases.mdx +17 -0
- package/corpus/core/docs/content/locales/pt-BR/agent-native-toolkit.mdx +82 -54
- package/corpus/core/docs/content/locales/pt-BR/toolkit-capability-packages.mdx +21 -0
- package/corpus/core/docs/content/locales/pt-BR/toolkit-context-knowledge.mdx +12 -0
- package/corpus/core/docs/content/locales/pt-BR/toolkit-editors-canvases.mdx +17 -0
- package/corpus/core/docs/content/locales/zh-CN/agent-native-toolkit.mdx +69 -62
- package/corpus/core/docs/content/locales/zh-CN/toolkit-capability-packages.mdx +21 -0
- package/corpus/core/docs/content/locales/zh-CN/toolkit-context-knowledge.mdx +12 -0
- package/corpus/core/docs/content/locales/zh-CN/toolkit-editors-canvases.mdx +17 -0
- package/corpus/core/docs/content/locales/zh-TW/agent-native-toolkit.mdx +69 -62
- package/corpus/core/docs/content/locales/zh-TW/toolkit-capability-packages.mdx +21 -0
- package/corpus/core/docs/content/locales/zh-TW/toolkit-context-knowledge.mdx +12 -0
- package/corpus/core/docs/content/locales/zh-TW/toolkit-editors-canvases.mdx +17 -0
- package/corpus/core/docs/content/toolkit-capability-packages.mdx +52 -0
- package/corpus/core/docs/content/toolkit-context-knowledge.mdx +46 -0
- package/corpus/core/docs/content/toolkit-editors-canvases.mdx +55 -0
- package/corpus/core/package.json +35 -34
- package/corpus/core/src/cli/create.ts +57 -15
- package/corpus/core/src/cli/package-lifecycle.ts +2 -0
- package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +2 -0
- package/corpus/core/src/client/context-xray/ContextMeter.tsx +31 -111
- package/corpus/core/src/client/context-xray/ContextSegmentRow.tsx +8 -111
- package/corpus/core/src/client/context-xray/ContextTreemap.tsx +6 -111
- package/corpus/core/src/client/context-xray/ContextXRayPanel.tsx +31 -391
- package/corpus/core/src/client/context-xray/SegmentProvenancePopover.tsx +4 -52
- package/corpus/core/src/client/context-xray/format.ts +0 -33
- package/corpus/core/src/client/require-session.tsx +19 -3
- package/corpus/core/src/client/rich-markdown-editor/index.ts +42 -57
- package/corpus/core/src/client/rich-markdown-editor/uploadEditorImage.ts +2 -1
- package/corpus/core/src/client/use-action.ts +145 -2
- package/corpus/core/src/client/use-session.ts +79 -48
- package/corpus/core/src/client/visual-style-controls.tsx +1 -1088
- package/corpus/core/src/collab/agent-identity.ts +5 -22
- package/corpus/core/src/collab/client.ts +1 -53
- package/corpus/core/src/db/client.ts +13 -7
- package/corpus/core/src/db/create-get-db.ts +20 -13
- package/corpus/core/src/db/request-telemetry.ts +154 -0
- package/corpus/core/src/integrations/index.ts +1 -0
- package/corpus/core/src/integrations/plugin.ts +9 -3
- package/corpus/core/src/integrations/remote-push-delivery-job.ts +48 -0
- package/corpus/core/src/integrations/remote-push-delivery.ts +370 -0
- package/corpus/core/src/integrations/remote-push-store.ts +275 -26
- package/corpus/core/src/server/better-auth-instance.ts +11 -3
- package/corpus/core/src/server/core-routes-plugin.ts +36 -14
- package/corpus/core/src/server/framework-request-handler.ts +11 -1
- package/corpus/core/src/server/http-response-telemetry.ts +233 -31
- package/corpus/core/src/styles/rich-markdown-editor.css +1 -510
- package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +19 -0
- package/corpus/core/src/testing.ts +1 -1
- package/corpus/core/src/vite/client.ts +3 -0
- package/corpus/templates/clips/actions/finalize-recording.ts +3 -1
- package/corpus/templates/clips/actions/set-mobile-capture-state.ts +4 -1
- package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -6
- package/corpus/templates/clips/changelog/2026-07-18-new-recording-is-now-emphasized-as-the-primary-action-in-the.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-18-recordings-now-remain-safely-recoverable-until-the-stored-me.md +6 -0
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +5 -3
- package/corpus/templates/content/app/components/editor/extensions/DragHandle.tsx +4 -4
- package/corpus/templates/content/package.json +25 -25
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +2 -1
- package/corpus/templates/design/package.json +1 -1
- package/corpus/templates/mail/package.json +9 -9
- package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +2 -0
- package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +8 -8
- package/corpus/templates/plan/app/components/editor/planSlashCommands.ts +6 -6
- package/corpus/templates/plan/app/components/plan/PlanImageNode.tsx +4 -7
- package/corpus/templates/plan/app/components/plan/PlanMarkdownEditor.tsx +6 -4
- package/corpus/templates/plan/app/components/plan/PlanVisualSurface.tsx +1 -1
- package/corpus/templates/plan/changelog/2026-07-18-visual-plans-now-open-on-wireframes-by-default-when-a-protot.md +6 -0
- package/corpus/templates/plan/package.json +3 -3
- package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +2 -2
- package/corpus/templates/slides/app/components/editor/TweaksPanel.tsx +2 -2
- package/corpus/templates/slides/package.json +13 -13
- package/corpus/templates/tasks/AGENTS.md +3 -0
- package/corpus/templates/tasks/actions/render-task-list-inline.ts +202 -0
- package/corpus/templates/tasks/changelog/2026-07-18-task-lists-can-now-appear-as-interactive-widgets-inline-in-c.md +6 -0
- package/corpus/templates/tasks/docs/features/f8-chat.mdx +2 -0
- package/corpus/templates/tasks/server/plugins/agent-chat.ts +2 -0
- package/dist/catalog.json +39 -1
- package/dist/cli/create.d.ts +10 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +49 -16
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/package-lifecycle.d.ts.map +1 -1
- package/dist/cli/package-lifecycle.js +2 -0
- package/dist/cli/package-lifecycle.js.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.js +2 -0
- package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
- package/dist/client/context-xray/ContextMeter.d.ts.map +1 -1
- package/dist/client/context-xray/ContextMeter.js +8 -23
- package/dist/client/context-xray/ContextMeter.js.map +1 -1
- package/dist/client/context-xray/ContextSegmentRow.d.ts.map +1 -1
- package/dist/client/context-xray/ContextSegmentRow.js +3 -19
- package/dist/client/context-xray/ContextSegmentRow.js.map +1 -1
- package/dist/client/context-xray/ContextTreemap.d.ts.map +1 -1
- package/dist/client/context-xray/ContextTreemap.js +3 -54
- package/dist/client/context-xray/ContextTreemap.js.map +1 -1
- package/dist/client/context-xray/ContextXRayPanel.d.ts.map +1 -1
- package/dist/client/context-xray/ContextXRayPanel.js +21 -163
- package/dist/client/context-xray/ContextXRayPanel.js.map +1 -1
- package/dist/client/context-xray/SegmentProvenancePopover.d.ts.map +1 -1
- package/dist/client/context-xray/SegmentProvenancePopover.js +3 -4
- package/dist/client/context-xray/SegmentProvenancePopover.js.map +1 -1
- package/dist/client/context-xray/format.d.ts +0 -4
- package/dist/client/context-xray/format.d.ts.map +1 -1
- package/dist/client/context-xray/format.js +0 -49
- package/dist/client/context-xray/format.js.map +1 -1
- package/dist/client/require-session.d.ts.map +1 -1
- package/dist/client/require-session.js +6 -3
- package/dist/client/require-session.js.map +1 -1
- package/dist/client/rich-markdown-editor/index.d.ts +1 -12
- package/dist/client/rich-markdown-editor/index.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/index.js +1 -12
- package/dist/client/rich-markdown-editor/index.js.map +1 -1
- package/dist/client/rich-markdown-editor/uploadEditorImage.d.ts +1 -1
- package/dist/client/rich-markdown-editor/uploadEditorImage.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/uploadEditorImage.js.map +1 -1
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +117 -1
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-session.d.ts.map +1 -1
- package/dist/client/use-session.js +72 -50
- package/dist/client/use-session.js.map +1 -1
- package/dist/client/visual-style-controls.d.ts +1 -89
- package/dist/client/visual-style-controls.d.ts.map +1 -1
- package/dist/client/visual-style-controls.js +1 -498
- package/dist/client/visual-style-controls.js.map +1 -1
- package/dist/collab/agent-identity.d.ts +1 -14
- package/dist/collab/agent-identity.d.ts.map +1 -1
- package/dist/collab/agent-identity.js +1 -13
- package/dist/collab/agent-identity.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/client.d.ts +1 -19
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +1 -53
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +7 -1
- package/dist/db/client.js.map +1 -1
- package/dist/db/create-get-db.d.ts +3 -6
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +9 -2
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/db/request-telemetry.d.ts +23 -0
- package/dist/db/request-telemetry.d.ts.map +1 -0
- package/dist/db/request-telemetry.js +95 -0
- package/dist/db/request-telemetry.js.map +1 -0
- package/dist/integrations/index.d.ts +1 -0
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +1 -0
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +8 -3
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/remote-push-delivery-job.d.ts +4 -0
- package/dist/integrations/remote-push-delivery-job.d.ts.map +1 -0
- package/dist/integrations/remote-push-delivery-job.js +44 -0
- package/dist/integrations/remote-push-delivery-job.js.map +1 -0
- package/dist/integrations/remote-push-delivery.d.ts +11 -0
- package/dist/integrations/remote-push-delivery.d.ts.map +1 -0
- package/dist/integrations/remote-push-delivery.js +265 -0
- package/dist/integrations/remote-push-delivery.js.map +1 -0
- package/dist/integrations/remote-push-store.d.ts +33 -0
- package/dist/integrations/remote-push-store.d.ts.map +1 -1
- package/dist/integrations/remote-push-store.js +195 -26
- package/dist/integrations/remote-push-store.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/better-auth-instance.js +7 -3
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +8 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +23 -8
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +9 -1
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/http-response-telemetry.d.ts +3 -2
- package/dist/server/http-response-telemetry.d.ts.map +1 -1
- package/dist/server/http-response-telemetry.js +160 -27
- package/dist/server/http-response-telemetry.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/styles/rich-markdown-editor.css +1 -510
- package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +19 -0
- package/dist/testing.d.ts +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +1 -1
- package/dist/testing.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +3 -0
- package/dist/vite/client.js.map +1 -1
- package/docs/content/agent-native-toolkit.mdx +46 -13
- package/docs/content/locales/ar-SA/agent-native-toolkit.mdx +79 -55
- package/docs/content/locales/ar-SA/toolkit-capability-packages.mdx +21 -0
- package/docs/content/locales/ar-SA/toolkit-context-knowledge.mdx +12 -0
- package/docs/content/locales/ar-SA/toolkit-editors-canvases.mdx +17 -0
- package/docs/content/locales/de-DE/agent-native-toolkit.mdx +82 -54
- package/docs/content/locales/de-DE/toolkit-capability-packages.mdx +21 -0
- package/docs/content/locales/de-DE/toolkit-context-knowledge.mdx +12 -0
- package/docs/content/locales/de-DE/toolkit-editors-canvases.mdx +17 -0
- package/docs/content/locales/es-ES/agent-native-toolkit.mdx +81 -52
- package/docs/content/locales/es-ES/toolkit-capability-packages.mdx +21 -0
- package/docs/content/locales/es-ES/toolkit-context-knowledge.mdx +12 -0
- package/docs/content/locales/es-ES/toolkit-editors-canvases.mdx +21 -0
- package/docs/content/locales/fr-FR/agent-native-toolkit.mdx +84 -54
- package/docs/content/locales/fr-FR/toolkit-capability-packages.mdx +21 -0
- package/docs/content/locales/fr-FR/toolkit-context-knowledge.mdx +12 -0
- package/docs/content/locales/fr-FR/toolkit-editors-canvases.mdx +21 -0
- package/docs/content/locales/hi-IN/agent-native-toolkit.mdx +69 -62
- package/docs/content/locales/hi-IN/toolkit-capability-packages.mdx +21 -0
- package/docs/content/locales/hi-IN/toolkit-context-knowledge.mdx +12 -0
- package/docs/content/locales/hi-IN/toolkit-editors-canvases.mdx +17 -0
- package/docs/content/locales/ja-JP/agent-native-toolkit.mdx +69 -62
- package/docs/content/locales/ja-JP/toolkit-capability-packages.mdx +21 -0
- package/docs/content/locales/ja-JP/toolkit-context-knowledge.mdx +12 -0
- package/docs/content/locales/ja-JP/toolkit-editors-canvases.mdx +17 -0
- package/docs/content/locales/ko-KR/agent-native-toolkit.mdx +69 -62
- package/docs/content/locales/ko-KR/toolkit-capability-packages.mdx +21 -0
- package/docs/content/locales/ko-KR/toolkit-context-knowledge.mdx +12 -0
- package/docs/content/locales/ko-KR/toolkit-editors-canvases.mdx +17 -0
- package/docs/content/locales/pt-BR/agent-native-toolkit.mdx +82 -54
- package/docs/content/locales/pt-BR/toolkit-capability-packages.mdx +21 -0
- package/docs/content/locales/pt-BR/toolkit-context-knowledge.mdx +12 -0
- package/docs/content/locales/pt-BR/toolkit-editors-canvases.mdx +17 -0
- package/docs/content/locales/zh-CN/agent-native-toolkit.mdx +69 -62
- package/docs/content/locales/zh-CN/toolkit-capability-packages.mdx +21 -0
- package/docs/content/locales/zh-CN/toolkit-context-knowledge.mdx +12 -0
- package/docs/content/locales/zh-CN/toolkit-editors-canvases.mdx +17 -0
- package/docs/content/locales/zh-TW/agent-native-toolkit.mdx +69 -62
- package/docs/content/locales/zh-TW/toolkit-capability-packages.mdx +21 -0
- package/docs/content/locales/zh-TW/toolkit-context-knowledge.mdx +12 -0
- package/docs/content/locales/zh-TW/toolkit-editors-canvases.mdx +17 -0
- package/docs/content/toolkit-capability-packages.mdx +52 -0
- package/docs/content/toolkit-context-knowledge.mdx +46 -0
- package/docs/content/toolkit-editors-canvases.mdx +55 -0
- package/package.json +27 -26
- package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +19 -0
- package/corpus/core/src/client/rich-markdown-editor/BubbleToolbar.tsx +0 -253
- package/corpus/core/src/client/rich-markdown-editor/CodeBlockNode.tsx +0 -258
- package/corpus/core/src/client/rich-markdown-editor/DragHandle.ts +0 -1437
- package/corpus/core/src/client/rich-markdown-editor/ImageExtension.ts +0 -306
- package/corpus/core/src/client/rich-markdown-editor/RichMarkdownEditor.tsx +0 -80
- package/corpus/core/src/client/rich-markdown-editor/RunId.ts +0 -61
- package/corpus/core/src/client/rich-markdown-editor/SharedRichEditor.tsx +0 -321
- package/corpus/core/src/client/rich-markdown-editor/SlashCommandMenu.tsx +0 -310
- package/corpus/core/src/client/rich-markdown-editor/extensions.ts +0 -402
- package/corpus/core/src/client/rich-markdown-editor/gfmDoc.ts +0 -92
- package/corpus/core/src/client/rich-markdown-editor/surgical-apply.ts +0 -192
- package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +0 -590
- package/dist/client/rich-markdown-editor/BubbleToolbar.d.ts +0 -37
- package/dist/client/rich-markdown-editor/BubbleToolbar.d.ts.map +0 -1
- package/dist/client/rich-markdown-editor/BubbleToolbar.js +0 -171
- package/dist/client/rich-markdown-editor/BubbleToolbar.js.map +0 -1
- package/dist/client/rich-markdown-editor/CodeBlockNode.d.ts +0 -49
- package/dist/client/rich-markdown-editor/CodeBlockNode.d.ts.map +0 -1
- package/dist/client/rich-markdown-editor/CodeBlockNode.js +0 -127
- package/dist/client/rich-markdown-editor/CodeBlockNode.js.map +0 -1
- package/dist/client/rich-markdown-editor/DragHandle.d.ts +0 -97
- package/dist/client/rich-markdown-editor/DragHandle.d.ts.map +0 -1
- package/dist/client/rich-markdown-editor/DragHandle.js +0 -1066
- package/dist/client/rich-markdown-editor/DragHandle.js.map +0 -1
- package/dist/client/rich-markdown-editor/ImageExtension.d.ts +0 -63
- package/dist/client/rich-markdown-editor/ImageExtension.d.ts.map +0 -1
- package/dist/client/rich-markdown-editor/ImageExtension.js +0 -243
- package/dist/client/rich-markdown-editor/ImageExtension.js.map +0 -1
- package/dist/client/rich-markdown-editor/RichMarkdownEditor.d.ts +0 -51
- package/dist/client/rich-markdown-editor/RichMarkdownEditor.d.ts.map +0 -1
- package/dist/client/rich-markdown-editor/RichMarkdownEditor.js +0 -37
- package/dist/client/rich-markdown-editor/RichMarkdownEditor.js.map +0 -1
- package/dist/client/rich-markdown-editor/RunId.d.ts +0 -28
- package/dist/client/rich-markdown-editor/RunId.d.ts.map +0 -1
- package/dist/client/rich-markdown-editor/RunId.js +0 -60
- package/dist/client/rich-markdown-editor/RunId.js.map +0 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +0 -110
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +0 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.js +0 -144
- package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +0 -1
- package/dist/client/rich-markdown-editor/SlashCommandMenu.d.ts +0 -41
- package/dist/client/rich-markdown-editor/SlashCommandMenu.d.ts.map +0 -1
- package/dist/client/rich-markdown-editor/SlashCommandMenu.js +0 -221
- package/dist/client/rich-markdown-editor/SlashCommandMenu.js.map +0 -1
- package/dist/client/rich-markdown-editor/extensions.d.ts +0 -178
- package/dist/client/rich-markdown-editor/extensions.d.ts.map +0 -1
- package/dist/client/rich-markdown-editor/extensions.js +0 -224
- package/dist/client/rich-markdown-editor/extensions.js.map +0 -1
- package/dist/client/rich-markdown-editor/gfmDoc.d.ts +0 -24
- package/dist/client/rich-markdown-editor/gfmDoc.d.ts.map +0 -1
- package/dist/client/rich-markdown-editor/gfmDoc.js +0 -83
- package/dist/client/rich-markdown-editor/gfmDoc.js.map +0 -1
- package/dist/client/rich-markdown-editor/surgical-apply.d.ts +0 -66
- package/dist/client/rich-markdown-editor/surgical-apply.d.ts.map +0 -1
- package/dist/client/rich-markdown-editor/surgical-apply.js +0 -147
- package/dist/client/rich-markdown-editor/surgical-apply.js.map +0 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts +0 -110
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +0 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.js +0 -441
- package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visual-style-controls.js","sourceRoot":"","sources":["../../src/client/visual-style-controls.tsx"],"names":[],"mappings":"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","sourcesContent":["import { IconColorPicker } from \"@tabler/icons-react\";\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n type KeyboardEvent,\n type PointerEvent,\n type ReactNode,\n} from \"react\";\n\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"./components/ui/popover.js\";\nimport { cn } from \"./utils.js\";\n\nexport type VisualControlValue = string | number | boolean;\n\nexport interface VisualControlOption {\n label: string;\n value: string;\n color?: string;\n}\n\nexport interface VisualTweakDefinition {\n id: string;\n label: string;\n type: \"color-swatch\" | \"color-swatches\" | \"segment\" | \"slider\" | \"toggle\";\n options?: VisualControlOption[];\n min?: number;\n max?: number;\n step?: number;\n defaultValue: VisualControlValue;\n cssVar?: string;\n unit?: string;\n}\n\nfunction clampNumber(value: number, min?: number, max?: number) {\n let next = value;\n if (typeof min === \"number\") next = Math.max(min, next);\n if (typeof max === \"number\") next = Math.min(max, next);\n return next;\n}\n\nfunction formatNumber(value: number, unit?: string) {\n const rounded = Number.isInteger(value) ? value : Number(value.toFixed(2));\n return unit ? `${rounded}${unit}` : String(rounded);\n}\n\nfunction parseDraftNumber(value: string, fallback: number) {\n const match = value.trim().match(/-?\\d+(?:\\.\\d+)?/);\n if (!match) return fallback;\n const next = Number(match[0]);\n return Number.isFinite(next) ? next : fallback;\n}\n\ninterface RgbaColor {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\ninterface HsvaColor {\n h: number;\n s: number;\n v: number;\n a: number;\n}\n\nconst CHECKERBOARD_IMAGE =\n \"linear-gradient(45deg, #d4d4d4 25%, transparent 25%), linear-gradient(-45deg, #d4d4d4 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #d4d4d4 75%), linear-gradient(-45deg, transparent 75%, #d4d4d4 75%)\";\nconst FALLBACK_RGBA: RgbaColor = { r: 0, g: 0, b: 0, a: 1 };\n\nfunction normalizeRgba(color: RgbaColor): RgbaColor {\n return {\n r: clamp(color.r, 0, 255),\n g: clamp(color.g, 0, 255),\n b: clamp(color.b, 0, 255),\n a: clampFloat(color.a, 0, 1),\n };\n}\n\nfunction normalizeHexColor(value: string): string | null {\n const trimmed = value.trim();\n if (/^#[0-9a-f]{6}$/i.test(trimmed)) return trimmed.toUpperCase();\n if (/^[0-9a-f]{6}$/i.test(trimmed)) return `#${trimmed}`.toUpperCase();\n if (/^#[0-9a-f]{3}$/i.test(trimmed)) {\n return `#${trimmed\n .slice(1)\n .split(\"\")\n .map((char) => char + char)\n .join(\"\")}`.toUpperCase();\n }\n if (/^[0-9a-f]{3}$/i.test(trimmed)) {\n return `#${trimmed\n .split(\"\")\n .map((char) => char + char)\n .join(\"\")}`.toUpperCase();\n }\n return null;\n}\n\nfunction parseCssColor(value: string): RgbaColor | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n const normalizedHex = normalizeHexColor(trimmed);\n if (normalizedHex) {\n return normalizeRgba({\n r: Number.parseInt(normalizedHex.slice(1, 3), 16),\n g: Number.parseInt(normalizedHex.slice(3, 5), 16),\n b: Number.parseInt(normalizedHex.slice(5, 7), 16),\n a: 1,\n });\n }\n const rgb = trimmed.match(\n /^rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)(?:\\s*,\\s*([0-9.]+%?))?/i,\n );\n if (rgb) {\n return normalizeRgba({\n r: Number(rgb[1]),\n g: Number(rgb[2]),\n b: Number(rgb[3]),\n a: parseAlpha(rgb[4]),\n });\n }\n const lower = trimmed.toLowerCase();\n if (lower === \"transparent\" || lower === \"rgba(0, 0, 0, 0)\") {\n return { r: 0, g: 0, b: 0, a: 0 };\n }\n return null;\n}\n\nfunction channelToHex(value: number): string {\n return clamp(value, 0, 255).toString(16).padStart(2, \"0\");\n}\n\nfunction rgbaToHex(color: RgbaColor): string {\n const normalized = normalizeRgba(color);\n return `#${channelToHex(normalized.r)}${channelToHex(normalized.g)}${channelToHex(normalized.b)}`.toUpperCase();\n}\n\nfunction rgbaToCss(color: RgbaColor): string {\n const normalized = normalizeRgba(color);\n if (normalized.a >= 1) return rgbaToHex(normalized);\n return `rgba(${normalized.r}, ${normalized.g}, ${normalized.b}, ${trimNumber(normalized.a)})`;\n}\n\nfunction parseAlpha(value: string | undefined): number {\n if (!value) return 1;\n if (value.endsWith(\"%\")) return Number(value.slice(0, -1)) / 100;\n return Number(value);\n}\n\nfunction trimNumber(value: number) {\n return Number(value.toFixed(2)).toString();\n}\n\nfunction rgbaToHsv(color: RgbaColor): HsvaColor {\n const normalized = normalizeRgba(color);\n const r = normalized.r / 255;\n const g = normalized.g / 255;\n const b = normalized.b / 255;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const delta = max - min;\n\n let h = 0;\n if (delta !== 0) {\n if (max === r) h = ((g - b) / delta) % 6;\n else if (max === g) h = (b - r) / delta + 2;\n else h = (r - g) / delta + 4;\n h *= 60;\n if (h < 0) h += 360;\n }\n\n return {\n h: Math.round(h),\n s: max === 0 ? 0 : Math.round((delta / max) * 100),\n v: Math.round(max * 100),\n a: normalized.a,\n };\n}\n\nfunction hsvToRgba(color: HsvaColor): RgbaColor {\n const h = ((color.h % 360) + 360) % 360;\n const s = clampFloat(color.s, 0, 100) / 100;\n const v = clampFloat(color.v, 0, 100) / 100;\n const chroma = v * s;\n const x = chroma * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = v - chroma;\n\n let r = 0;\n let g = 0;\n let b = 0;\n if (h < 60) [r, g, b] = [chroma, x, 0];\n else if (h < 120) [r, g, b] = [x, chroma, 0];\n else if (h < 180) [r, g, b] = [0, chroma, x];\n else if (h < 240) [r, g, b] = [0, x, chroma];\n else if (h < 300) [r, g, b] = [x, 0, chroma];\n else [r, g, b] = [chroma, 0, x];\n\n return normalizeRgba({\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255),\n a: clampFloat(color.a, 0, 1),\n });\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n if (!Number.isFinite(value)) return min;\n return Math.max(min, Math.min(max, Math.round(value)));\n}\n\nfunction clampFloat(value: number, min: number, max: number): number {\n if (!Number.isFinite(value)) return min;\n return Math.max(min, Math.min(max, value));\n}\n\nfunction swatchBackground(value: string) {\n if (value === \"transparent\" || value === \"rgba(0, 0, 0, 0)\") {\n return {\n background: CHECKERBOARD_IMAGE,\n backgroundPosition: \"0 0, 0 4px, 4px -4px, -4px 0\",\n backgroundSize: \"8px 8px\",\n };\n }\n return { background: value };\n}\n\nexport function VisualInspectorPanel({\n title,\n subtitle,\n children,\n className,\n headerAction,\n}: {\n title: ReactNode;\n subtitle?: ReactNode;\n children: ReactNode;\n className?: string;\n headerAction?: ReactNode;\n}) {\n return (\n <aside\n className={cn(\n \"w-64 overflow-hidden rounded-xl border border-border bg-card/95 text-card-foreground shadow-2xl shadow-black/35 backdrop-blur\",\n className,\n )}\n >\n <div className=\"flex min-h-10 items-start justify-between gap-2 border-b border-border/70 px-3 py-2.5\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n {subtitle && (\n <div className=\"mt-0.5 truncate text-[12px] text-foreground\">\n {subtitle}\n </div>\n )}\n </div>\n {headerAction}\n </div>\n <div className=\"max-h-[min(680px,calc(100vh-7rem))] overflow-y-auto p-2\">\n {children}\n </div>\n </aside>\n );\n}\n\nexport function VisualInspectorSection({\n title,\n children,\n className,\n}: {\n title: ReactNode;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <section className={cn(\"rounded-lg px-1.5 py-2\", className)}>\n <div className=\"mb-2 px-1 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground/75\">\n {title}\n </div>\n <div className=\"space-y-2\">{children}</div>\n </section>\n );\n}\n\nexport function VisualControlRow({\n label,\n children,\n className,\n}: {\n label: ReactNode;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <div className={cn(\"grid gap-1\", className)}>\n <span className=\"text-[11px] text-muted-foreground\">{label}</span>\n {children}\n </div>\n );\n}\n\nexport function VisualSwatchControl({\n options,\n value,\n onChange,\n columns = 8,\n className,\n}: {\n options: VisualControlOption[];\n value: string;\n onChange: (value: string) => void;\n columns?: number;\n className?: string;\n}) {\n return (\n <div\n className={cn(\"grid gap-1.5\", className)}\n style={{ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }}\n >\n {options.map((option) => {\n const swatch = option.color ?? option.value;\n const isTransparent = swatch === \"transparent\";\n return (\n <button\n key={`${option.value}-${option.label}`}\n type=\"button\"\n title={option.label}\n aria-label={option.label}\n onClick={() => onChange(option.value)}\n className={cn(\n \"size-5 cursor-pointer rounded-md border border-border/70 transition-[transform,border-color] hover:scale-105 hover:border-foreground/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n value === option.value &&\n \"border-foreground/70 ring-2 ring-foreground/40 ring-offset-1 ring-offset-card\",\n )}\n style={{\n background: isTransparent\n ? \"linear-gradient(45deg, hsl(var(--muted)) 25%, transparent 25%), linear-gradient(-45deg, hsl(var(--muted)) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, hsl(var(--muted)) 75%), linear-gradient(-45deg, transparent 75%, hsl(var(--muted)) 75%)\"\n : swatch,\n backgroundPosition: isTransparent\n ? \"0 0, 0 4px, 4px -4px, -4px 0\"\n : undefined,\n backgroundSize: isTransparent ? \"8px 8px\" : undefined,\n }}\n />\n );\n })}\n </div>\n );\n}\n\nexport function VisualColorPicker({\n label,\n value,\n onChange,\n documentColors = [],\n allowTransparent = false,\n hexLabel = \"Hex\",\n documentColorsLabel = \"Document colors\",\n transparentLabel = \"Transparent\",\n className,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n documentColors?: string[];\n allowTransparent?: boolean;\n hexLabel?: string;\n documentColorsLabel?: string;\n transparentLabel?: string;\n className?: string;\n}) {\n const [open, setOpen] = useState(false);\n const color = parseCssColor(value) ?? FALLBACK_RGBA;\n const colorHex = rgbaToHex(color);\n const [draft, setDraft] = useState(colorHex.replace(/^#/, \"\"));\n const [picking, setPicking] = useState(false);\n const hasEyeDropper = typeof window !== \"undefined\" && \"EyeDropper\" in window;\n\n useEffect(() => {\n if (!open) setDraft(colorHex.replace(/^#/, \"\"));\n }, [colorHex, open]);\n\n const commitDraft = (nextDraft = draft) => {\n const normalized = normalizeHexColor(nextDraft);\n if (!normalized) {\n setDraft(colorHex.replace(/^#/, \"\"));\n return;\n }\n setDraft(normalized.replace(/^#/, \"\"));\n onChange(normalized);\n };\n\n const emitHsv = (nextHsv: HsvaColor) => {\n const nextColor = hsvToRgba({ ...nextHsv, a: color.a });\n const nextValue = rgbaToCss(nextColor);\n setDraft(rgbaToHex(nextColor).replace(/^#/, \"\"));\n onChange(nextValue);\n };\n\n const pickScreenColor = async () => {\n if (!hasEyeDropper || picking) return;\n try {\n setPicking(true);\n const EyeDropperCtor = (\n window as unknown as {\n EyeDropper?: new () => { open: () => Promise<{ sRGBHex: string }> };\n }\n ).EyeDropper;\n if (!EyeDropperCtor) return;\n const result = await new EyeDropperCtor().open();\n if (result?.sRGBHex) {\n const next = normalizeHexColor(result.sRGBHex);\n if (next) {\n setDraft(next.replace(/^#/, \"\"));\n onChange(next);\n }\n }\n } finally {\n setPicking(false);\n }\n };\n\n const uniqueDocumentColors = Array.from(\n new Set(\n documentColors\n .map((color) =>\n color === \"transparent\" ? color : normalizeHexColor(color),\n )\n .filter(Boolean) as string[],\n ),\n ).slice(0, 16);\n const displayValue =\n value === \"transparent\" || color.a === 0\n ? transparentLabel\n : colorHex.replace(/^#/, \"\");\n const hsv = rgbaToHsv(color);\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n className={cn(\n \"flex h-7 w-full cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background/70 px-2 text-[11px] shadow-none transition-colors hover:bg-accent/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n className,\n )}\n >\n <span\n className=\"size-4 shrink-0 rounded-[3px] border border-border/70\"\n style={swatchBackground(value)}\n />\n <span className=\"min-w-0 flex-1 truncate text-left font-medium tabular-nums text-foreground\">\n {displayValue}\n </span>\n <span\n aria-hidden=\"true\"\n className=\"size-0 border-x-[4px] border-t-[5px] border-x-transparent border-t-muted-foreground/70\"\n />\n </button>\n </PopoverTrigger>\n <PopoverContent\n side=\"left\"\n align=\"start\"\n sideOffset={8}\n className=\"z-[10000] w-[252px] p-0 text-[11px] shadow-xl\"\n onFocusOutside={(event) => event.preventDefault()}\n >\n <div className=\"rounded-md bg-popover text-popover-foreground\">\n <VisualSaturationBrightnessField\n hsv={hsv}\n label={label}\n onChange={emitHsv}\n />\n\n <div className=\"mt-2.5 px-3\">\n <div className=\"grid grid-cols-[1.5rem_1fr] items-center gap-x-2\">\n <div className=\"flex items-center justify-center\">\n <button\n type=\"button\"\n aria-label={label}\n disabled={!hasEyeDropper || picking}\n onClick={() => void pickScreenColor()}\n className={cn(\n \"flex size-6 cursor-pointer items-center justify-center rounded-sm text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n (!hasEyeDropper || picking) &&\n \"pointer-events-none opacity-40\",\n picking &&\n \"bg-primary/10 text-primary ring-1 ring-primary/50\",\n )}\n >\n <IconColorPicker className=\"size-4\" />\n </button>\n </div>\n <VisualColorTrack\n label={label}\n value={hsv.h}\n min={0}\n max={360}\n backgroundImage=\"linear-gradient(90deg, #ff0000, #ffff00, #00ff00, #00ffff, #0000ff, #ff00ff, #ff0000)\"\n onChange={(nextHue) =>\n emitHsv({ ...hsv, h: nextHue === 360 ? 0 : nextHue })\n }\n />\n <span\n className=\"mt-2 size-[18px] shrink-0 rounded-[3px] border border-border/60\"\n style={swatchBackground(rgbaToCss(color))}\n />\n <VisualColorTrack\n label={transparentLabel}\n value={Math.round(color.a * 100)}\n min={0}\n max={100}\n backgroundImage={`${CHECKERBOARD_IMAGE}, linear-gradient(90deg, rgba(${color.r}, ${color.g}, ${color.b}, 0), rgba(${color.r}, ${color.g}, ${color.b}, 1))`}\n backgroundSize=\"8px 8px, 8px 8px, 8px 8px, 8px 8px, 100% 100%\"\n backgroundPosition=\"0 0, 0 4px, 4px -4px, -4px 0, 0 0\"\n onChange={(nextOpacity) => {\n const nextColor = normalizeRgba({\n ...color,\n a: nextOpacity / 100,\n });\n const nextValue = rgbaToCss(nextColor);\n setDraft(rgbaToHex(nextColor).replace(/^#/, \"\"));\n onChange(nextValue);\n }}\n />\n </div>\n </div>\n\n <div className=\"mt-2.5 grid grid-cols-[4.5rem_1fr] items-center gap-1 border-b border-border/70 px-3 pb-3\">\n <span className=\"text-[11px] font-medium text-muted-foreground\">\n {hexLabel}\n </span>\n <input\n value={draft}\n spellCheck={false}\n onChange={(event) => setDraft(event.currentTarget.value)}\n onFocus={(event) => event.currentTarget.select()}\n onBlur={() => commitDraft()}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n commitDraft();\n event.currentTarget.blur();\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n setDraft(colorHex.replace(/^#/, \"\"));\n event.currentTarget.blur();\n }\n }}\n className=\"h-6 min-w-0 rounded-md border border-input bg-background/70 px-2 text-right text-[11px] uppercase tabular-nums outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring\"\n />\n </div>\n {(allowTransparent || uniqueDocumentColors.length > 0) && (\n <div className=\"px-3 py-2.5\">\n <div className=\"mb-2 flex h-5 items-center justify-between text-[11px] text-muted-foreground\">\n <span>{documentColorsLabel}</span>\n </div>\n <div className=\"grid grid-cols-8 gap-1\">\n {allowTransparent && (\n <button\n type=\"button\"\n aria-label={transparentLabel}\n aria-pressed={value === \"transparent\"}\n className={cn(\n \"size-5 cursor-pointer rounded-sm border transition-transform hover:scale-110 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n value === \"transparent\" || color.a === 0\n ? \"border-primary ring-1 ring-primary\"\n : \"border-border/60\",\n )}\n style={swatchBackground(\"transparent\")}\n onClick={() => {\n setDraft(colorHex.replace(/^#/, \"\"));\n onChange(\"transparent\");\n }}\n />\n )}\n {uniqueDocumentColors.map((color) => (\n <button\n key={color}\n type=\"button\"\n title={color}\n aria-label={color}\n aria-pressed={colorHex === color}\n className={cn(\n \"size-5 cursor-pointer rounded-sm border transition-transform hover:scale-110 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n colorHex === color\n ? \"border-primary ring-1 ring-primary\"\n : \"border-border/60\",\n )}\n style={swatchBackground(color)}\n onClick={() => {\n setDraft(color);\n onChange(color);\n }}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\nfunction VisualSaturationBrightnessField({\n hsv,\n label,\n onChange,\n}: {\n hsv: HsvaColor;\n label: string;\n onChange: (value: HsvaColor) => void;\n}) {\n const fieldRef = useRef<HTMLDivElement>(null);\n const draggingRef = useRef(false);\n const hueColor = rgbaToCss(hsvToRgba({ h: hsv.h, s: 100, v: 100, a: 1 }));\n\n const updateFromPointer = (event: PointerEvent<HTMLDivElement>) => {\n const rect = fieldRef.current?.getBoundingClientRect();\n if (!rect) return;\n onChange({\n ...hsv,\n s: clamp(((event.clientX - rect.left) / rect.width) * 100, 0, 100),\n v: clamp(100 - ((event.clientY - rect.top) / rect.height) * 100, 0, 100),\n });\n };\n\n const stepWithKeyboard = (event: KeyboardEvent<HTMLDivElement>) => {\n const step = event.shiftKey ? 10 : 1;\n if (event.key === \"ArrowRight\") {\n event.preventDefault();\n onChange({ ...hsv, s: clamp(hsv.s + step, 0, 100) });\n }\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n onChange({ ...hsv, s: clamp(hsv.s - step, 0, 100) });\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n onChange({ ...hsv, v: clamp(hsv.v + step, 0, 100) });\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n onChange({ ...hsv, v: clamp(hsv.v - step, 0, 100) });\n }\n };\n\n return (\n <div\n ref={fieldRef}\n tabIndex={0}\n aria-label={label}\n onPointerDown={(event) => {\n draggingRef.current = true;\n event.currentTarget.setPointerCapture(event.pointerId);\n updateFromPointer(event);\n }}\n onPointerMove={(event) => {\n if (!draggingRef.current) return;\n updateFromPointer(event);\n }}\n onPointerUp={(event) => {\n draggingRef.current = false;\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n }}\n onPointerCancel={() => {\n draggingRef.current = false;\n }}\n onKeyDown={stepWithKeyboard}\n className=\"relative h-40 w-full cursor-crosshair overflow-hidden rounded-t-md outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset active:cursor-grabbing\"\n style={{\n backgroundImage: `linear-gradient(to top, #000 0%, transparent 100%), linear-gradient(to right, #fff 0%, ${hueColor} 100%)`,\n }}\n >\n <span\n className=\"pointer-events-none absolute size-4 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white shadow-[0_0_0_1px_hsl(var(--foreground)/0.6)]\"\n style={{\n left: `${hsv.s}%`,\n top: `${100 - hsv.v}%`,\n }}\n />\n </div>\n );\n}\n\nfunction VisualColorTrack({\n label,\n value,\n min,\n max,\n backgroundImage,\n backgroundSize,\n backgroundPosition,\n onChange,\n}: {\n label: string;\n value: number;\n min: number;\n max: number;\n backgroundImage: string;\n backgroundSize?: string;\n backgroundPosition?: string;\n onChange: (value: number) => void;\n}) {\n const trackRef = useRef<HTMLDivElement>(null);\n const draggingRef = useRef(false);\n const percent = ((value - min) / (max - min)) * 100;\n\n const updateFromPointer = (event: PointerEvent<HTMLDivElement>) => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect) return;\n const next = min + ((event.clientX - rect.left) / rect.width) * (max - min);\n onChange(clamp(next, min, max));\n };\n\n const stepWithKeyboard = (event: KeyboardEvent<HTMLDivElement>) => {\n const step = event.shiftKey ? 10 : 1;\n if (event.key === \"ArrowRight\" || event.key === \"ArrowUp\") {\n event.preventDefault();\n onChange(clamp(value + step, min, max));\n }\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n onChange(clamp(value - step, min, max));\n }\n if (event.key === \"Home\") {\n event.preventDefault();\n onChange(min);\n }\n if (event.key === \"End\") {\n event.preventDefault();\n onChange(max);\n }\n };\n\n return (\n <div\n ref={trackRef}\n role=\"slider\"\n tabIndex={0}\n aria-label={label}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={Math.round(value)}\n onKeyDown={stepWithKeyboard}\n onPointerDown={(event) => {\n draggingRef.current = true;\n event.currentTarget.setPointerCapture(event.pointerId);\n updateFromPointer(event);\n }}\n onPointerMove={(event) => {\n if (!draggingRef.current) return;\n updateFromPointer(event);\n }}\n onPointerUp={(event) => {\n draggingRef.current = false;\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n }}\n onPointerCancel={() => {\n draggingRef.current = false;\n }}\n className=\"relative h-3.5 cursor-pointer rounded-full border border-border/60 outline-none ring-offset-background focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 active:cursor-grabbing\"\n style={{ backgroundImage, backgroundSize, backgroundPosition }}\n >\n <span\n className=\"pointer-events-none absolute top-1/2 size-4 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white shadow-[0_0_0_1px_hsl(var(--foreground)/0.6)]\"\n style={{ left: `${clamp(percent, 0, 100)}%` }}\n />\n </div>\n );\n}\n\nexport function VisualSegmentedControl({\n options,\n value,\n onChange,\n className,\n}: {\n options: VisualControlOption[];\n value: string;\n onChange: (value: string) => void;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n \"flex min-h-7 overflow-hidden rounded-md border border-border bg-background/60\",\n className,\n )}\n >\n {options.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onClick={() => onChange(option.value)}\n className={cn(\n \"min-w-0 flex-1 cursor-pointer px-2 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-accent/70 hover:text-foreground\",\n value === option.value && \"bg-accent text-foreground\",\n )}\n >\n <span className=\"truncate\">{option.label}</span>\n </button>\n ))}\n </div>\n );\n}\n\nexport function VisualToggleControl({\n checked,\n onChange,\n label,\n}: {\n checked: boolean;\n onChange: (checked: boolean) => void;\n label?: string;\n}) {\n return (\n <button\n type=\"button\"\n aria-pressed={checked}\n aria-label={label}\n onClick={() => onChange(!checked)}\n className={cn(\n \"relative h-5 w-9 cursor-pointer rounded-full border border-border transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n checked ? \"bg-primary/35\" : \"bg-muted\",\n )}\n >\n <span\n className={cn(\n \"absolute top-1/2 size-3.5 -translate-y-1/2 rounded-full bg-foreground shadow transition-transform\",\n checked ? \"translate-x-[18px]\" : \"translate-x-[3px]\",\n )}\n />\n </button>\n );\n}\n\nexport function VisualSliderControl({\n value,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n unit,\n}: {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n unit?: string;\n}) {\n const safeValue = clampNumber(Number.isFinite(value) ? value : min, min, max);\n return (\n <div className=\"flex h-7 items-center gap-2\">\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={safeValue}\n onChange={(event) => onChange(Number(event.currentTarget.value))}\n className=\"min-w-0 flex-1 cursor-pointer accent-foreground\"\n />\n <span className=\"w-9 text-right text-[11px] tabular-nums text-muted-foreground\">\n {formatNumber(safeValue, unit)}\n </span>\n </div>\n );\n}\n\nexport function VisualScrubInput({\n label,\n value,\n onChange,\n min,\n max,\n step = 1,\n unit,\n disabled = false,\n}: {\n label: string;\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n unit?: string;\n disabled?: boolean;\n}) {\n const id = useId();\n const [draft, setDraft] = useState(() => formatNumber(value, unit));\n const [focused, setFocused] = useState(false);\n const dragRef = useRef<{\n pointerId: number;\n prevX: number;\n dragged: boolean;\n } | null>(null);\n\n useEffect(() => {\n if (!focused) setDraft(formatNumber(value, unit));\n }, [focused, unit, value]);\n\n const commit = (nextDraft = draft) => {\n const parsed = parseDraftNumber(nextDraft, value);\n const next = clampNumber(parsed, min, max);\n onChange(next);\n setDraft(formatNumber(next, unit));\n };\n\n const setNext = (next: number) => {\n const clamped = clampNumber(next, min, max);\n onChange(clamped);\n setDraft(formatNumber(clamped, unit));\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n commit();\n event.currentTarget.blur();\n return;\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n setDraft(formatNumber(value, unit));\n event.currentTarget.blur();\n return;\n }\n if (event.key === \"ArrowUp\" || event.key === \"ArrowDown\") {\n event.preventDefault();\n const mult =\n event.shiftKey || event.metaKey ? 10 : event.altKey ? 0.1 : 1;\n const direction = event.key === \"ArrowUp\" ? 1 : -1;\n const base = parseDraftNumber(draft, value);\n setNext(base + direction * step * mult);\n }\n };\n\n const onPointerDown = (event: PointerEvent<HTMLLabelElement>) => {\n if (disabled || event.button !== 0) return;\n event.preventDefault();\n dragRef.current = {\n pointerId: event.pointerId,\n prevX: event.clientX,\n dragged: false,\n };\n event.currentTarget.setPointerCapture(event.pointerId);\n };\n\n const onPointerMove = (event: PointerEvent<HTMLLabelElement>) => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== event.pointerId) return;\n const delta = event.clientX - drag.prevX;\n if (delta === 0) return;\n drag.prevX = event.clientX;\n drag.dragged = true;\n const mult = event.shiftKey || event.metaKey ? 10 : event.altKey ? 0.1 : 1;\n setNext(value + delta * step * mult);\n };\n\n const onPointerUp = (event: PointerEvent<HTMLLabelElement>) => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== event.pointerId) return;\n event.currentTarget.releasePointerCapture(event.pointerId);\n dragRef.current = null;\n if (!drag.dragged) {\n document.getElementById(id)?.focus();\n }\n };\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <label\n htmlFor={id}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n className={cn(\n \"flex w-8 shrink-0 cursor-ew-resize select-none items-center justify-center rounded border border-transparent px-1 text-[10px] font-semibold text-muted-foreground hover:border-border hover:bg-accent/60\",\n disabled && \"cursor-not-allowed opacity-50\",\n )}\n >\n {label}\n </label>\n <input\n id={id}\n value={draft}\n disabled={disabled}\n onFocus={() => setFocused(true)}\n onBlur={() => {\n setFocused(false);\n commit();\n }}\n onChange={(event) => setDraft(event.currentTarget.value)}\n onKeyDown={onKeyDown}\n className=\"h-7 min-w-0 flex-1 rounded-md border border-input bg-background/70 px-2 text-right text-[11px] tabular-nums text-foreground outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring disabled:opacity-50\"\n />\n </div>\n );\n}\n\nexport function VisualTweakControl({\n tweak,\n value,\n onChange,\n className,\n}: {\n tweak: VisualTweakDefinition;\n value: VisualControlValue;\n onChange: (value: VisualControlValue) => void;\n className?: string;\n}) {\n if (tweak.type === \"toggle\") {\n return (\n <div\n className={cn(\"flex h-7 items-center justify-between gap-2\", className)}\n >\n <span className=\"truncate text-[11px] text-muted-foreground\">\n {tweak.label}\n </span>\n <VisualToggleControl\n checked={Boolean(value)}\n onChange={onChange}\n label={tweak.label}\n />\n </div>\n );\n }\n\n const numericValue =\n typeof value === \"number\"\n ? value\n : typeof value === \"string\"\n ? Number(value)\n : Number(tweak.defaultValue);\n\n return (\n <VisualControlRow label={tweak.label} className={className}>\n {((tweak.type as string) === \"color-swatch\" ||\n (tweak.type as string) === \"color-swatches\") && (\n <VisualColorPicker\n label={tweak.label}\n value={String(value)}\n documentColors={(tweak.options ?? []).map(\n (option) => option.color ?? option.value,\n )}\n onChange={onChange}\n />\n )}\n {tweak.type === \"segment\" && (\n <VisualSegmentedControl\n options={tweak.options ?? []}\n value={String(value)}\n onChange={onChange}\n />\n )}\n {tweak.type === \"slider\" && (\n <VisualSliderControl\n min={tweak.min ?? 0}\n max={tweak.max ?? 100}\n step={tweak.step ?? 1}\n unit={\n tweak.unit ??\n (tweak.cssVar?.toLowerCase().includes(\"radius\") ? \"px\" : undefined)\n }\n value={Number.isFinite(numericValue) ? numericValue : 0}\n onChange={onChange}\n />\n )}\n </VisualControlRow>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"visual-style-controls.js","sourceRoot":"","sources":["../../src/client/visual-style-controls.tsx"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC","sourcesContent":["export * from \"@agent-native/toolkit/design-tweaks\";\n"]}
|
|
@@ -1,15 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Canonical agent identity constants for collaborative editing.
|
|
3
|
-
*
|
|
4
|
-
* Centralizes the agent's client ID, name, email, and cursor color
|
|
5
|
-
* so templates don't hardcode these values.
|
|
6
|
-
*/
|
|
7
|
-
export declare const AGENT_CLIENT_ID = 2147483647;
|
|
8
|
-
export interface AgentIdentity {
|
|
9
|
-
clientId: number;
|
|
10
|
-
name: string;
|
|
11
|
-
email: string;
|
|
12
|
-
color: string;
|
|
13
|
-
}
|
|
14
|
-
export declare const DEFAULT_AGENT_IDENTITY: AgentIdentity;
|
|
1
|
+
export { AGENT_CLIENT_ID, DEFAULT_AGENT_IDENTITY, type AgentIdentity, } from "@agent-native/toolkit/collab-ui";
|
|
15
2
|
//# sourceMappingURL=agent-identity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-identity.d.ts","sourceRoot":"","sources":["../../src/collab/agent-identity.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"agent-identity.d.ts","sourceRoot":"","sources":["../../src/collab/agent-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,KAAK,aAAa,GACnB,MAAM,iCAAiC,CAAC"}
|
|
@@ -1,14 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Canonical agent identity constants for collaborative editing.
|
|
3
|
-
*
|
|
4
|
-
* Centralizes the agent's client ID, name, email, and cursor color
|
|
5
|
-
* so templates don't hardcode these values.
|
|
6
|
-
*/
|
|
7
|
-
export const AGENT_CLIENT_ID = 2147483647; // Max 32-bit signed int, reserved for agent
|
|
8
|
-
export const DEFAULT_AGENT_IDENTITY = {
|
|
9
|
-
clientId: AGENT_CLIENT_ID,
|
|
10
|
-
name: "AI Assistant",
|
|
11
|
-
email: "agent@system",
|
|
12
|
-
color: "#00B5FF", // agent-native blue
|
|
13
|
-
};
|
|
1
|
+
export { AGENT_CLIENT_ID, DEFAULT_AGENT_IDENTITY, } from "@agent-native/toolkit/collab-ui";
|
|
14
2
|
//# sourceMappingURL=agent-identity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-identity.js","sourceRoot":"","sources":["../../src/collab/agent-identity.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"agent-identity.js","sourceRoot":"","sources":["../../src/collab/agent-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,sBAAsB,GAEvB,MAAM,iCAAiC,CAAC","sourcesContent":["export {\n AGENT_CLIENT_ID,\n DEFAULT_AGENT_IDENTITY,\n type AgentIdentity,\n} from \"@agent-native/toolkit/collab-ui\";\n"]}
|
|
@@ -62,11 +62,11 @@ export declare const postAwareness: import("h3").EventHandlerWithFetch<import("h
|
|
|
62
62
|
error: string;
|
|
63
63
|
states?: undefined;
|
|
64
64
|
} | {
|
|
65
|
+
error?: undefined;
|
|
65
66
|
states: {
|
|
66
67
|
clientId: number;
|
|
67
68
|
state: string;
|
|
68
69
|
}[];
|
|
69
|
-
error?: undefined;
|
|
70
70
|
}>>;
|
|
71
71
|
/**
|
|
72
72
|
* GET /_agent-native/collab/:docId/users
|
|
@@ -77,10 +77,10 @@ export declare const getActiveUsers: import("h3").EventHandlerWithFetch<import("
|
|
|
77
77
|
error: string;
|
|
78
78
|
users?: undefined;
|
|
79
79
|
} | {
|
|
80
|
+
error?: undefined;
|
|
80
81
|
users: {
|
|
81
82
|
clientId: number;
|
|
82
83
|
lastSeen: number;
|
|
83
84
|
}[];
|
|
84
|
-
error?: undefined;
|
|
85
85
|
}>>;
|
|
86
86
|
//# sourceMappingURL=awareness.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"awareness.d.ts","sourceRoot":"","sources":["../../src/collab/awareness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgB3C,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD,eAAO,MAAM,sBAAsB,EAAG,kBAA2B,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD,wBAAgB,mBAAmB,IAAI,YAAY,CAElD;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,cAAc,GAAG,SAAS,GAChC,IAAI,CAON;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAClD,KAAK,CAAC,EAAE,cAAc,GACrB,IAAI,CAgBN;AAoBD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,MAAmB,GAC7B,IAAI,CAON;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE1E;AAiBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAO1E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI,CAOnE;AAkCD;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"awareness.d.ts","sourceRoot":"","sources":["../../src/collab/awareness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgB3C,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAOD,eAAO,MAAM,sBAAsB,EAAG,kBAA2B,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD,wBAAgB,mBAAmB,IAAI,YAAY,CAElD;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,cAAc,GAAG,SAAS,GAChC,IAAI,CAON;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,EAClD,KAAK,CAAC,EAAE,cAAc,GACrB,IAAI,CAgBN;AAoBD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,MAAmB,GAC7B,IAAI,CAON;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE1E;AAiBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAO1E;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI,CAOnE;AAkCD;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa;;;;;;kBAwDa,MAAM;eAAS,MAAM;;GAoB1D,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,cAAc;;;;;;kBAYM,MAAM;kBAAY,MAAM;;GAMvD,CAAC"}
|
package/dist/collab/client.d.ts
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
import { type CollabUser } from "@agent-native/toolkit/collab-ui";
|
|
38
38
|
import { Awareness } from "y-protocols/awareness";
|
|
39
39
|
import * as Y from "yjs";
|
|
40
|
-
export { dedupeCollabUsersByEmail, emailToColor, emailToName, type CollabUser, } from "@agent-native/toolkit/collab-ui";
|
|
40
|
+
export { dedupeCollabUsersByEmail, emailToColor, emailToName, isReconcileLeadClient, type CollabUser, } from "@agent-native/toolkit/collab-ui";
|
|
41
41
|
export interface UseCollaborativeDocOptions {
|
|
42
42
|
/** Document ID to collaborate on. Pass null to disable. */
|
|
43
43
|
docId: string | null;
|
|
@@ -70,24 +70,6 @@ export interface UseCollaborativeDocResult {
|
|
|
70
70
|
/** True when the AI agent has an active awareness entry (durable presence). */
|
|
71
71
|
agentPresent: boolean;
|
|
72
72
|
}
|
|
73
|
-
/**
|
|
74
|
-
* Leader election for applying authoritative external snapshots into a shared
|
|
75
|
-
* collaborative document.
|
|
76
|
-
*
|
|
77
|
-
* When the agent (or a Notion pull, or any full-document rewrite) writes new
|
|
78
|
-
* content to SQL, the open editor reconciles it into the live Y.Doc with
|
|
79
|
-
* `setContent`. If EVERY connected client did that independently, each would
|
|
80
|
-
* diff the same snapshot into the CRDT and the changed region would be inserted
|
|
81
|
-
* N times (concurrent inserts at the same position → duplicated text). So only
|
|
82
|
-
* ONE client — the "lead" — applies the snapshot; every other client receives
|
|
83
|
-
* the result through normal Yjs sync.
|
|
84
|
-
*
|
|
85
|
-
* The lead is the present client with the lowest Yjs `clientID`. The agent's
|
|
86
|
-
* awareness entry uses `AGENT_CLIENT_ID` (max int) so it can never be the lead,
|
|
87
|
-
* and a client editing alone is always the lead. This is deterministic across
|
|
88
|
-
* clients with no coordination round-trip.
|
|
89
|
-
*/
|
|
90
|
-
export declare function isReconcileLeadClient(awareness: Awareness | null | undefined, localClientId: number | null | undefined): boolean;
|
|
91
73
|
export interface RemoteAwarenessSnapshot {
|
|
92
74
|
clientId: number;
|
|
93
75
|
state: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/collab/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAEL,KAAK,UAAU,EAChB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/collab/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAEL,KAAK,UAAU,EAChB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAIzB,OAAO,EACL,wBAAwB,EACxB,YAAY,EACZ,WAAW,EACX,qBAAqB,EACrB,KAAK,UAAU,GAChB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,WAAW,0BAA0B;IACzC,2DAA2D;IAC3D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,4EAA4E;IAC5E,IAAI,EAAE,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC;IACnB,uDAAuD;IACvD,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,kEAAkE;IAClE,SAAS,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,QAAQ,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,6EAA6E;IAC7E,WAAW,EAAE,OAAO,CAAC;IACrB,+EAA+E;IAC/E,YAAY,EAAE,OAAO,CAAC;CACvB;AAiCD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,uBAAuB,EAAE,GACtC;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CA2B3D;AAu7BD,gBAAgB;AAChB,wBAAgB,+BAA+B,IAAI,IAAI,CAKtD;AAED,uEAAuE;AACvE,wBAAgB,8BAA8B,IAAI,MAAM,CAEvD;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,0BAA0B,GAClC,yBAAyB,CAkF3B"}
|
package/dist/collab/client.js
CHANGED
|
@@ -40,8 +40,7 @@ import { Awareness } from "y-protocols/awareness";
|
|
|
40
40
|
import * as Y from "yjs";
|
|
41
41
|
import { agentNativePath } from "../client/api-path.js";
|
|
42
42
|
import { subscribeSyncEvents } from "../client/use-db-sync.js";
|
|
43
|
-
|
|
44
|
-
export { dedupeCollabUsersByEmail, emailToColor, emailToName, } from "@agent-native/toolkit/collab-ui";
|
|
43
|
+
export { dedupeCollabUsersByEmail, emailToColor, emailToName, isReconcileLeadClient, } from "@agent-native/toolkit/collab-ui";
|
|
45
44
|
function isDocumentHidden() {
|
|
46
45
|
return (typeof document !== "undefined" && document.visibilityState === "hidden");
|
|
47
46
|
}
|
|
@@ -69,57 +68,6 @@ function collabUsersEqual(a, b) {
|
|
|
69
68
|
}
|
|
70
69
|
return true;
|
|
71
70
|
}
|
|
72
|
-
/**
|
|
73
|
-
* Leader election for applying authoritative external snapshots into a shared
|
|
74
|
-
* collaborative document.
|
|
75
|
-
*
|
|
76
|
-
* When the agent (or a Notion pull, or any full-document rewrite) writes new
|
|
77
|
-
* content to SQL, the open editor reconciles it into the live Y.Doc with
|
|
78
|
-
* `setContent`. If EVERY connected client did that independently, each would
|
|
79
|
-
* diff the same snapshot into the CRDT and the changed region would be inserted
|
|
80
|
-
* N times (concurrent inserts at the same position → duplicated text). So only
|
|
81
|
-
* ONE client — the "lead" — applies the snapshot; every other client receives
|
|
82
|
-
* the result through normal Yjs sync.
|
|
83
|
-
*
|
|
84
|
-
* The lead is the present client with the lowest Yjs `clientID`. The agent's
|
|
85
|
-
* awareness entry uses `AGENT_CLIENT_ID` (max int) so it can never be the lead,
|
|
86
|
-
* and a client editing alone is always the lead. This is deterministic across
|
|
87
|
-
* clients with no coordination round-trip.
|
|
88
|
-
*/
|
|
89
|
-
export function isReconcileLeadClient(awareness, localClientId) {
|
|
90
|
-
if (localClientId == null)
|
|
91
|
-
return false;
|
|
92
|
-
if (!awareness)
|
|
93
|
-
return true; // standalone / tests — act alone
|
|
94
|
-
let hasPeer = false;
|
|
95
|
-
let minVisible = localClientId;
|
|
96
|
-
awareness.getStates().forEach((state, clientId) => {
|
|
97
|
-
if (clientId === AGENT_CLIENT_ID)
|
|
98
|
-
return; // agent never leads
|
|
99
|
-
if (clientId === localClientId)
|
|
100
|
-
return;
|
|
101
|
-
const s = state;
|
|
102
|
-
if (!s || !s.user)
|
|
103
|
-
return; // skip empty/stale entries
|
|
104
|
-
hasPeer = true;
|
|
105
|
-
// Only VISIBLE peers can act; a peer published `visible: false` (backgrounded)
|
|
106
|
-
// is skipped. A peer that hasn't published the field is treated as visible.
|
|
107
|
-
if (s.visible !== false && clientId < minVisible)
|
|
108
|
-
minVisible = clientId;
|
|
109
|
-
});
|
|
110
|
-
// Sole client: always the applier — no other client can duplicate the edit,
|
|
111
|
-
// so single-user agent edits apply even if this tab reports hidden.
|
|
112
|
-
if (!hasPeer)
|
|
113
|
-
return true;
|
|
114
|
-
// With peers present, exactly one VISIBLE client applies (the lowest clientId
|
|
115
|
-
// among visible ones). A backgrounded tab pauses its poll and can't reliably
|
|
116
|
-
// act, so it yields — otherwise an agent edit would never reach the tab the
|
|
117
|
-
// user is actually looking at. The caller re-elects on visibility change.
|
|
118
|
-
const localHidden = typeof document !== "undefined" && document.visibilityState === "hidden";
|
|
119
|
-
if (localHidden)
|
|
120
|
-
return false;
|
|
121
|
-
return localClientId <= minVisible;
|
|
122
|
-
}
|
|
123
71
|
export function reconcileRemoteAwarenessStates(states, localClientId, remoteStates) {
|
|
124
72
|
const incoming = new Set();
|
|
125
73
|
const added = [];
|