@agent-native/core 0.162.0 → 0.163.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.
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/assets/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/brain/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/calendar/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/chat/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/clips/app/lib/camera-composite.ts +15 -1
- package/corpus/templates/clips/changelog/2026-08-18-clips-no-longer-crashes-when-a-camera-bubble-starts-at-a-tin.md +6 -0
- package/corpus/templates/content/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/content/actions/create-content-database.ts +1 -1
- package/corpus/templates/content/actions/create-document.ts +1 -1
- package/corpus/templates/crm/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/design/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +6 -1
- package/corpus/templates/dispatch/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/factory/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/forms/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/macros/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/mail/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/plan/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/slides/.agents/skills/sharing/SKILL.md +27 -2
- package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +3 -3
- package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +3 -3
- package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +3 -1
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/slide-object-interactions.ts +1 -1
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +1 -1
- package/corpus/templates/slides/server/handlers/request-auth-context.ts +1 -0
- package/corpus/templates/tasks/.agents/skills/sharing/SKILL.md +27 -2
- package/dist/app-config/schema.d.ts +1 -0
- package/dist/app-config/workspace.d.ts +1 -0
- package/dist/app-config/workspace.js +8 -0
- package/dist/chat-threads/schema.d.ts +2 -2
- package/dist/client/org/TeamPage.js +15 -2
- package/dist/client/org/hooks.d.ts +2 -0
- package/dist/client/org/hooks.js +12 -0
- package/dist/client/org/index.d.ts +2 -2
- package/dist/client/org/index.js +1 -1
- package/dist/client/sharing/ShareButton.js +43 -18
- package/dist/client/sharing/useShareButtonController.d.ts +12 -2
- package/dist/client/sharing/useShareButtonController.js +38 -8
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/dashboard-storage/schema.d.ts +2 -2
- package/dist/data-programs/schema.d.ts +2 -2
- package/dist/extensions/schema.d.ts +2 -2
- package/dist/extensions/store.js +3 -0
- package/dist/localization/core-messages/ar-SA.js +1 -0
- package/dist/localization/core-messages/de-DE.js +1 -0
- package/dist/localization/core-messages/en-US.d.ts +1 -0
- package/dist/localization/core-messages/en-US.js +1 -0
- package/dist/localization/core-messages/es-ES.js +1 -0
- package/dist/localization/core-messages/fr-FR.js +1 -0
- package/dist/localization/core-messages/hi-IN.js +1 -0
- package/dist/localization/core-messages/ja-JP.js +1 -0
- package/dist/localization/core-messages/ko-KR.js +1 -0
- package/dist/localization/core-messages/pt-BR.js +1 -0
- package/dist/localization/core-messages/zh-CN.js +1 -0
- package/dist/localization/core-messages/zh-TW.js +1 -0
- package/dist/localization/core-messages.d.ts +1 -0
- package/dist/localization/default-messages.d.ts +4 -0
- package/dist/localization/default-messages.js +4 -0
- package/dist/org/handlers.d.ts +6 -1
- package/dist/org/handlers.js +43 -0
- package/dist/org/index.d.ts +3 -3
- package/dist/org/index.js +2 -2
- package/dist/org/migrations.js +33 -0
- package/dist/org/plugin.js +10 -1
- package/dist/org/schema.d.ts +315 -0
- package/dist/org/schema.js +20 -1
- package/dist/org/types.d.ts +3 -0
- package/dist/org/workspace-app-access.d.ts +10 -0
- package/dist/org/workspace-app-access.js +179 -0
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
- package/dist/provider-api/actions/provider-api.d.ts +4 -4
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth.js +14 -1
- package/dist/server/poll.js +6 -0
- package/dist/sharing/access.d.ts +2 -2
- package/dist/sharing/access.js +56 -3
- package/dist/sharing/actions/list-resource-shares.d.ts +2 -0
- package/dist/sharing/actions/list-resource-shares.js +26 -1
- package/dist/sharing/actions/share-resource.d.ts +1 -1
- package/dist/sharing/actions/share-resource.js +23 -4
- package/dist/sharing/actions/unshare-resource.d.ts +1 -1
- package/dist/sharing/actions/unshare-resource.js +1 -1
- package/dist/sharing/registry.d.ts +12 -0
- package/dist/sharing/schema.d.ts +4 -4
- package/dist/sharing/schema.js +2 -2
- package/dist/templates/chat/.agents/skills/sharing/SKILL.md +27 -2
- package/dist/templates/default/.agents/skills/sharing/SKILL.md +27 -2
- package/dist/templates/workspace-core/.agents/skills/sharing/SKILL.md +27 -2
- package/dist/workspace-connections/actions/list-workspace-user-groups.d.ts +9 -1
- package/dist/workspace-connections/actions/list-workspace-user-groups.js +9 -4
- package/dist/workspace-connections/groups.d.ts +2 -0
- package/dist/workspace-connections/groups.js +16 -5
- package/package.json +1 -1
- package/src/templates/chat/.agents/skills/sharing/SKILL.md +27 -2
- package/src/templates/default/.agents/skills/sharing/SKILL.md +27 -2
- package/src/templates/workspace-core/.agents/skills/sharing/SKILL.md +27 -2
package/dist/extensions/store.js
CHANGED
|
@@ -244,6 +244,9 @@ async function extensionChangeTargetsForRow(row) {
|
|
|
244
244
|
else if (share.principalType === "org") {
|
|
245
245
|
addExtensionChangeTarget(targets, { orgId: share.principalId });
|
|
246
246
|
}
|
|
247
|
+
else if (share.principalType === "group" && row.orgId) {
|
|
248
|
+
addExtensionChangeTarget(targets, { orgId: row.orgId });
|
|
249
|
+
}
|
|
247
250
|
}
|
|
248
251
|
return Array.from(targets.values());
|
|
249
252
|
}
|
|
@@ -486,6 +486,7 @@ const messages = {
|
|
|
486
486
|
"share.unknownPerson": "شخص غير معروف",
|
|
487
487
|
"share.viewer": "مشاهد",
|
|
488
488
|
"share.viewerDescription": "يمكنه العرض",
|
|
489
|
+
"share.userGroup": "مجموعة مستخدمين",
|
|
489
490
|
"status.resuming": "جارٍ الاستئناف",
|
|
490
491
|
"status.stillWorking": "لا يزال قيد العمل",
|
|
491
492
|
"status.thinking": "يفكّر",
|
|
@@ -470,6 +470,7 @@ declare const messages: {
|
|
|
470
470
|
readonly "share.unknownPerson": "Unknown person";
|
|
471
471
|
readonly "share.viewer": "Viewer";
|
|
472
472
|
readonly "share.viewerDescription": "Can view";
|
|
473
|
+
readonly "share.userGroup": "User group";
|
|
473
474
|
readonly "status.resuming": "Resuming";
|
|
474
475
|
readonly "status.stillWorking": "Still working";
|
|
475
476
|
readonly "status.thinking": "Thinking";
|
|
@@ -470,6 +470,7 @@ const messages = {
|
|
|
470
470
|
"share.unknownPerson": "Unknown person",
|
|
471
471
|
"share.viewer": "Viewer",
|
|
472
472
|
"share.viewerDescription": "Can view",
|
|
473
|
+
"share.userGroup": "User group",
|
|
473
474
|
"status.resuming": "Resuming",
|
|
474
475
|
"status.stillWorking": "Still working",
|
|
475
476
|
"status.thinking": "Thinking",
|
|
@@ -470,6 +470,7 @@ const messages = {
|
|
|
470
470
|
"share.unknownPerson": "अज्ञात व्यक्ति",
|
|
471
471
|
"share.viewer": "दर्शक",
|
|
472
472
|
"share.viewerDescription": "देख सकता है",
|
|
473
|
+
"share.userGroup": "उपयोगकर्ता समूह",
|
|
473
474
|
"status.resuming": "फिर से शुरू हो रहा है",
|
|
474
475
|
"status.stillWorking": "अभी काम जारी है",
|
|
475
476
|
"status.thinking": "सोच रहा है",
|
|
@@ -466,6 +466,7 @@ const messages = {
|
|
|
466
466
|
"share.unknownPerson": "不明なユーザー",
|
|
467
467
|
"share.viewer": "閲覧者",
|
|
468
468
|
"share.viewerDescription": "閲覧可能",
|
|
469
|
+
"share.userGroup": "ユーザーグループ",
|
|
469
470
|
"status.resuming": "再開中",
|
|
470
471
|
"status.stillWorking": "処理を続けています",
|
|
471
472
|
"status.thinking": "思考中",
|
|
@@ -466,6 +466,7 @@ const messages = {
|
|
|
466
466
|
"share.unknownPerson": "알 수 없는 사용자",
|
|
467
467
|
"share.viewer": "뷰어",
|
|
468
468
|
"share.viewerDescription": "보기 가능",
|
|
469
|
+
"share.userGroup": "사용자 그룹",
|
|
469
470
|
"status.resuming": "재개 중",
|
|
470
471
|
"status.stillWorking": "계속 작업 중",
|
|
471
472
|
"status.thinking": "생각 중",
|
|
@@ -472,6 +472,7 @@ export declare const englishAgentChatMessages: {
|
|
|
472
472
|
readonly "share.unknownPerson": "Unknown person";
|
|
473
473
|
readonly "share.viewer": "Viewer";
|
|
474
474
|
readonly "share.viewerDescription": "Can view";
|
|
475
|
+
readonly "share.userGroup": "User group";
|
|
475
476
|
readonly "status.resuming": "Resuming";
|
|
476
477
|
readonly "status.stillWorking": "Still working";
|
|
477
478
|
readonly "status.thinking": "Thinking";
|
|
@@ -879,6 +879,10 @@ declare const messages: {
|
|
|
879
879
|
owner: string;
|
|
880
880
|
admin: string;
|
|
881
881
|
member: string;
|
|
882
|
+
workspaceAppsDefaultPrivacy: string;
|
|
883
|
+
workspaceAppsDefaultPrivacyDescription: string;
|
|
884
|
+
workspaceAppsOrganization: string;
|
|
885
|
+
workspaceAppsCreatorOnly: string;
|
|
882
886
|
members: string;
|
|
883
887
|
inviteMembers: string;
|
|
884
888
|
invited: string;
|
|
@@ -885,6 +885,10 @@ const messages = {
|
|
|
885
885
|
owner: "Owner",
|
|
886
886
|
admin: "Admin",
|
|
887
887
|
member: "Member",
|
|
888
|
+
workspaceAppsDefaultPrivacy: "New app privacy",
|
|
889
|
+
workspaceAppsDefaultPrivacyDescription: "Choose whether new workspace apps start private to their creator or visible to the organization.",
|
|
890
|
+
workspaceAppsOrganization: "Organization",
|
|
891
|
+
workspaceAppsCreatorOnly: "Creator only",
|
|
888
892
|
members: "Members",
|
|
889
893
|
inviteMembers: "Invite members",
|
|
890
894
|
invited: "Invited",
|
package/dist/org/handlers.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { OrgRole } from "./types.js";
|
|
1
|
+
import type { OrgRole, WorkspaceAppDefaultVisibility } from "./types.js";
|
|
2
2
|
/** GET /_agent-native/org/me — current user's active org, all orgs, pending invitations */
|
|
3
3
|
export declare const getMyOrgHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
|
|
4
4
|
email: string;
|
|
@@ -23,8 +23,13 @@ export declare const getMyOrgHandler: import("h3").EventHandlerWithFetch<import(
|
|
|
23
23
|
allowedDomain: string;
|
|
24
24
|
workspaceUrl: string;
|
|
25
25
|
requiredAuthProvider: "google";
|
|
26
|
+
workspaceAppDefaultVisibility: WorkspaceAppDefaultVisibility;
|
|
26
27
|
a2aSecretSet: boolean;
|
|
27
28
|
}>>;
|
|
29
|
+
/** PUT /_agent-native/org/workspace-app-default-visibility - org admins only */
|
|
30
|
+
export declare const setWorkspaceAppDefaultVisibilityHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
|
|
31
|
+
visibility: WorkspaceAppDefaultVisibility;
|
|
32
|
+
}>>;
|
|
28
33
|
/** POST /_agent-native/org — create a new organization */
|
|
29
34
|
export declare const createOrgHandler: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
|
|
30
35
|
id: string;
|
package/dist/org/handlers.js
CHANGED
|
@@ -35,6 +35,7 @@ import { getSession } from "../server/auth.js";
|
|
|
35
35
|
import { renderInviteEmail } from "../server/email-templates.js";
|
|
36
36
|
import { sendEmail, isEmailConfigured } from "../server/email.js";
|
|
37
37
|
import { readBody } from "../server/h3-helpers.js";
|
|
38
|
+
import { getOrgSetting, putOrgSetting } from "../settings/org-settings.js";
|
|
38
39
|
import { setActiveOrgId } from "./active-org.js";
|
|
39
40
|
import { setRequiredAuthProvider } from "./auth-policy.js";
|
|
40
41
|
import { invalidateDomainMatchCache } from "./auto-join-domain.js";
|
|
@@ -42,6 +43,14 @@ import { getOrgContext, createOrganization } from "./context.js";
|
|
|
42
43
|
import { isFreeEmailProvider } from "./free-email-providers.js";
|
|
43
44
|
import { invalidateMemberOrgCaches } from "./request-org-cache.js";
|
|
44
45
|
import { parseWorkspaceUrl } from "./workspace-url.js";
|
|
46
|
+
const WORKSPACE_APP_DEFAULT_VISIBILITY_KEY = "workspace-app-default-visibility";
|
|
47
|
+
function normalizeWorkspaceAppDefaultVisibility(value) {
|
|
48
|
+
if (value === "private" || value === "org")
|
|
49
|
+
return value;
|
|
50
|
+
if (value == null)
|
|
51
|
+
return "org";
|
|
52
|
+
throw new Error("Workspace app default visibility is invalid; refusing to widen access.");
|
|
53
|
+
}
|
|
45
54
|
function getInviteAppUrl(event) {
|
|
46
55
|
return getAppProductionUrl(event);
|
|
47
56
|
}
|
|
@@ -119,6 +128,11 @@ export const getMyOrgHandler = defineEventHandler(async (event) => {
|
|
|
119
128
|
}
|
|
120
129
|
}
|
|
121
130
|
const isOwnerOrAdmin = ctx.role === "owner" || ctx.role === "admin";
|
|
131
|
+
let workspaceAppDefaultVisibility = "org";
|
|
132
|
+
if (ctx.orgId) {
|
|
133
|
+
const setting = await getOrgSetting(ctx.orgId, WORKSPACE_APP_DEFAULT_VISIBILITY_KEY);
|
|
134
|
+
workspaceAppDefaultVisibility = normalizeWorkspaceAppDefaultVisibility(setting?.visibility);
|
|
135
|
+
}
|
|
122
136
|
const invitesRes = await e.execute({
|
|
123
137
|
// Case-insensitive match: invitations are stored with whatever case
|
|
124
138
|
// the inviter typed, but the session email may be normalized
|
|
@@ -147,6 +161,7 @@ export const getMyOrgHandler = defineEventHandler(async (event) => {
|
|
|
147
161
|
allowedDomain,
|
|
148
162
|
workspaceUrl,
|
|
149
163
|
requiredAuthProvider,
|
|
164
|
+
workspaceAppDefaultVisibility,
|
|
150
165
|
// Never serialize the A2A secret here. This route runs on every page load,
|
|
151
166
|
// so the value would sit in JSON any script on the page can read, and it
|
|
152
167
|
// signs the JWTs peers accept as first-party callers. Reveal is an explicit
|
|
@@ -154,6 +169,34 @@ export const getMyOrgHandler = defineEventHandler(async (event) => {
|
|
|
154
169
|
a2aSecretSet: isOwnerOrAdmin ? a2aSecretSet : undefined,
|
|
155
170
|
};
|
|
156
171
|
});
|
|
172
|
+
/** PUT /_agent-native/org/workspace-app-default-visibility - org admins only */
|
|
173
|
+
export const setWorkspaceAppDefaultVisibilityHandler = defineEventHandler(async (event) => {
|
|
174
|
+
const ctx = await getOrgContext(event);
|
|
175
|
+
if (ctx.role !== "owner" && ctx.role !== "admin") {
|
|
176
|
+
throw createError({
|
|
177
|
+
statusCode: 403,
|
|
178
|
+
message: "Only organization admins can change app defaults.",
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
if (!ctx.orgId) {
|
|
182
|
+
throw createError({
|
|
183
|
+
statusCode: 400,
|
|
184
|
+
message: "Join an organization before changing app defaults.",
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
const body = await readBody(event);
|
|
188
|
+
if (body?.visibility !== "private" && body?.visibility !== "org") {
|
|
189
|
+
throw createError({
|
|
190
|
+
statusCode: 400,
|
|
191
|
+
message: "visibility must be either private or org.",
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
const visibility = body.visibility;
|
|
195
|
+
await putOrgSetting(ctx.orgId, WORKSPACE_APP_DEFAULT_VISIBILITY_KEY, {
|
|
196
|
+
visibility,
|
|
197
|
+
});
|
|
198
|
+
return { visibility };
|
|
199
|
+
});
|
|
157
200
|
/** POST /_agent-native/org — create a new organization */
|
|
158
201
|
export const createOrgHandler = defineEventHandler(async (event) => {
|
|
159
202
|
const session = await getSession(event);
|
package/dist/org/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { OrgRole, OrgContext, OrgSummary, OrgInvitationSummary, OrgInfo, OrgMember, OrgPendingInvitation, RequiredAuthProvider, } from "./types.js";
|
|
1
|
+
export type { OrgRole, OrgContext, OrgSummary, OrgInvitationSummary, OrgInfo, OrgMember, OrgPendingInvitation, RequiredAuthProvider, WorkspaceAppDefaultVisibility, } from "./types.js";
|
|
2
2
|
export { canInviteOrgMembers, canManageOrg, canManageOrgDomain, orgRoleAtLeast, orgRoleRank, } from "./permissions.js";
|
|
3
3
|
export { getOrgContext, getOrgDomain, getOrgA2ASecret, getA2ASecretByDomain, resolveOrgByDomain, resolveOrgIdForEmail, createOrganization, } from "./context.js";
|
|
4
4
|
export { implicitServiceOrgRole, parseServiceIdentityEmail, } from "./service-identity.js";
|
|
@@ -11,8 +11,8 @@ export type { AppRoles, AppRolesDescriptor, AppRoleCaller, AppRoleLookup, AppMem
|
|
|
11
11
|
export { ORG_MIGRATIONS } from "./migrations.js";
|
|
12
12
|
export { getRequiredAuthProviderForEmail, getRequiredAuthProviderForOrg, isGoogleSignInRequiredForEmail, setRequiredAuthProvider, } from "./auth-policy.js";
|
|
13
13
|
export { createOrgPlugin, defaultOrgPlugin } from "./plugin.js";
|
|
14
|
-
export { organizations, orgMembers, orgInvitations, appMemberRoles, } from "./schema.js";
|
|
15
|
-
export { getMyOrgHandler, createOrgHandler, updateOrgHandler, switchOrgHandler, listMembersHandler, removeMemberHandler, changeMemberRoleHandler, listInvitationsHandler, createInvitationHandler, acceptInvitationHandler, setA2ASecretHandler, syncA2ASecretHandler, receiveA2ASecretHandler, setRequiredAuthProviderHandler, } from "./handlers.js";
|
|
14
|
+
export { organizations, orgMembers, orgInvitations, appMemberRoles, workspaceApps, workspaceAppShares, } from "./schema.js";
|
|
15
|
+
export { getMyOrgHandler, createOrgHandler, updateOrgHandler, switchOrgHandler, listMembersHandler, removeMemberHandler, changeMemberRoleHandler, listInvitationsHandler, createInvitationHandler, acceptInvitationHandler, setA2ASecretHandler, syncA2ASecretHandler, receiveA2ASecretHandler, setRequiredAuthProviderHandler, setWorkspaceAppDefaultVisibilityHandler, } from "./handlers.js";
|
|
16
16
|
export { listAppRolesHandler, setAppRoleHandler, } from "./app-roles-handlers.js";
|
|
17
17
|
export { isFreeEmailProvider } from "./free-email-providers.js";
|
|
18
18
|
export { isOrgMember } from "./membership.js";
|
package/dist/org/index.js
CHANGED
|
@@ -10,10 +10,10 @@ export { getRequiredAuthProviderForEmail, getRequiredAuthProviderForOrg, isGoogl
|
|
|
10
10
|
export { createOrgPlugin, defaultOrgPlugin } from "./plugin.js";
|
|
11
11
|
// Drizzle schema (re-exported so templates can write typed queries against
|
|
12
12
|
// org tables without redefining the schema themselves).
|
|
13
|
-
export { organizations, orgMembers, orgInvitations, appMemberRoles, } from "./schema.js";
|
|
13
|
+
export { organizations, orgMembers, orgInvitations, appMemberRoles, workspaceApps, workspaceAppShares, } from "./schema.js";
|
|
14
14
|
// Individual handlers — exported so templates can compose a custom org plugin
|
|
15
15
|
// while still using the framework-provided handlers.
|
|
16
|
-
export { getMyOrgHandler, createOrgHandler, updateOrgHandler, switchOrgHandler, listMembersHandler, removeMemberHandler, changeMemberRoleHandler, listInvitationsHandler, createInvitationHandler, acceptInvitationHandler, setA2ASecretHandler, syncA2ASecretHandler, receiveA2ASecretHandler, setRequiredAuthProviderHandler, } from "./handlers.js";
|
|
16
|
+
export { getMyOrgHandler, createOrgHandler, updateOrgHandler, switchOrgHandler, listMembersHandler, removeMemberHandler, changeMemberRoleHandler, listInvitationsHandler, createInvitationHandler, acceptInvitationHandler, setA2ASecretHandler, syncA2ASecretHandler, receiveA2ASecretHandler, setRequiredAuthProviderHandler, setWorkspaceAppDefaultVisibilityHandler, } from "./handlers.js";
|
|
17
17
|
export { listAppRolesHandler, setAppRoleHandler, } from "./app-roles-handlers.js";
|
|
18
18
|
export { isFreeEmailProvider } from "./free-email-providers.js";
|
|
19
19
|
export { isOrgMember } from "./membership.js";
|
package/dist/org/migrations.js
CHANGED
|
@@ -132,4 +132,37 @@ export const ORG_MIGRATIONS = [
|
|
|
132
132
|
version: 1014,
|
|
133
133
|
sql: `ALTER TABLE organizations ADD COLUMN IF NOT EXISTS required_auth_provider TEXT`,
|
|
134
134
|
},
|
|
135
|
+
{
|
|
136
|
+
version: 1015,
|
|
137
|
+
sql: `CREATE TABLE IF NOT EXISTS workspace_apps (
|
|
138
|
+
id TEXT PRIMARY KEY,
|
|
139
|
+
owner_email TEXT NOT NULL,
|
|
140
|
+
org_id TEXT,
|
|
141
|
+
visibility TEXT NOT NULL DEFAULT 'org',
|
|
142
|
+
name TEXT NOT NULL,
|
|
143
|
+
description TEXT,
|
|
144
|
+
path TEXT NOT NULL,
|
|
145
|
+
created_at INTEGER NOT NULL,
|
|
146
|
+
updated_at INTEGER NOT NULL
|
|
147
|
+
)`,
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
version: 1016,
|
|
151
|
+
sql: `CREATE TABLE IF NOT EXISTS workspace_app_shares (
|
|
152
|
+
id TEXT PRIMARY KEY,
|
|
153
|
+
resource_id TEXT NOT NULL,
|
|
154
|
+
principal_type TEXT NOT NULL,
|
|
155
|
+
principal_id TEXT NOT NULL,
|
|
156
|
+
role TEXT NOT NULL DEFAULT 'viewer',
|
|
157
|
+
created_at TEXT NOT NULL,
|
|
158
|
+
created_by TEXT NOT NULL DEFAULT '',
|
|
159
|
+
UNIQUE(resource_id, principal_type, principal_id)
|
|
160
|
+
)`,
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
version: 1017,
|
|
164
|
+
name: "workspace-app-access-indexes",
|
|
165
|
+
sql: `CREATE INDEX IF NOT EXISTS workspace_apps_org_visibility_idx
|
|
166
|
+
ON workspace_apps (org_id, visibility)`,
|
|
167
|
+
},
|
|
135
168
|
];
|
package/dist/org/plugin.js
CHANGED
|
@@ -2,7 +2,7 @@ import { defineEventHandler, setResponseStatus, getMethod, getRequestURL, } from
|
|
|
2
2
|
import { runMigrations } from "../db/migrations.js";
|
|
3
3
|
import { awaitBootstrap, getH3App, FRAMEWORK_PREFIX, markDefaultPluginProvided, } from "../server/framework-request-handler.js";
|
|
4
4
|
import { listAppRolesHandler, setAppRoleHandler, } from "./app-roles-handlers.js";
|
|
5
|
-
import { getMyOrgHandler, createOrgHandler, updateOrgHandler, deleteOrgHandler, switchOrgHandler, listMembersHandler, removeMemberHandler, changeMemberRoleHandler, listInvitationsHandler, createInvitationHandler, acceptInvitationHandler, joinByDomainHandler, setDomainHandler, setWorkspaceUrlHandler, setRequiredAuthProviderHandler, revealA2ASecretHandler, setA2ASecretHandler, syncA2ASecretHandler, receiveA2ASecretHandler, } from "./handlers.js";
|
|
5
|
+
import { getMyOrgHandler, createOrgHandler, updateOrgHandler, deleteOrgHandler, switchOrgHandler, listMembersHandler, removeMemberHandler, changeMemberRoleHandler, listInvitationsHandler, createInvitationHandler, acceptInvitationHandler, joinByDomainHandler, setDomainHandler, setWorkspaceUrlHandler, setRequiredAuthProviderHandler, revealA2ASecretHandler, setA2ASecretHandler, syncA2ASecretHandler, receiveA2ASecretHandler, setWorkspaceAppDefaultVisibilityHandler, } from "./handlers.js";
|
|
6
6
|
import { ORG_MIGRATIONS } from "./migrations.js";
|
|
7
7
|
const ORG_PREFIX = `${FRAMEWORK_PREFIX}/org`;
|
|
8
8
|
/**
|
|
@@ -97,6 +97,15 @@ export function createOrgPlugin() {
|
|
|
97
97
|
}
|
|
98
98
|
return removeMemberHandler(event);
|
|
99
99
|
}));
|
|
100
|
+
// PUT /workspace-app-default-visibility — org admins choose the default
|
|
101
|
+
// for newly created workspace apps. Existing apps retain their setting.
|
|
102
|
+
app.use(`${ORG_PREFIX}/workspace-app-default-visibility`, defineEventHandler(async (event) => {
|
|
103
|
+
if (getMethod(event) !== "PUT") {
|
|
104
|
+
setResponseStatus(event, 405);
|
|
105
|
+
return { error: "Method not allowed" };
|
|
106
|
+
}
|
|
107
|
+
return setWorkspaceAppDefaultVisibilityHandler(event);
|
|
108
|
+
}));
|
|
100
109
|
// /invitations and /invitations/:id/accept — same pattern.
|
|
101
110
|
app.use(`${ORG_PREFIX}/invitations`, defineEventHandler(async (event) => {
|
|
102
111
|
const tail = getRequestURL(event).pathname || "/";
|
package/dist/org/schema.d.ts
CHANGED
|
@@ -536,3 +536,318 @@ export declare const orgInvitations: import("drizzle-orm/sqlite-core").SQLiteTab
|
|
|
536
536
|
};
|
|
537
537
|
dialect: 'sqlite';
|
|
538
538
|
}>;
|
|
539
|
+
/** Workspace app access is framework-owned so every mounted app can enforce it. */
|
|
540
|
+
export declare const workspaceApps: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
|
|
541
|
+
name: "workspace_apps";
|
|
542
|
+
schema: undefined;
|
|
543
|
+
columns: {
|
|
544
|
+
ownerEmail: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
545
|
+
name: "owner_email";
|
|
546
|
+
tableName: "workspace_apps";
|
|
547
|
+
dataType: "string";
|
|
548
|
+
columnType: "SQLiteText";
|
|
549
|
+
data: string;
|
|
550
|
+
driverParam: string;
|
|
551
|
+
notNull: true;
|
|
552
|
+
hasDefault: true;
|
|
553
|
+
isPrimaryKey: false;
|
|
554
|
+
isAutoincrement: false;
|
|
555
|
+
hasRuntimeDefault: false;
|
|
556
|
+
enumValues: [string, ...string[]];
|
|
557
|
+
baseColumn: never;
|
|
558
|
+
identity: undefined;
|
|
559
|
+
generated: undefined;
|
|
560
|
+
}, {}, {
|
|
561
|
+
length: number;
|
|
562
|
+
}>;
|
|
563
|
+
orgId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
564
|
+
name: "org_id";
|
|
565
|
+
tableName: "workspace_apps";
|
|
566
|
+
dataType: "string";
|
|
567
|
+
columnType: "SQLiteText";
|
|
568
|
+
data: string;
|
|
569
|
+
driverParam: string;
|
|
570
|
+
notNull: false;
|
|
571
|
+
hasDefault: false;
|
|
572
|
+
isPrimaryKey: false;
|
|
573
|
+
isAutoincrement: false;
|
|
574
|
+
hasRuntimeDefault: false;
|
|
575
|
+
enumValues: [string, ...string[]];
|
|
576
|
+
baseColumn: never;
|
|
577
|
+
identity: undefined;
|
|
578
|
+
generated: undefined;
|
|
579
|
+
}, {}, {
|
|
580
|
+
length: number;
|
|
581
|
+
}>;
|
|
582
|
+
id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
583
|
+
name: "id";
|
|
584
|
+
tableName: "workspace_apps";
|
|
585
|
+
dataType: "string";
|
|
586
|
+
columnType: "SQLiteText";
|
|
587
|
+
data: string;
|
|
588
|
+
driverParam: string;
|
|
589
|
+
notNull: true;
|
|
590
|
+
hasDefault: false;
|
|
591
|
+
isPrimaryKey: true;
|
|
592
|
+
isAutoincrement: false;
|
|
593
|
+
hasRuntimeDefault: false;
|
|
594
|
+
enumValues: [string, ...string[]];
|
|
595
|
+
baseColumn: never;
|
|
596
|
+
identity: undefined;
|
|
597
|
+
generated: undefined;
|
|
598
|
+
}, {}, {
|
|
599
|
+
length: number;
|
|
600
|
+
}>;
|
|
601
|
+
visibility: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
602
|
+
name: "visibility";
|
|
603
|
+
tableName: "workspace_apps";
|
|
604
|
+
dataType: "string";
|
|
605
|
+
columnType: "SQLiteText";
|
|
606
|
+
data: "org" | "private" | "public";
|
|
607
|
+
driverParam: string;
|
|
608
|
+
notNull: true;
|
|
609
|
+
hasDefault: true;
|
|
610
|
+
isPrimaryKey: false;
|
|
611
|
+
isAutoincrement: false;
|
|
612
|
+
hasRuntimeDefault: false;
|
|
613
|
+
enumValues: ["private", "org", "public"];
|
|
614
|
+
baseColumn: never;
|
|
615
|
+
identity: undefined;
|
|
616
|
+
generated: undefined;
|
|
617
|
+
}, {}, {
|
|
618
|
+
length: number;
|
|
619
|
+
}>;
|
|
620
|
+
name: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
621
|
+
name: "name";
|
|
622
|
+
tableName: "workspace_apps";
|
|
623
|
+
dataType: "string";
|
|
624
|
+
columnType: "SQLiteText";
|
|
625
|
+
data: string;
|
|
626
|
+
driverParam: string;
|
|
627
|
+
notNull: true;
|
|
628
|
+
hasDefault: false;
|
|
629
|
+
isPrimaryKey: false;
|
|
630
|
+
isAutoincrement: false;
|
|
631
|
+
hasRuntimeDefault: false;
|
|
632
|
+
enumValues: [string, ...string[]];
|
|
633
|
+
baseColumn: never;
|
|
634
|
+
identity: undefined;
|
|
635
|
+
generated: undefined;
|
|
636
|
+
}, {}, {
|
|
637
|
+
length: number;
|
|
638
|
+
}>;
|
|
639
|
+
description: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
640
|
+
name: "description";
|
|
641
|
+
tableName: "workspace_apps";
|
|
642
|
+
dataType: "string";
|
|
643
|
+
columnType: "SQLiteText";
|
|
644
|
+
data: string;
|
|
645
|
+
driverParam: string;
|
|
646
|
+
notNull: false;
|
|
647
|
+
hasDefault: false;
|
|
648
|
+
isPrimaryKey: false;
|
|
649
|
+
isAutoincrement: false;
|
|
650
|
+
hasRuntimeDefault: false;
|
|
651
|
+
enumValues: [string, ...string[]];
|
|
652
|
+
baseColumn: never;
|
|
653
|
+
identity: undefined;
|
|
654
|
+
generated: undefined;
|
|
655
|
+
}, {}, {
|
|
656
|
+
length: number;
|
|
657
|
+
}>;
|
|
658
|
+
path: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
659
|
+
name: "path";
|
|
660
|
+
tableName: "workspace_apps";
|
|
661
|
+
dataType: "string";
|
|
662
|
+
columnType: "SQLiteText";
|
|
663
|
+
data: string;
|
|
664
|
+
driverParam: string;
|
|
665
|
+
notNull: true;
|
|
666
|
+
hasDefault: false;
|
|
667
|
+
isPrimaryKey: false;
|
|
668
|
+
isAutoincrement: false;
|
|
669
|
+
hasRuntimeDefault: false;
|
|
670
|
+
enumValues: [string, ...string[]];
|
|
671
|
+
baseColumn: never;
|
|
672
|
+
identity: undefined;
|
|
673
|
+
generated: undefined;
|
|
674
|
+
}, {}, {
|
|
675
|
+
length: number;
|
|
676
|
+
}>;
|
|
677
|
+
createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
678
|
+
name: "created_at";
|
|
679
|
+
tableName: "workspace_apps";
|
|
680
|
+
dataType: "number";
|
|
681
|
+
columnType: "SQLiteInteger";
|
|
682
|
+
data: number;
|
|
683
|
+
driverParam: number;
|
|
684
|
+
notNull: true;
|
|
685
|
+
hasDefault: false;
|
|
686
|
+
isPrimaryKey: false;
|
|
687
|
+
isAutoincrement: false;
|
|
688
|
+
hasRuntimeDefault: false;
|
|
689
|
+
enumValues: undefined;
|
|
690
|
+
baseColumn: never;
|
|
691
|
+
identity: undefined;
|
|
692
|
+
generated: undefined;
|
|
693
|
+
}, {}, {}>;
|
|
694
|
+
updatedAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
695
|
+
name: "updated_at";
|
|
696
|
+
tableName: "workspace_apps";
|
|
697
|
+
dataType: "number";
|
|
698
|
+
columnType: "SQLiteInteger";
|
|
699
|
+
data: number;
|
|
700
|
+
driverParam: number;
|
|
701
|
+
notNull: true;
|
|
702
|
+
hasDefault: false;
|
|
703
|
+
isPrimaryKey: false;
|
|
704
|
+
isAutoincrement: false;
|
|
705
|
+
hasRuntimeDefault: false;
|
|
706
|
+
enumValues: undefined;
|
|
707
|
+
baseColumn: never;
|
|
708
|
+
identity: undefined;
|
|
709
|
+
generated: undefined;
|
|
710
|
+
}, {}, {}>;
|
|
711
|
+
};
|
|
712
|
+
dialect: 'sqlite';
|
|
713
|
+
}>;
|
|
714
|
+
export declare const workspaceAppShares: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
|
|
715
|
+
name: string;
|
|
716
|
+
schema: undefined;
|
|
717
|
+
columns: {
|
|
718
|
+
id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
719
|
+
name: "id";
|
|
720
|
+
tableName: string;
|
|
721
|
+
dataType: "string";
|
|
722
|
+
columnType: "SQLiteText";
|
|
723
|
+
data: string;
|
|
724
|
+
driverParam: string;
|
|
725
|
+
notNull: true;
|
|
726
|
+
hasDefault: false;
|
|
727
|
+
isPrimaryKey: true;
|
|
728
|
+
isAutoincrement: false;
|
|
729
|
+
hasRuntimeDefault: false;
|
|
730
|
+
enumValues: [string, ...string[]];
|
|
731
|
+
baseColumn: never;
|
|
732
|
+
identity: undefined;
|
|
733
|
+
generated: undefined;
|
|
734
|
+
}, {}, {
|
|
735
|
+
length: number;
|
|
736
|
+
}>;
|
|
737
|
+
resourceId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
738
|
+
name: "resource_id";
|
|
739
|
+
tableName: string;
|
|
740
|
+
dataType: "string";
|
|
741
|
+
columnType: "SQLiteText";
|
|
742
|
+
data: string;
|
|
743
|
+
driverParam: string;
|
|
744
|
+
notNull: true;
|
|
745
|
+
hasDefault: false;
|
|
746
|
+
isPrimaryKey: false;
|
|
747
|
+
isAutoincrement: false;
|
|
748
|
+
hasRuntimeDefault: false;
|
|
749
|
+
enumValues: [string, ...string[]];
|
|
750
|
+
baseColumn: never;
|
|
751
|
+
identity: undefined;
|
|
752
|
+
generated: undefined;
|
|
753
|
+
}, {}, {
|
|
754
|
+
length: number;
|
|
755
|
+
}>;
|
|
756
|
+
principalType: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
757
|
+
name: "principal_type";
|
|
758
|
+
tableName: string;
|
|
759
|
+
dataType: "string";
|
|
760
|
+
columnType: "SQLiteText";
|
|
761
|
+
data: "group" | "org" | "user";
|
|
762
|
+
driverParam: string;
|
|
763
|
+
notNull: true;
|
|
764
|
+
hasDefault: false;
|
|
765
|
+
isPrimaryKey: false;
|
|
766
|
+
isAutoincrement: false;
|
|
767
|
+
hasRuntimeDefault: false;
|
|
768
|
+
enumValues: ["user", "group", "org"];
|
|
769
|
+
baseColumn: never;
|
|
770
|
+
identity: undefined;
|
|
771
|
+
generated: undefined;
|
|
772
|
+
}, {}, {
|
|
773
|
+
length: number;
|
|
774
|
+
}>;
|
|
775
|
+
principalId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
776
|
+
name: "principal_id";
|
|
777
|
+
tableName: string;
|
|
778
|
+
dataType: "string";
|
|
779
|
+
columnType: "SQLiteText";
|
|
780
|
+
data: string;
|
|
781
|
+
driverParam: string;
|
|
782
|
+
notNull: true;
|
|
783
|
+
hasDefault: false;
|
|
784
|
+
isPrimaryKey: false;
|
|
785
|
+
isAutoincrement: false;
|
|
786
|
+
hasRuntimeDefault: false;
|
|
787
|
+
enumValues: [string, ...string[]];
|
|
788
|
+
baseColumn: never;
|
|
789
|
+
identity: undefined;
|
|
790
|
+
generated: undefined;
|
|
791
|
+
}, {}, {
|
|
792
|
+
length: number;
|
|
793
|
+
}>;
|
|
794
|
+
role: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
795
|
+
name: "role";
|
|
796
|
+
tableName: string;
|
|
797
|
+
dataType: "string";
|
|
798
|
+
columnType: "SQLiteText";
|
|
799
|
+
data: "admin" | "commenter" | "editor" | "viewer";
|
|
800
|
+
driverParam: string;
|
|
801
|
+
notNull: true;
|
|
802
|
+
hasDefault: true;
|
|
803
|
+
isPrimaryKey: false;
|
|
804
|
+
isAutoincrement: false;
|
|
805
|
+
hasRuntimeDefault: false;
|
|
806
|
+
enumValues: ["viewer", "commenter", "editor", "admin"];
|
|
807
|
+
baseColumn: never;
|
|
808
|
+
identity: undefined;
|
|
809
|
+
generated: undefined;
|
|
810
|
+
}, {}, {
|
|
811
|
+
length: number;
|
|
812
|
+
}>;
|
|
813
|
+
createdBy: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
814
|
+
name: "created_by";
|
|
815
|
+
tableName: string;
|
|
816
|
+
dataType: "string";
|
|
817
|
+
columnType: "SQLiteText";
|
|
818
|
+
data: string;
|
|
819
|
+
driverParam: string;
|
|
820
|
+
notNull: true;
|
|
821
|
+
hasDefault: true;
|
|
822
|
+
isPrimaryKey: false;
|
|
823
|
+
isAutoincrement: false;
|
|
824
|
+
hasRuntimeDefault: false;
|
|
825
|
+
enumValues: [string, ...string[]];
|
|
826
|
+
baseColumn: never;
|
|
827
|
+
identity: undefined;
|
|
828
|
+
generated: undefined;
|
|
829
|
+
}, {}, {
|
|
830
|
+
length: number;
|
|
831
|
+
}>;
|
|
832
|
+
createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
833
|
+
name: "created_at";
|
|
834
|
+
tableName: string;
|
|
835
|
+
dataType: "string";
|
|
836
|
+
columnType: "SQLiteText";
|
|
837
|
+
data: string;
|
|
838
|
+
driverParam: string;
|
|
839
|
+
notNull: true;
|
|
840
|
+
hasDefault: true;
|
|
841
|
+
isPrimaryKey: false;
|
|
842
|
+
isAutoincrement: false;
|
|
843
|
+
hasRuntimeDefault: false;
|
|
844
|
+
enumValues: [string, ...string[]];
|
|
845
|
+
baseColumn: never;
|
|
846
|
+
identity: undefined;
|
|
847
|
+
generated: undefined;
|
|
848
|
+
}, {}, {
|
|
849
|
+
length: number;
|
|
850
|
+
}>;
|
|
851
|
+
};
|
|
852
|
+
dialect: 'sqlite';
|
|
853
|
+
}>;
|