@agent-native/core 0.7.54 → 0.7.55
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/dist/a2a/artifact-response.d.ts.map +1 -1
- package/dist/a2a/artifact-response.js +46 -8
- package/dist/a2a/artifact-response.js.map +1 -1
- package/dist/cli/templates-meta.js +1 -1
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/composer/useVoiceDictation.d.ts +5 -3
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.js +37 -19
- package/dist/client/composer/useVoiceDictation.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +7 -5
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts +4 -2
- package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +135 -56
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/server/voice-providers-status.d.ts +7 -0
- package/dist/server/voice-providers-status.d.ts.map +1 -1
- package/dist/server/voice-providers-status.js +3 -1
- package/dist/server/voice-providers-status.js.map +1 -1
- package/docs/content/sharing.md +155 -0
- package/docs/content/template-clips.md +8 -5
- package/package.json +1 -1
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Sharing & Privacy"
|
|
3
|
+
description: "Google-Docs-style sharing, built into the framework. Every user-created resource — docs, dashboards, designs, decks, clips, recordings, forms — gets the same private-by-default model with one consistent share UI."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Sharing & Privacy
|
|
7
|
+
|
|
8
|
+
Every resource a user creates in an agent-native app — a document, a dashboard, a design, a deck, a video edit, a screen recording, a meeting transcript, a form, a booking link — is **private to the creator by default**. Other people see it only when the creator explicitly shares it, or changes its visibility to `org` or `public`.
|
|
9
|
+
|
|
10
|
+
It looks and works like Google Docs. The same share button, the same dialog, the same three-tier visibility model, the same per-user/per-org grants — across every template, with no per-app reinvention.
|
|
11
|
+
|
|
12
|
+
## Why one model {#why}
|
|
13
|
+
|
|
14
|
+
Most app frameworks make sharing a per-feature project. The result: every doc-like surface ends up with its own share dialog, its own permissions schema, its own access-check bugs. In agent-native, sharing is a **framework primitive**. The schema columns, the access-check helpers, the share popover, and the agent-callable share actions all ship with the core. A new template gets the full sharing story by adding two columns and one line of registration.
|
|
15
|
+
|
|
16
|
+
This also means the agent never has to learn a new sharing model per app. Tell the agent "share this with Alice as an editor" in any template and the same `share-resource` action fires.
|
|
17
|
+
|
|
18
|
+
## The three visibility levels {#visibility}
|
|
19
|
+
|
|
20
|
+
Coarse visibility lives on the resource itself; fine-grained grants live in a companion shares table.
|
|
21
|
+
|
|
22
|
+
| Visibility | Who can see it |
|
|
23
|
+
| ---------- | --------------------------------------------------------------------------------------------------- |
|
|
24
|
+
| `private` | Owner + people explicitly granted. **Default for every new resource.** |
|
|
25
|
+
| `org` | Owner + explicit grants + anyone in the same organization (read-only). |
|
|
26
|
+
| `public` | Owner + explicit grants + anyone with the link (read-only). Doesn't appear in others' lists/search. |
|
|
27
|
+
|
|
28
|
+
`public` is a deliberately quiet level: a public resource is reachable by direct link, but it does **not** show up in other users' sidebars, lists, or search. That keeps "public for sharing the URL" separate from "public for cross-user discovery." Galleries and template catalogs that genuinely want cross-user discovery opt in explicitly.
|
|
29
|
+
|
|
30
|
+
## Roles on a share grant {#roles}
|
|
31
|
+
|
|
32
|
+
When you share with a specific user or org, you pick a role:
|
|
33
|
+
|
|
34
|
+
- **Viewer** — read only.
|
|
35
|
+
- **Editor** — read + write.
|
|
36
|
+
- **Admin** — read + write + manage shares (can add/remove other people).
|
|
37
|
+
|
|
38
|
+
`admin` does NOT change ownership — there's still exactly one owner per resource, distinct from the share grants.
|
|
39
|
+
|
|
40
|
+
## What's covered {#covered}
|
|
41
|
+
|
|
42
|
+
Every template that stores user-authored work uses this model. Concretely:
|
|
43
|
+
|
|
44
|
+
- **Content** — documents
|
|
45
|
+
- **Slides** — decks
|
|
46
|
+
- **Design** — designs and assets
|
|
47
|
+
- **Video** — compositions
|
|
48
|
+
- **Clips** — screen recordings (Loom-style)
|
|
49
|
+
- **Calls** — meeting recordings and transcripts (Granola-style)
|
|
50
|
+
- **Meeting Notes** — transcripts and summaries
|
|
51
|
+
- **Forms** — form definitions
|
|
52
|
+
- **Calendar** — events and booking links
|
|
53
|
+
- **Analytics** — dashboards (rolling out — see the analytics template's `AGENTS.md`)
|
|
54
|
+
- **Tools** — sandboxed mini-apps (see [Tools](/docs/tools#sharing))
|
|
55
|
+
|
|
56
|
+
Every one of these uses the same `ownableColumns()` schema helper, the same `share-resource` action, and the same `<ShareButton>` UI. Move from one template to another and the share dialog looks identical.
|
|
57
|
+
|
|
58
|
+
## What's not covered {#not-covered}
|
|
59
|
+
|
|
60
|
+
A few areas are intentionally outside the sharing system:
|
|
61
|
+
|
|
62
|
+
- **Personal-data apps** (Mail, Macros) — user-scoped by design. There's no "share my inbox" concept.
|
|
63
|
+
- **External source-of-truth apps** (Issues → Jira, Recruiting → Greenhouse) — access control lives in the upstream system, not the agent-native app.
|
|
64
|
+
- **Anonymous public URLs** — form publish slugs and booking-link slugs that expose a URL to logged-out users are a separate axis. They live alongside the sharing system, not on top of it.
|
|
65
|
+
|
|
66
|
+
## The share UI {#share-ui}
|
|
67
|
+
|
|
68
|
+
Every shareable resource gets a share button in its header. Clicking it opens a popover anchored to the button (not a modal) with:
|
|
69
|
+
|
|
70
|
+
- Visibility selector (`Private` / `Organization` / `Public link`).
|
|
71
|
+
- "Add people or teams" autocomplete — search users in the org or paste an email.
|
|
72
|
+
- A list of current grants with role pickers and a remove control.
|
|
73
|
+
- A copy-link button that respects the current visibility.
|
|
74
|
+
|
|
75
|
+
The share button is a single import:
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
import { ShareButton } from "@agent-native/core/client";
|
|
79
|
+
|
|
80
|
+
<ShareButton
|
|
81
|
+
resourceType="deck"
|
|
82
|
+
resourceId={deck.id}
|
|
83
|
+
resourceTitle={deck.title}
|
|
84
|
+
/>;
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
For lists, drop a `<VisibilityBadge visibility={row.visibility} />` next to each row so users can see at a glance what's private vs. shared.
|
|
88
|
+
|
|
89
|
+
## Same model, agent and UI {#agent-and-ui}
|
|
90
|
+
|
|
91
|
+
The framework auto-mounts these actions in every template — the agent calls them as tools, the UI calls them as HTTP endpoints:
|
|
92
|
+
|
|
93
|
+
| Action | What it does |
|
|
94
|
+
| ------------------------- | ------------------------------------------------- |
|
|
95
|
+
| `share-resource` | Grant a user or org access at a specific role. |
|
|
96
|
+
| `unshare-resource` | Revoke access for a user or org. |
|
|
97
|
+
| `list-resource-shares` | Show current visibility plus all explicit grants. |
|
|
98
|
+
| `set-resource-visibility` | Change to `private`, `org`, or `public`. |
|
|
99
|
+
|
|
100
|
+
Tell the agent "share this design with the marketing team as editors" and it calls `share-resource` against the same endpoint the UI uses. The result shows up in the share dialog the next render.
|
|
101
|
+
|
|
102
|
+
## Building it into a new template {#building}
|
|
103
|
+
|
|
104
|
+
If you're creating a template (see [Creating Templates](/docs/creating-templates)), wiring sharing in is short. Two additions to your schema:
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
import {
|
|
108
|
+
table,
|
|
109
|
+
text,
|
|
110
|
+
ownableColumns,
|
|
111
|
+
createSharesTable,
|
|
112
|
+
} from "@agent-native/core/db/schema";
|
|
113
|
+
|
|
114
|
+
export const decks = table("decks", {
|
|
115
|
+
id: text("id").primaryKey(),
|
|
116
|
+
title: text("title").notNull(),
|
|
117
|
+
data: text("data").notNull(),
|
|
118
|
+
...ownableColumns(), // adds owner_email, org_id, visibility
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
export const deckShares = createSharesTable("deck_shares");
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
One registration call in `server/db/index.ts`:
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
import { registerShareableResource } from "@agent-native/core/sharing";
|
|
128
|
+
|
|
129
|
+
registerShareableResource({
|
|
130
|
+
type: "deck",
|
|
131
|
+
resourceTable: schema.decks,
|
|
132
|
+
sharesTable: schema.deckShares,
|
|
133
|
+
displayName: "Deck",
|
|
134
|
+
titleColumn: "title",
|
|
135
|
+
getDb,
|
|
136
|
+
});
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
After that, list/read queries pass through `accessFilter()` and write actions use `assertAccess()` to enforce roles. The full pattern (including create-action ownership stamping and the migration recipe for existing tables) lives in the `sharing` agent skill — the agent reads it on demand when building a sharing-aware feature.
|
|
140
|
+
|
|
141
|
+
## Security guarantees {#security}
|
|
142
|
+
|
|
143
|
+
Sharing rides on the framework's broader data-scoping model. The two non-negotiable rules:
|
|
144
|
+
|
|
145
|
+
- **No unscoped queries.** Every query against an ownable table must go through `accessFilter()` (lists), `resolveAccess()` (read-by-id), or `assertAccess()` (writes). A CI guard fails the build if a query against an ownable table runs without one of these helpers.
|
|
146
|
+
- **Org isolation.** Resources tagged with an `org_id` are invisible to users from other orgs even to the agent. The active-org session value flows through to SQL, so cross-org leaks are impossible by construction.
|
|
147
|
+
|
|
148
|
+
See [Security & Data Scoping](/docs/security) for the full model and threat surface.
|
|
149
|
+
|
|
150
|
+
## See also {#see-also}
|
|
151
|
+
|
|
152
|
+
- [Security & Data Scoping](/docs/security) — the access-filter and ownership model that sharing rides on.
|
|
153
|
+
- [Authentication](/docs/authentication) — sessions, organizations, and how identity flows into the request context.
|
|
154
|
+
- [Tools](/docs/tools#sharing) — sharing in the sandboxed mini-app surface.
|
|
155
|
+
- [Creating Templates](/docs/creating-templates) — wiring `ownableColumns` into a new template's schema.
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Clips"
|
|
3
|
-
description: "
|
|
3
|
+
description: "Async screen recording (Loom-style), calendar-synced meeting notes (Granola-style), and push-to-talk voice dictation (Wisprflow-style) — all transcribed, summarized, and searchable in one app you own."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Clips
|
|
7
7
|
|
|
8
|
-
A
|
|
8
|
+
A capture-everything app: screen recordings (Loom-style), meeting notes from your calendar (Granola-style), and Fn-hold voice dictation (Wisprflow-style). The agent transcribes, titles, summarizes, and indexes all of it — then lets you ask "find the clip where we discussed the rollout plan" and searches across every transcript you've ever made.
|
|
9
9
|
|
|
10
|
-
Think along the lines of
|
|
10
|
+
Think along the lines of Loom + Granola + Wisprflow rolled into one app — but the agent is a first-class editor across every surface, and the recordings, meetings, and dictations are yours, not a SaaS vendor's.
|
|
11
11
|
|
|
12
12
|
## What you can do with it
|
|
13
13
|
|
|
14
14
|
- **Record your screen** with a built-in recorder, webcam overlay, audio capture, and pause/trim.
|
|
15
|
+
- **Capture meetings from your calendar.** Connect Google Calendar, see upcoming meetings in the sidebar, and hit record on any one. You get a live transcript plus AI summary, bullet notes, and action items the moment it ends.
|
|
16
|
+
- **Push-to-talk dictation.** Hold Fn on your machine, speak, and the cleaned-up text drops into whatever app you're using. Every dictation is kept in a searchable history with originals and AI-cleaned versions side by side.
|
|
15
17
|
- **Get an auto-generated title, summary, and chapter markers** for every recording — the agent fills them in and keeps them current.
|
|
16
|
-
- **Search across every transcript**
|
|
18
|
+
- **Search across every transcript** — screen recordings, meetings, and dictations all in one library. "Find the clip where we discussed the rollout plan."
|
|
17
19
|
- **Share clips** with per-clip permissions (public, team, private). Link tracking and threaded comments work too.
|
|
18
20
|
- **Smart library views.** Group by project, filter by speaker, auto-tag based on content.
|
|
19
21
|
- **Edit the transcript through chat.** "Fix the mis-transcribed word at 1:42." "Pull three quotes for a blog post." The agent edits the transcript and the UI updates live.
|
|
@@ -43,7 +45,8 @@ Clips is a larger template with a native recorder (it ships a desktop companion
|
|
|
43
45
|
Clips is a full cloneable SaaS — fork it and ask the agent to extend it. Some examples:
|
|
44
46
|
|
|
45
47
|
- "Add a filler-word removal button that strips ums and uhs from the transcript and re-stitches the video."
|
|
46
|
-
- "Auto-post
|
|
48
|
+
- "Auto-post my standup notes to Slack #eng whenever a meeting ends." (Connect Slack first via [Messaging](/docs/messaging).)
|
|
49
|
+
- "Add a hotkey that drops the last dictation into Linear as a new ticket."
|
|
47
50
|
- "Group the library by project — detect the project from the first words of each transcript."
|
|
48
51
|
- "Add a 'Generate blog post from this clip' button that drafts a post from the transcript and saves it as a draft."
|
|
49
52
|
- "Let viewers leave timestamped reactions on a shared clip."
|