@burdenoff/microfe-vibecontrols 2026.601.21 → 2026.601.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/components/actions/ActionCard.js +77 -66
  2. package/dist/components/actions/ActionCard.js.map +1 -1
  3. package/dist/components/ai/AIContextsTab.js +186 -173
  4. package/dist/components/ai/AIContextsTab.js.map +1 -1
  5. package/dist/components/ai/AITemplatesTab.js +135 -125
  6. package/dist/components/ai/AITemplatesTab.js.map +1 -1
  7. package/dist/components/ai/InstructionFilesManager.js +151 -137
  8. package/dist/components/ai/InstructionFilesManager.js.map +1 -1
  9. package/dist/components/docs/DocsEditPanel.js +17 -16
  10. package/dist/components/docs/DocsEditPanel.js.map +1 -1
  11. package/dist/components/docs/DocsPreviewPanel.js +25 -24
  12. package/dist/components/docs/DocsPreviewPanel.js.map +1 -1
  13. package/dist/components/docs/DocsTabPanel.js +110 -94
  14. package/dist/components/docs/DocsTabPanel.js.map +1 -1
  15. package/dist/components/notes/NotesTabPanel.js +8 -8
  16. package/dist/components/scorecard/ScorecardPanel.js +271 -257
  17. package/dist/components/scorecard/ScorecardPanel.js.map +1 -1
  18. package/dist/components/sharing/EntityShareButton.js +58 -0
  19. package/dist/components/sharing/EntityShareButton.js.map +1 -0
  20. package/dist/components/sharing/entityShareOps.js +603 -0
  21. package/dist/components/sharing/entityShareOps.js.map +1 -0
  22. package/dist/components/sharing/index.js +3 -0
  23. package/dist/components/sharing/shareRegistry.js +37 -12
  24. package/dist/components/sharing/shareRegistry.js.map +1 -1
  25. package/dist/components/sharing/useEntityShareController.js +88 -0
  26. package/dist/components/sharing/useEntityShareController.js.map +1 -0
  27. package/dist/constants/permissions.js +11 -0
  28. package/dist/constants/permissions.js.map +1 -1
  29. package/dist/pages/ActionsPage.js +162 -162
  30. package/dist/pages/ActionsPage.js.map +1 -1
  31. package/dist/pages/CatalogDetailPage.js +264 -250
  32. package/dist/pages/CatalogDetailPage.js.map +1 -1
  33. package/dist/pages/ComponentDetailPage.js +124 -113
  34. package/dist/pages/ComponentDetailPage.js.map +1 -1
  35. package/dist/pages/TargetDetailsPage.js +139 -126
  36. package/dist/pages/TargetDetailsPage.js.map +1 -1
  37. package/dist/pages/TemplateDetailPage.js +78 -67
  38. package/dist/pages/TemplateDetailPage.js.map +1 -1
  39. package/dist/pages/VibeDeckPage.js +1 -1
  40. package/dist/pages/VibeDetailsPage.js +484 -484
  41. package/dist/pages/VibeDetailsPage.js.map +1 -1
  42. package/dist/pages/tunnels/TunnelDetailsPage.js +91 -77
  43. package/dist/pages/tunnels/TunnelDetailsPage.js.map +1 -1
  44. package/package.json +1 -1
@@ -11,6 +11,31 @@ var t = (e) => `vibecontrols.sharing.${e}`, n = {
11
11
  featureFlag: t("note"),
12
12
  defaultEnabled: !0
13
13
  },
14
+ aiprompt: {
15
+ permission: e.AIPROMPT_SHARE,
16
+ featureFlag: t("aiprompt"),
17
+ defaultEnabled: !0
18
+ },
19
+ action: {
20
+ permission: e.ACTION_SHARE,
21
+ featureFlag: t("action"),
22
+ defaultEnabled: !0
23
+ },
24
+ aicontext: {
25
+ permission: e.AICONTEXT_SHARE,
26
+ featureFlag: t("aicontext"),
27
+ defaultEnabled: !0
28
+ },
29
+ instructionfile: {
30
+ permission: e.INSTRUCTION_FILE_SHARE,
31
+ featureFlag: t("instructionfile"),
32
+ defaultEnabled: !0
33
+ },
34
+ tunnel: {
35
+ permission: e.TUNNEL_SHARE,
36
+ featureFlag: t("tunnel"),
37
+ defaultEnabled: !0
38
+ },
14
39
  session: {
15
40
  permission: e.SESSION_UPDATE,
16
41
  featureFlag: t("session"),
@@ -22,34 +47,34 @@ var t = (e) => `vibecontrols.sharing.${e}`, n = {
22
47
  defaultEnabled: !1
23
48
  },
24
49
  catalog: {
25
- permission: e.VIBE_MANAGE,
50
+ permission: e.CATALOG_SHARE,
26
51
  featureFlag: t("catalog"),
27
- defaultEnabled: !1
52
+ defaultEnabled: !0
28
53
  },
29
54
  component: {
30
- permission: e.VIBE_MANAGE,
55
+ permission: e.COMPONENT_SHARE,
31
56
  featureFlag: t("component"),
32
- defaultEnabled: !1
57
+ defaultEnabled: !0
33
58
  },
34
59
  template: {
35
- permission: e.VIBE_MANAGE,
60
+ permission: e.TEMPLATE_SHARE,
36
61
  featureFlag: t("template"),
37
- defaultEnabled: !1
62
+ defaultEnabled: !0
38
63
  },
39
64
  scorecard: {
40
- permission: e.VIBE_MANAGE,
65
+ permission: e.SCORECARD_SHARE,
41
66
  featureFlag: t("scorecard"),
42
- defaultEnabled: !1
67
+ defaultEnabled: !0
43
68
  },
44
69
  target: {
45
- permission: e.TARGET_UPDATE,
70
+ permission: e.TARGET_SHARE,
46
71
  featureFlag: t("target"),
47
- defaultEnabled: !1
72
+ defaultEnabled: !0
48
73
  },
49
74
  docs: {
50
- permission: e.DOCS_PAGE_UPDATE,
75
+ permission: e.DOCS_SITE_SHARE,
51
76
  featureFlag: t("docs"),
52
- defaultEnabled: !1
77
+ defaultEnabled: !0
53
78
  }
54
79
  };
55
80
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"shareRegistry.js","names":[],"sources":["../../../src/components/sharing/shareRegistry.ts"],"sourcesContent":["/**\n * Central registry mapping a VibeControls entity type to the RBAC permission\n * that gates its Share affordance plus the platform feature flag that toggles\n * the generic-sharing UI for that entity.\n *\n * Why a registry: the generic sharing dialog (`@burdenoff/fe-libs/sharing`) is\n * entity-agnostic. Each surface that wants a Share button looks its entity up\n * here so the permission string + feature flag stay in one place rather than\n * being re-typed at every call site.\n *\n * Rollout posture:\n * - `vibe` / `note` ship ON (`defaultEnabled: true`) — the backend share\n * mutations + the FE controllers in this folder are complete for them.\n * - `session` / `vibedeck` keep `defaultEnabled: false`: they already have\n * bespoke share dialogs (`SessionShareDialog`, `VibeDeckShareDialog`) that we\n * must NOT break, so the generic surface stays dark until they migrate.\n * - The long-tail entries (catalog/component/template/scorecard/target/docs)\n * are declared for completeness but are wired to default-OFF flags and have\n * no Share button mounted yet. They exist so a future PR only has to flip the\n * flag + drop in a controller, not invent the registry shape.\n */\n\nimport { VIBE_PERMISSIONS } from '@/constants/permissions';\n\n/** A single entity's sharing wiring. */\nexport interface ShareRegistryEntry {\n /** RBAC permission required to open the Share dialog for this entity. */\n permission: string;\n /** Platform feature flag key that toggles the generic-sharing surface. */\n featureFlag: string;\n /**\n * Default value for {@link useFeatureFlag} when the flag is absent.\n * `true` = generic sharing live for this entity; `false` = hidden until the\n * flag is explicitly enabled (long-tail + legacy-dialog entities).\n */\n defaultEnabled: boolean;\n}\n\n/** Every entity type the registry knows about. */\nexport type ShareEntityType =\n | 'vibe'\n | 'note'\n | 'session'\n | 'vibedeck'\n | 'catalog'\n | 'component'\n | 'template'\n | 'scorecard'\n | 'target'\n | 'docs';\n\nconst flagKey = (entity: ShareEntityType): string => `vibecontrols.sharing.${entity}`;\n\nexport const SHARE_REGISTRY: Record<ShareEntityType, ShareRegistryEntry> = {\n // ── finishable: generic sharing ON ───────────────────────────────────────\n vibe: {\n permission: VIBE_PERMISSIONS.VIBE_MANAGE,\n featureFlag: flagKey('vibe'),\n defaultEnabled: true,\n },\n note: {\n permission: VIBE_PERMISSIONS.NOTE_UPDATE,\n featureFlag: flagKey('note'),\n defaultEnabled: true,\n },\n\n // ── legacy bespoke dialogs: generic surface default-OFF ───────────────────\n session: {\n permission: VIBE_PERMISSIONS.SESSION_UPDATE,\n featureFlag: flagKey('session'),\n defaultEnabled: false,\n },\n vibedeck: {\n permission: VIBE_PERMISSIONS.VIBEDECK_SHARE,\n featureFlag: flagKey('vibedeck'),\n defaultEnabled: false,\n },\n\n // ── long-tail: declared, not wired, default-OFF ───────────────────────────\n catalog: {\n permission: VIBE_PERMISSIONS.VIBE_MANAGE,\n featureFlag: flagKey('catalog'),\n defaultEnabled: false,\n },\n component: {\n permission: VIBE_PERMISSIONS.VIBE_MANAGE,\n featureFlag: flagKey('component'),\n defaultEnabled: false,\n },\n template: {\n permission: VIBE_PERMISSIONS.VIBE_MANAGE,\n featureFlag: flagKey('template'),\n defaultEnabled: false,\n },\n scorecard: {\n permission: VIBE_PERMISSIONS.VIBE_MANAGE,\n featureFlag: flagKey('scorecard'),\n defaultEnabled: false,\n },\n target: {\n permission: VIBE_PERMISSIONS.TARGET_UPDATE,\n featureFlag: flagKey('target'),\n defaultEnabled: false,\n },\n docs: {\n permission: VIBE_PERMISSIONS.DOCS_PAGE_UPDATE,\n featureFlag: flagKey('docs'),\n defaultEnabled: false,\n },\n};\n\n/** Lookup helper; returns `undefined` for unknown entity types. */\nexport function getShareRegistryEntry(entity: ShareEntityType): ShareRegistryEntry | undefined {\n return SHARE_REGISTRY[entity];\n}\n"],"mappings":";;AAmDA,IAAM,KAAW,MAAoC,wBAAwB,KAEhE,IAA8D;CAEzE,MAAM;EACJ,YAAY,EAAiB;EAC7B,aAAa,EAAQ,OAAO;EAC5B,gBAAgB;EACjB;CACD,MAAM;EACJ,YAAY,EAAiB;EAC7B,aAAa,EAAQ,OAAO;EAC5B,gBAAgB;EACjB;CAGD,SAAS;EACP,YAAY,EAAiB;EAC7B,aAAa,EAAQ,UAAU;EAC/B,gBAAgB;EACjB;CACD,UAAU;EACR,YAAY,EAAiB;EAC7B,aAAa,EAAQ,WAAW;EAChC,gBAAgB;EACjB;CAGD,SAAS;EACP,YAAY,EAAiB;EAC7B,aAAa,EAAQ,UAAU;EAC/B,gBAAgB;EACjB;CACD,WAAW;EACT,YAAY,EAAiB;EAC7B,aAAa,EAAQ,YAAY;EACjC,gBAAgB;EACjB;CACD,UAAU;EACR,YAAY,EAAiB;EAC7B,aAAa,EAAQ,WAAW;EAChC,gBAAgB;EACjB;CACD,WAAW;EACT,YAAY,EAAiB;EAC7B,aAAa,EAAQ,YAAY;EACjC,gBAAgB;EACjB;CACD,QAAQ;EACN,YAAY,EAAiB;EAC7B,aAAa,EAAQ,SAAS;EAC9B,gBAAgB;EACjB;CACD,MAAM;EACJ,YAAY,EAAiB;EAC7B,aAAa,EAAQ,OAAO;EAC5B,gBAAgB;EACjB;CACF"}
1
+ {"version":3,"file":"shareRegistry.js","names":[],"sources":["../../../src/components/sharing/shareRegistry.ts"],"sourcesContent":["/**\n * Central registry mapping a VibeControls entity type to the RBAC permission\n * that gates its Share affordance plus the platform feature flag that toggles\n * the generic-sharing UI for that entity.\n *\n * Why a registry: the generic sharing dialog (`@burdenoff/fe-libs/sharing`) is\n * entity-agnostic. Each surface that wants a Share button looks its entity up\n * here so the permission string + feature flag stay in one place rather than\n * being re-typed at every call site.\n *\n * Rollout posture:\n * - `vibe` / `note` / `aiprompt` / `action` / `aicontext` / `instructionfile` /\n * `tunnel` ship ON (`defaultEnabled: true`) — the backend share mutations are\n * deployed in prod and the FE controllers in this folder are complete for them\n * (`useVibeShareController`, `useNoteShareController`, and the generic\n * `useEntityShareController` cover the latter five).\n * - `session` / `vibedeck` keep `defaultEnabled: false`: they already have\n * bespoke share dialogs (`SessionShareDialog`, `VibeDeckShareDialog`) that we\n * must NOT break, so the generic surface stays dark until they migrate.\n * - The long-tail entries (catalog/component/template/scorecard/target/docs)\n * now ship ON (`defaultEnabled: true`): their backend share mutations exist\n * and the generic `useEntityShareController` serves them via the inline-`gql`\n * document sets in `entityShareOps.ts`. Each is gated on its own `<entity>\n * :share` RBAC permission (catalog/component/template/scorecard/target →\n * `<entity>:share`; docs `docs_site:share`).\n */\n\nimport { VIBE_PERMISSIONS } from '@/constants/permissions';\n\n/** A single entity's sharing wiring. */\nexport interface ShareRegistryEntry {\n /** RBAC permission required to open the Share dialog for this entity. */\n permission: string;\n /** Platform feature flag key that toggles the generic-sharing surface. */\n featureFlag: string;\n /**\n * Default value for {@link useFeatureFlag} when the flag is absent.\n * `true` = generic sharing live for this entity; `false` = hidden until the\n * flag is explicitly enabled (long-tail + legacy-dialog entities).\n */\n defaultEnabled: boolean;\n}\n\n/** Every entity type the registry knows about. */\nexport type ShareEntityType =\n | 'vibe'\n | 'note'\n | 'aiprompt'\n | 'action'\n | 'aicontext'\n | 'instructionfile'\n | 'tunnel'\n | 'session'\n | 'vibedeck'\n | 'catalog'\n | 'component'\n | 'template'\n | 'scorecard'\n | 'target'\n | 'docs';\n\nconst flagKey = (entity: ShareEntityType): string => `vibecontrols.sharing.${entity}`;\n\nexport const SHARE_REGISTRY: Record<ShareEntityType, ShareRegistryEntry> = {\n // ── finishable: generic sharing ON ───────────────────────────────────────\n vibe: {\n permission: VIBE_PERMISSIONS.VIBE_MANAGE,\n featureFlag: flagKey('vibe'),\n defaultEnabled: true,\n },\n note: {\n permission: VIBE_PERMISSIONS.NOTE_UPDATE,\n featureFlag: flagKey('note'),\n defaultEnabled: true,\n },\n aiprompt: {\n permission: VIBE_PERMISSIONS.AIPROMPT_SHARE,\n featureFlag: flagKey('aiprompt'),\n defaultEnabled: true,\n },\n action: {\n permission: VIBE_PERMISSIONS.ACTION_SHARE,\n featureFlag: flagKey('action'),\n defaultEnabled: true,\n },\n aicontext: {\n permission: VIBE_PERMISSIONS.AICONTEXT_SHARE,\n featureFlag: flagKey('aicontext'),\n defaultEnabled: true,\n },\n instructionfile: {\n permission: VIBE_PERMISSIONS.INSTRUCTION_FILE_SHARE,\n featureFlag: flagKey('instructionfile'),\n defaultEnabled: true,\n },\n tunnel: {\n permission: VIBE_PERMISSIONS.TUNNEL_SHARE,\n featureFlag: flagKey('tunnel'),\n defaultEnabled: true,\n },\n\n // ── legacy bespoke dialogs: generic surface default-OFF ───────────────────\n session: {\n permission: VIBE_PERMISSIONS.SESSION_UPDATE,\n featureFlag: flagKey('session'),\n defaultEnabled: false,\n },\n vibedeck: {\n permission: VIBE_PERMISSIONS.VIBEDECK_SHARE,\n featureFlag: flagKey('vibedeck'),\n defaultEnabled: false,\n },\n\n // ── long-tail: generic sharing ON ─────────────────────────────────────────\n catalog: {\n permission: VIBE_PERMISSIONS.CATALOG_SHARE,\n featureFlag: flagKey('catalog'),\n defaultEnabled: true,\n },\n component: {\n permission: VIBE_PERMISSIONS.COMPONENT_SHARE,\n featureFlag: flagKey('component'),\n defaultEnabled: true,\n },\n template: {\n permission: VIBE_PERMISSIONS.TEMPLATE_SHARE,\n featureFlag: flagKey('template'),\n defaultEnabled: true,\n },\n scorecard: {\n permission: VIBE_PERMISSIONS.SCORECARD_SHARE,\n featureFlag: flagKey('scorecard'),\n defaultEnabled: true,\n },\n target: {\n permission: VIBE_PERMISSIONS.TARGET_SHARE,\n featureFlag: flagKey('target'),\n defaultEnabled: true,\n },\n docs: {\n permission: VIBE_PERMISSIONS.DOCS_SITE_SHARE,\n featureFlag: flagKey('docs'),\n defaultEnabled: true,\n },\n};\n\n/** Lookup helper; returns `undefined` for unknown entity types. */\nexport function getShareRegistryEntry(entity: ShareEntityType): ShareRegistryEntry | undefined {\n return SHARE_REGISTRY[entity];\n}\n"],"mappings":";;AA6DA,IAAM,KAAW,MAAoC,wBAAwB,KAEhE,IAA8D;CAEzE,MAAM;EACJ,YAAY,EAAiB;EAC7B,aAAa,EAAQ,OAAO;EAC5B,gBAAgB;EACjB;CACD,MAAM;EACJ,YAAY,EAAiB;EAC7B,aAAa,EAAQ,OAAO;EAC5B,gBAAgB;EACjB;CACD,UAAU;EACR,YAAY,EAAiB;EAC7B,aAAa,EAAQ,WAAW;EAChC,gBAAgB;EACjB;CACD,QAAQ;EACN,YAAY,EAAiB;EAC7B,aAAa,EAAQ,SAAS;EAC9B,gBAAgB;EACjB;CACD,WAAW;EACT,YAAY,EAAiB;EAC7B,aAAa,EAAQ,YAAY;EACjC,gBAAgB;EACjB;CACD,iBAAiB;EACf,YAAY,EAAiB;EAC7B,aAAa,EAAQ,kBAAkB;EACvC,gBAAgB;EACjB;CACD,QAAQ;EACN,YAAY,EAAiB;EAC7B,aAAa,EAAQ,SAAS;EAC9B,gBAAgB;EACjB;CAGD,SAAS;EACP,YAAY,EAAiB;EAC7B,aAAa,EAAQ,UAAU;EAC/B,gBAAgB;EACjB;CACD,UAAU;EACR,YAAY,EAAiB;EAC7B,aAAa,EAAQ,WAAW;EAChC,gBAAgB;EACjB;CAGD,SAAS;EACP,YAAY,EAAiB;EAC7B,aAAa,EAAQ,UAAU;EAC/B,gBAAgB;EACjB;CACD,WAAW;EACT,YAAY,EAAiB;EAC7B,aAAa,EAAQ,YAAY;EACjC,gBAAgB;EACjB;CACD,UAAU;EACR,YAAY,EAAiB;EAC7B,aAAa,EAAQ,WAAW;EAChC,gBAAgB;EACjB;CACD,WAAW;EACT,YAAY,EAAiB;EAC7B,aAAa,EAAQ,YAAY;EACjC,gBAAgB;EACjB;CACD,QAAQ;EACN,YAAY,EAAiB;EAC7B,aAAa,EAAQ,SAAS;EAC9B,gBAAgB;EACjB;CACD,MAAM;EACJ,YAAY,EAAiB;EAC7B,aAAa,EAAQ,OAAO;EAC5B,gBAAgB;EACjB;CACF"}
@@ -0,0 +1,88 @@
1
+ import { VIBE_SHARE_ROLES as e, partitionGrants as t } from "./shareControllerTypes.js";
2
+ import { ENTITY_SHARE_OPS as n } from "./entityShareOps.js";
3
+ import { useCallback as r, useMemo as i } from "react";
4
+ import { useMutation as a, useQuery as o } from "@apollo/client/react";
5
+ //#region src/components/sharing/useEntityShareController.ts
6
+ function s(s, c) {
7
+ let l = n[s], u = l.readVariables ? l.readVariables(c) : { id: c.id }, d = l.readVariables ? !!(c.owner?.ownerId && c.owner.ownerType) : !!c.id, { data: f, loading: p, refetch: m } = o(l.sharesQuery, {
8
+ variables: u,
9
+ skip: !d,
10
+ fetchPolicy: "cache-and-network"
11
+ }), [h] = a(l.share), [g] = a(l.revokeShare), [_] = a(l.updateShareRole), [v] = a(l.createShareLink), [y] = a(l.revokeShareLink), b = f?.[l.readField] ?? null, { grants: x, links: S } = i(() => t(b?.shares ?? []), [b?.shares]), C = b?.vibeId ?? c.vibeId ?? null;
12
+ return {
13
+ loading: p,
14
+ grants: x,
15
+ links: S,
16
+ refetch: r(() => {
17
+ m();
18
+ }, [m]),
19
+ createUserShare: r(async ({ email: e, role: t, message: n, expiresAt: r }) => {
20
+ await h({ variables: { input: {
21
+ resourceId: c.id,
22
+ email: e,
23
+ role: t,
24
+ message: n,
25
+ expiresAt: r
26
+ } } }), m();
27
+ }, [
28
+ h,
29
+ c.id,
30
+ m
31
+ ]),
32
+ createLinkShare: r(async ({ role: e, expiresAt: t }) => {
33
+ let n = await v({ variables: { input: {
34
+ resourceId: c.id,
35
+ role: e,
36
+ expiresAt: t ?? null
37
+ } } });
38
+ return m(), { shareUrl: n.data?.[l.createLinkField]?.shareUrl ?? "" };
39
+ }, [
40
+ v,
41
+ c.id,
42
+ m,
43
+ l.createLinkField
44
+ ]),
45
+ updateRole: r(async (e, t) => {
46
+ await _({ variables: { input: {
47
+ resourceId: c.id,
48
+ shareId: e,
49
+ role: t
50
+ } } }), m();
51
+ }, [
52
+ _,
53
+ c.id,
54
+ m
55
+ ]),
56
+ revoke: r(async (e) => {
57
+ await g({ variables: { input: {
58
+ resourceId: c.id,
59
+ shareId: e
60
+ } } }), m();
61
+ }, [
62
+ g,
63
+ c.id,
64
+ m
65
+ ]),
66
+ revokeLink: r(async (e) => {
67
+ await y({ variables: { input: {
68
+ resourceId: c.id,
69
+ shareId: e
70
+ } } }), m();
71
+ }, [
72
+ y,
73
+ c.id,
74
+ m
75
+ ]),
76
+ capabilities: {
77
+ supportsUsers: !0,
78
+ supportsLink: !0,
79
+ supportsVibeShare: !!C,
80
+ supportsExpiry: !0,
81
+ roles: e
82
+ }
83
+ };
84
+ }
85
+ //#endregion
86
+ export { s as useEntityShareController };
87
+
88
+ //# sourceMappingURL=useEntityShareController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEntityShareController.js","names":[],"sources":["../../../src/components/sharing/useEntityShareController.ts"],"sourcesContent":["/**\n * `useEntityShareController` — a single, entity-parameterized share controller\n * mirroring `useVibeShareController` / `useNoteShareController`.\n *\n * Rather than hand-copy a 190-line controller five times (aiprompt, action,\n * aicontext, instructionfile, tunnel) — all of which expose the identical\n * `ShareEntityInput` / `RevokeShareInput` / `UpdateShareRoleInput` /\n * `CreateShareGrantLinkInput` backend contract — this hook takes the entity's\n * inline-`gql` document set from {@link ENTITY_SHARE_OPS} and projects the\n * response onto the fe-libs `ShareController`.\n *\n * It exposes every optional capability (links, role updates, revoke) since the\n * backend supports them all for these five entities. `supportsVibeShare` is\n * enabled only when the resource row carries a `vibeId` — a standalone resource\n * has no vibe audience to share with.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport type { ShareController, ShareRole } from '@burdenoff/fe-libs/sharing';\n\nimport { VIBE_SHARE_ROLES, partitionGrants, type ShareGrantNode } from './shareControllerTypes';\nimport {\n ENTITY_SHARE_OPS,\n type GenericShareEntity,\n type EntityShareIdentity,\n} from './entityShareOps';\n\n/** Minimal shape the read query returns under `data[readField]`. */\ninterface EntityShareReadNode {\n id: string;\n vibeId?: string | null;\n myRole: ShareRole | null;\n shares: ShareGrantNode[];\n}\n\ntype EntitySharesData = Record<string, EntityShareReadNode | null>;\n\ninterface CreateLinkData {\n [field: string]: ShareGrantNode | undefined;\n}\n\n/**\n * Identity + linkage the controller needs to read and mutate a resource's\n * shares. `id` always drives the share mutations (keyed by `resourceId`).\n * `owner` is required only for entities read by `(ownerId, ownerType)`\n * (scorecard, docs); `vibeId` enables the dialog's \"Everyone with Vibe\" mode.\n */\nexport interface EntityShareResource extends EntityShareIdentity {\n vibeId?: string | null;\n}\n\n/**\n * Build a {@link ShareController} for a generic-sharing entity. Pass a stable\n * resource reference: `{ id }` for the by-id entities, `{ id, owner }` for the\n * owner-keyed ones (scorecard, docs), plus `vibeId` when known so the dialog\n * can surface the \"Everyone with Vibe\" mode.\n */\nexport function useEntityShareController(\n entity: GenericShareEntity,\n resource: EntityShareResource\n): ShareController {\n const ops = ENTITY_SHARE_OPS[entity];\n\n const readVariables = ops.readVariables ? ops.readVariables(resource) : { id: resource.id };\n\n // Owner-keyed reads can't resolve until the owner pair is known; by-id reads\n // need the id. Both are required to avoid firing the query with empty args.\n const canRead = ops.readVariables\n ? Boolean(resource.owner?.ownerId && resource.owner.ownerType)\n : Boolean(resource.id);\n\n const { data, loading, refetch } = useQuery<EntitySharesData, Record<string, unknown>>(\n ops.sharesQuery,\n {\n variables: readVariables,\n skip: !canRead,\n fetchPolicy: 'cache-and-network',\n }\n );\n\n const [shareEntity] = useMutation(ops.share);\n const [revokeEntityShare] = useMutation(ops.revokeShare);\n const [updateEntityShareRole] = useMutation(ops.updateShareRole);\n const [createEntityShareLink] = useMutation<CreateLinkData>(ops.createShareLink);\n const [revokeEntityShareLink] = useMutation(ops.revokeShareLink);\n\n const node = data?.[ops.readField] ?? null;\n\n const { grants, links } = useMemo(() => partitionGrants(node?.shares ?? []), [node?.shares]);\n\n // Prefer the freshly-read `vibeId` from the resource row; fall back to the\n // caller-provided hint when the read hasn't resolved yet.\n const vibeId = node?.vibeId ?? resource.vibeId ?? null;\n\n const doRefetch = useCallback(() => {\n void refetch();\n }, [refetch]);\n\n const createUserShare = useCallback<ShareController['createUserShare']>(\n async ({ email, role, message, expiresAt }) => {\n await shareEntity({\n variables: { input: { resourceId: resource.id, email, role, message, expiresAt } },\n });\n void refetch();\n },\n [shareEntity, resource.id, refetch]\n );\n\n const createLinkShare = useCallback<NonNullable<ShareController['createLinkShare']>>(\n async ({ role, expiresAt }) => {\n const result = await createEntityShareLink({\n variables: { input: { resourceId: resource.id, role, expiresAt: expiresAt ?? null } },\n });\n void refetch();\n return { shareUrl: result.data?.[ops.createLinkField]?.shareUrl ?? '' };\n },\n [createEntityShareLink, resource.id, refetch, ops.createLinkField]\n );\n\n const updateRole = useCallback<NonNullable<ShareController['updateRole']>>(\n async (grantId, role) => {\n await updateEntityShareRole({\n variables: { input: { resourceId: resource.id, shareId: grantId, role } },\n });\n void refetch();\n },\n [updateEntityShareRole, resource.id, refetch]\n );\n\n const revoke = useCallback<NonNullable<ShareController['revoke']>>(\n async (grantId) => {\n await revokeEntityShare({\n variables: { input: { resourceId: resource.id, shareId: grantId } },\n });\n void refetch();\n },\n [revokeEntityShare, resource.id, refetch]\n );\n\n const revokeLink = useCallback<NonNullable<ShareController['revokeLink']>>(\n async (grantId) => {\n await revokeEntityShareLink({\n variables: { input: { resourceId: resource.id, shareId: grantId } },\n });\n void refetch();\n },\n [revokeEntityShareLink, resource.id, refetch]\n );\n\n return {\n loading,\n grants,\n links,\n refetch: doRefetch,\n createUserShare,\n createLinkShare,\n updateRole,\n revoke,\n revokeLink,\n capabilities: {\n supportsUsers: true,\n supportsLink: true,\n supportsVibeShare: Boolean(vibeId),\n supportsExpiry: true,\n roles: VIBE_SHARE_ROLES,\n },\n };\n}\n"],"mappings":";;;;;AA0DA,SAAgB,EACd,GACA,GACiB;CACjB,IAAM,IAAM,EAAiB,IAEvB,IAAgB,EAAI,gBAAgB,EAAI,cAAc,EAAS,GAAG,EAAE,IAAI,EAAS,IAAI,EAIrF,IAAU,EAAI,gBAChB,GAAQ,EAAS,OAAO,WAAW,EAAS,MAAM,aAClD,EAAQ,EAAS,IAEf,EAAE,SAAM,YAAS,eAAY,EACjC,EAAI,aACJ;EACE,WAAW;EACX,MAAM,CAAC;EACP,aAAa;EACd,CACF,EAEK,CAAC,KAAe,EAAY,EAAI,MAAM,EACtC,CAAC,KAAqB,EAAY,EAAI,YAAY,EAClD,CAAC,KAAyB,EAAY,EAAI,gBAAgB,EAC1D,CAAC,KAAyB,EAA4B,EAAI,gBAAgB,EAC1E,CAAC,KAAyB,EAAY,EAAI,gBAAgB,EAE1D,IAAO,IAAO,EAAI,cAAc,MAEhC,EAAE,WAAQ,aAAU,QAAc,EAAgB,GAAM,UAAU,EAAE,CAAC,EAAE,CAAC,GAAM,OAAO,CAAC,EAItF,IAAS,GAAM,UAAU,EAAS,UAAU;AAyDlD,QAAO;EACL;EACA;EACA;EACA,SA3DgB,QAAkB;AAC7B,MAAS;KACb,CAAC,EAAQ,CAAC;EA0DX,iBAxDsB,EACtB,OAAO,EAAE,UAAO,SAAM,YAAS,mBAAgB;AAIxC,GAHL,MAAM,EAAY,EAChB,WAAW,EAAE,OAAO;IAAE,YAAY,EAAS;IAAI;IAAO;IAAM;IAAS;IAAW,EAAE,EACnF,CAAC,EACG,GAAS;KAEhB;GAAC;GAAa,EAAS;GAAI;GAAQ,CACpC;EAiDC,iBA/CsB,EACtB,OAAO,EAAE,SAAM,mBAAgB;GAC7B,IAAM,IAAS,MAAM,EAAsB,EACzC,WAAW,EAAE,OAAO;IAAE,YAAY,EAAS;IAAI;IAAM,WAAW,KAAa;IAAM,EAAE,EACtF,CAAC;AAEF,UADK,GAAS,EACP,EAAE,UAAU,EAAO,OAAO,EAAI,kBAAkB,YAAY,IAAI;KAEzE;GAAC;GAAuB,EAAS;GAAI;GAAS,EAAI;GAAgB,CACnE;EAuCC,YArCiB,EACjB,OAAO,GAAS,MAAS;AAIlB,GAHL,MAAM,EAAsB,EAC1B,WAAW,EAAE,OAAO;IAAE,YAAY,EAAS;IAAI,SAAS;IAAS;IAAM,EAAE,EAC1E,CAAC,EACG,GAAS;KAEhB;GAAC;GAAuB,EAAS;GAAI;GAAQ,CAC9C;EA8BC,QA5Ba,EACb,OAAO,MAAY;AAIZ,GAHL,MAAM,EAAkB,EACtB,WAAW,EAAE,OAAO;IAAE,YAAY,EAAS;IAAI,SAAS;IAAS,EAAE,EACpE,CAAC,EACG,GAAS;KAEhB;GAAC;GAAmB,EAAS;GAAI;GAAQ,CAC1C;EAqBC,YAnBiB,EACjB,OAAO,MAAY;AAIZ,GAHL,MAAM,EAAsB,EAC1B,WAAW,EAAE,OAAO;IAAE,YAAY,EAAS;IAAI,SAAS;IAAS,EAAE,EACpE,CAAC,EACG,GAAS;KAEhB;GAAC;GAAuB,EAAS;GAAI;GAAQ,CAC9C;EAYC,cAAc;GACZ,eAAe;GACf,cAAc;GACd,mBAAmB,EAAQ;GAC3B,gBAAgB;GAChB,OAAO;GACR;EACF"}
@@ -65,12 +65,17 @@ var e = {
65
65
  DOCS_PAGE_CREATE: "docs_page:create",
66
66
  DOCS_PAGE_UPDATE: "docs_page:update",
67
67
  DOCS_PAGE_DELETE: "docs_page:delete",
68
+ DOCS_SITE_SHARE: "docs_site:share",
68
69
  ACTION_LIST: "action:list",
69
70
  ACTION_READ: "action:read",
70
71
  ACTION_CREATE: "action:create",
71
72
  ACTION_UPDATE: "action:update",
72
73
  ACTION_DELETE: "action:delete",
73
74
  ACTION_EXECUTE: "action:execute",
75
+ ACTION_SHARE: "action:share",
76
+ AIPROMPT_SHARE: "ai-prompt:share",
77
+ AICONTEXT_SHARE: "ai-context:share",
78
+ INSTRUCTION_FILE_SHARE: "instruction-file:share",
74
79
  AUDIT_LIST: "audit:list",
75
80
  AUDIT_READ: "audit:read",
76
81
  AUDIT_DELETE: "audit:delete",
@@ -80,10 +85,16 @@ var e = {
80
85
  TARGET_CREATE: "target:create",
81
86
  TARGET_UPDATE: "target:update",
82
87
  TARGET_DELETE: "target:delete",
88
+ TARGET_SHARE: "target:share",
89
+ CATALOG_SHARE: "catalog:share",
90
+ COMPONENT_SHARE: "component:share",
91
+ TEMPLATE_SHARE: "template:share",
92
+ SCORECARD_SHARE: "scorecard:share",
83
93
  TUNNEL_LIST: "tunnel:list",
84
94
  TUNNEL_READ: "tunnel:read",
85
95
  TUNNEL_CREATE: "tunnel:create",
86
96
  TUNNEL_DELETE: "tunnel:delete",
97
+ TUNNEL_SHARE: "tunnel:share",
87
98
  ANALYTICS_LIST: "analytics:list",
88
99
  ANALYTICS_READ: "analytics:read",
89
100
  LOG_LIST: "log:list",
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","names":[],"sources":["../../src/constants/permissions.ts"],"sourcesContent":["/**\n * VibeControls Permission Constants\n *\n * All permission strings for VibeControls resources.\n * Use with fe-libs usePermissions hook: hasPermission(VIBE_PERMISSIONS.VIBE_CREATE)\n *\n * Resource types:\n * - vibe: list, read, create, update, delete, scan, manage\n * - vibecommand: list, read, create, update, delete\n * - agent: list, read, create, update, delete\n * - session: list, read, create, update, delete, execute\n * - note: list, read, create, update, delete\n * - webhook: list, read, create, update, delete\n * - action: list, read, create, update, delete, execute\n * - calendar-agent-task: list, read, create, update, delete, execute\n * - configuration: list, read, create, update, delete\n * - docs_site: list, read, create, update, delete, execute\n * - docs_page: list, read, create, update, delete\n * - target: list, read, create, update, delete\n * - tunnel: list, read, create, delete\n * - analytics: list, read\n * - log: list, read\n */\n\nexport const VIBE_PERMISSIONS = {\n // Vibe resources\n VIBE_LIST: 'vibe:list',\n VIBE_READ: 'vibe:read',\n VIBE_CREATE: 'vibe:create',\n VIBE_UPDATE: 'vibe:update',\n VIBE_DELETE: 'vibe:delete',\n VIBE_SCAN: 'vibe:scan',\n VIBE_MANAGE: 'vibe:manage',\n\n // VibeCommand resources\n VIBECOMMAND_LIST: 'vibecommand:list',\n VIBECOMMAND_READ: 'vibecommand:read',\n VIBECOMMAND_CREATE: 'vibecommand:create',\n VIBECOMMAND_UPDATE: 'vibecommand:update',\n VIBECOMMAND_DELETE: 'vibecommand:delete',\n\n // Agent resources\n AGENT_LIST: 'agent:list',\n AGENT_READ: 'agent:read',\n AGENT_CREATE: 'agent:create',\n AGENT_UPDATE: 'agent:update',\n AGENT_DELETE: 'agent:delete',\n\n // Session resources\n SESSION_LIST: 'session:list',\n SESSION_READ: 'session:read',\n SESSION_CREATE: 'session:create',\n SESSION_UPDATE: 'session:update',\n SESSION_DELETE: 'session:delete',\n SESSION_EXECUTE: 'session:execute',\n\n // Note resources\n NOTE_LIST: 'note:list',\n NOTE_READ: 'note:read',\n NOTE_CREATE: 'note:create',\n NOTE_UPDATE: 'note:update',\n NOTE_DELETE: 'note:delete',\n\n // Webhook resources\n WEBHOOK_LIST: 'webhook:list',\n WEBHOOK_READ: 'webhook:read',\n WEBHOOK_CREATE: 'webhook:create',\n WEBHOOK_UPDATE: 'webhook:update',\n WEBHOOK_DELETE: 'webhook:delete',\n\n // VibeDeck resources\n VIBEDECK_LIST: 'vibedeck:list',\n VIBEDECK_READ: 'vibedeck:read',\n VIBEDECK_CREATE: 'vibedeck:create',\n VIBEDECK_UPDATE: 'vibedeck:update',\n VIBEDECK_DELETE: 'vibedeck:delete',\n VIBEDECK_EXECUTE: 'vibedeck:execute',\n VIBEDECK_SHARE: 'vibedeck:share',\n\n // Calendar Agent Task resources\n CALENDAR_AGENT_TASK_LIST: 'calendar-agent-task:list',\n CALENDAR_AGENT_TASK_READ: 'calendar-agent-task:read',\n CALENDAR_AGENT_TASK_CREATE: 'calendar-agent-task:create',\n CALENDAR_AGENT_TASK_UPDATE: 'calendar-agent-task:update',\n CALENDAR_AGENT_TASK_DELETE: 'calendar-agent-task:delete',\n CALENDAR_AGENT_TASK_EXECUTE: 'calendar-agent-task:execute',\n\n // Schedule resources (wspace-scheduler-svc — the unified-source\n // ScheduledJobs surfaced on the Calendar agenda live here).\n // `scheduledJob`/`scheduledJobs` enforce `schedule:read`;\n // `executeJobNow` enforces `schedule:execute`. Distinct from\n // `calendar-agent-task:*` so RBAC denials don't cross-bleed\n // between the two services.\n SCHEDULE_LIST: 'schedule:list',\n SCHEDULE_READ: 'schedule:read',\n SCHEDULE_EXECUTE: 'schedule:execute',\n\n // Configuration resources\n CONFIG_LIST: 'configuration:list',\n CONFIG_READ: 'configuration:read',\n CONFIG_CREATE: 'configuration:create',\n CONFIG_UPDATE: 'configuration:update',\n CONFIG_DELETE: 'configuration:delete',\n\n // Docs Site resources\n DOCS_SITE_LIST: 'docs_site:list',\n DOCS_SITE_READ: 'docs_site:read',\n DOCS_SITE_CREATE: 'docs_site:create',\n DOCS_SITE_UPDATE: 'docs_site:update',\n DOCS_SITE_DELETE: 'docs_site:delete',\n DOCS_COMPILE: 'docs_site:execute',\n\n // Docs Page resources\n DOCS_PAGE_LIST: 'docs_page:list',\n DOCS_PAGE_READ: 'docs_page:read',\n DOCS_PAGE_CREATE: 'docs_page:create',\n DOCS_PAGE_UPDATE: 'docs_page:update',\n DOCS_PAGE_DELETE: 'docs_page:delete',\n\n // Action resources\n ACTION_LIST: 'action:list',\n ACTION_READ: 'action:read',\n ACTION_CREATE: 'action:create',\n ACTION_UPDATE: 'action:update',\n ACTION_DELETE: 'action:delete',\n ACTION_EXECUTE: 'action:execute',\n\n // Audit resources\n AUDIT_LIST: 'audit:list',\n AUDIT_READ: 'audit:read',\n AUDIT_DELETE: 'audit:delete',\n AUDIT_EXPORT: 'audit:export',\n\n // Target resources — guards wired in BOFF-2034 (Remaining Pages Audit)\n TARGET_LIST: 'target:list',\n TARGET_READ: 'target:read',\n TARGET_CREATE: 'target:create',\n TARGET_UPDATE: 'target:update',\n TARGET_DELETE: 'target:delete',\n\n // Tunnel resources — no TUNNEL_UPDATE: tunnels are create-or-delete only\n TUNNEL_LIST: 'tunnel:list',\n TUNNEL_READ: 'tunnel:read',\n TUNNEL_CREATE: 'tunnel:create',\n TUNNEL_DELETE: 'tunnel:delete',\n\n // Analytics resources\n ANALYTICS_LIST: 'analytics:list',\n ANALYTICS_READ: 'analytics:read',\n\n // Log resources\n LOG_LIST: 'log:list',\n LOG_READ: 'log:read',\n} as const;\n\nexport type VibePermission = (typeof VIBE_PERMISSIONS)[keyof typeof VIBE_PERMISSIONS];\n"],"mappings":";AAwBA,IAAa,IAAmB;CAE9B,WAAW;CACX,WAAW;CACX,aAAa;CACb,aAAa;CACb,aAAa;CACb,WAAW;CACX,aAAa;CAGb,kBAAkB;CAClB,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,oBAAoB;CAGpB,YAAY;CACZ,YAAY;CACZ,cAAc;CACd,cAAc;CACd,cAAc;CAGd,cAAc;CACd,cAAc;CACd,gBAAgB;CAChB,gBAAgB;CAChB,gBAAgB;CAChB,iBAAiB;CAGjB,WAAW;CACX,WAAW;CACX,aAAa;CACb,aAAa;CACb,aAAa;CAGb,cAAc;CACd,cAAc;CACd,gBAAgB;CAChB,gBAAgB;CAChB,gBAAgB;CAGhB,eAAe;CACf,eAAe;CACf,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAGhB,0BAA0B;CAC1B,0BAA0B;CAC1B,4BAA4B;CAC5B,4BAA4B;CAC5B,4BAA4B;CAC5B,6BAA6B;CAQ7B,eAAe;CACf,eAAe;CACf,kBAAkB;CAGlB,aAAa;CACb,aAAa;CACb,eAAe;CACf,eAAe;CACf,eAAe;CAGf,gBAAgB;CAChB,gBAAgB;CAChB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,cAAc;CAGd,gBAAgB;CAChB,gBAAgB;CAChB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAGlB,aAAa;CACb,aAAa;CACb,eAAe;CACf,eAAe;CACf,eAAe;CACf,gBAAgB;CAGhB,YAAY;CACZ,YAAY;CACZ,cAAc;CACd,cAAc;CAGd,aAAa;CACb,aAAa;CACb,eAAe;CACf,eAAe;CACf,eAAe;CAGf,aAAa;CACb,aAAa;CACb,eAAe;CACf,eAAe;CAGf,gBAAgB;CAChB,gBAAgB;CAGhB,UAAU;CACV,UAAU;CACX"}
1
+ {"version":3,"file":"permissions.js","names":[],"sources":["../../src/constants/permissions.ts"],"sourcesContent":["/**\n * VibeControls Permission Constants\n *\n * All permission strings for VibeControls resources.\n * Use with fe-libs usePermissions hook: hasPermission(VIBE_PERMISSIONS.VIBE_CREATE)\n *\n * Resource types:\n * - vibe: list, read, create, update, delete, scan, manage\n * - vibecommand: list, read, create, update, delete\n * - agent: list, read, create, update, delete\n * - session: list, read, create, update, delete, execute\n * - note: list, read, create, update, delete\n * - webhook: list, read, create, update, delete\n * - action: list, read, create, update, delete, execute\n * - calendar-agent-task: list, read, create, update, delete, execute\n * - configuration: list, read, create, update, delete\n * - docs_site: list, read, create, update, delete, execute\n * - docs_page: list, read, create, update, delete\n * - target: list, read, create, update, delete\n * - tunnel: list, read, create, delete\n * - analytics: list, read\n * - log: list, read\n */\n\nexport const VIBE_PERMISSIONS = {\n // Vibe resources\n VIBE_LIST: 'vibe:list',\n VIBE_READ: 'vibe:read',\n VIBE_CREATE: 'vibe:create',\n VIBE_UPDATE: 'vibe:update',\n VIBE_DELETE: 'vibe:delete',\n VIBE_SCAN: 'vibe:scan',\n VIBE_MANAGE: 'vibe:manage',\n\n // VibeCommand resources\n VIBECOMMAND_LIST: 'vibecommand:list',\n VIBECOMMAND_READ: 'vibecommand:read',\n VIBECOMMAND_CREATE: 'vibecommand:create',\n VIBECOMMAND_UPDATE: 'vibecommand:update',\n VIBECOMMAND_DELETE: 'vibecommand:delete',\n\n // Agent resources\n AGENT_LIST: 'agent:list',\n AGENT_READ: 'agent:read',\n AGENT_CREATE: 'agent:create',\n AGENT_UPDATE: 'agent:update',\n AGENT_DELETE: 'agent:delete',\n\n // Session resources\n SESSION_LIST: 'session:list',\n SESSION_READ: 'session:read',\n SESSION_CREATE: 'session:create',\n SESSION_UPDATE: 'session:update',\n SESSION_DELETE: 'session:delete',\n SESSION_EXECUTE: 'session:execute',\n\n // Note resources\n NOTE_LIST: 'note:list',\n NOTE_READ: 'note:read',\n NOTE_CREATE: 'note:create',\n NOTE_UPDATE: 'note:update',\n NOTE_DELETE: 'note:delete',\n\n // Webhook resources\n WEBHOOK_LIST: 'webhook:list',\n WEBHOOK_READ: 'webhook:read',\n WEBHOOK_CREATE: 'webhook:create',\n WEBHOOK_UPDATE: 'webhook:update',\n WEBHOOK_DELETE: 'webhook:delete',\n\n // VibeDeck resources\n VIBEDECK_LIST: 'vibedeck:list',\n VIBEDECK_READ: 'vibedeck:read',\n VIBEDECK_CREATE: 'vibedeck:create',\n VIBEDECK_UPDATE: 'vibedeck:update',\n VIBEDECK_DELETE: 'vibedeck:delete',\n VIBEDECK_EXECUTE: 'vibedeck:execute',\n VIBEDECK_SHARE: 'vibedeck:share',\n\n // Calendar Agent Task resources\n CALENDAR_AGENT_TASK_LIST: 'calendar-agent-task:list',\n CALENDAR_AGENT_TASK_READ: 'calendar-agent-task:read',\n CALENDAR_AGENT_TASK_CREATE: 'calendar-agent-task:create',\n CALENDAR_AGENT_TASK_UPDATE: 'calendar-agent-task:update',\n CALENDAR_AGENT_TASK_DELETE: 'calendar-agent-task:delete',\n CALENDAR_AGENT_TASK_EXECUTE: 'calendar-agent-task:execute',\n\n // Schedule resources (wspace-scheduler-svc — the unified-source\n // ScheduledJobs surfaced on the Calendar agenda live here).\n // `scheduledJob`/`scheduledJobs` enforce `schedule:read`;\n // `executeJobNow` enforces `schedule:execute`. Distinct from\n // `calendar-agent-task:*` so RBAC denials don't cross-bleed\n // between the two services.\n SCHEDULE_LIST: 'schedule:list',\n SCHEDULE_READ: 'schedule:read',\n SCHEDULE_EXECUTE: 'schedule:execute',\n\n // Configuration resources\n CONFIG_LIST: 'configuration:list',\n CONFIG_READ: 'configuration:read',\n CONFIG_CREATE: 'configuration:create',\n CONFIG_UPDATE: 'configuration:update',\n CONFIG_DELETE: 'configuration:delete',\n\n // Docs Site resources\n DOCS_SITE_LIST: 'docs_site:list',\n DOCS_SITE_READ: 'docs_site:read',\n DOCS_SITE_CREATE: 'docs_site:create',\n DOCS_SITE_UPDATE: 'docs_site:update',\n DOCS_SITE_DELETE: 'docs_site:delete',\n DOCS_COMPILE: 'docs_site:execute',\n\n // Docs Page resources\n DOCS_PAGE_LIST: 'docs_page:list',\n DOCS_PAGE_READ: 'docs_page:read',\n DOCS_PAGE_CREATE: 'docs_page:create',\n DOCS_PAGE_UPDATE: 'docs_page:update',\n DOCS_PAGE_DELETE: 'docs_page:delete',\n // Docs Site generic-sharing surface (backend `shareDocs`, @rbac resource `docs_site`)\n DOCS_SITE_SHARE: 'docs_site:share',\n\n // Action resources\n ACTION_LIST: 'action:list',\n ACTION_READ: 'action:read',\n ACTION_CREATE: 'action:create',\n ACTION_UPDATE: 'action:update',\n ACTION_DELETE: 'action:delete',\n ACTION_EXECUTE: 'action:execute',\n ACTION_SHARE: 'action:share',\n\n // AI Prompt resources — generic-sharing surface (backend `shareAiPrompt`)\n AIPROMPT_SHARE: 'ai-prompt:share',\n\n // AI Context resources — generic-sharing surface (backend `shareAiContext`)\n AICONTEXT_SHARE: 'ai-context:share',\n\n // Agent Instruction File resources — generic-sharing surface\n // (backend `shareAgentInstructionFile`)\n INSTRUCTION_FILE_SHARE: 'instruction-file:share',\n\n // Audit resources\n AUDIT_LIST: 'audit:list',\n AUDIT_READ: 'audit:read',\n AUDIT_DELETE: 'audit:delete',\n AUDIT_EXPORT: 'audit:export',\n\n // Target resources — guards wired in BOFF-2034 (Remaining Pages Audit)\n TARGET_LIST: 'target:list',\n TARGET_READ: 'target:read',\n TARGET_CREATE: 'target:create',\n TARGET_UPDATE: 'target:update',\n TARGET_DELETE: 'target:delete',\n // Target generic-sharing surface (backend `shareTarget`, @rbac resource `target`)\n TARGET_SHARE: 'target:share',\n\n // Catalog resources — generic-sharing surface (backend `shareCatalog`)\n CATALOG_SHARE: 'catalog:share',\n\n // Component resources — generic-sharing surface (backend `shareComponent`)\n COMPONENT_SHARE: 'component:share',\n\n // Template resources — generic-sharing surface (backend `shareTemplate`)\n TEMPLATE_SHARE: 'template:share',\n\n // Scorecard resources — generic-sharing surface (backend `shareScorecard`)\n SCORECARD_SHARE: 'scorecard:share',\n\n // Tunnel resources — no TUNNEL_UPDATE: tunnels are create-or-delete only\n TUNNEL_LIST: 'tunnel:list',\n TUNNEL_READ: 'tunnel:read',\n TUNNEL_CREATE: 'tunnel:create',\n TUNNEL_DELETE: 'tunnel:delete',\n TUNNEL_SHARE: 'tunnel:share',\n\n // Analytics resources\n ANALYTICS_LIST: 'analytics:list',\n ANALYTICS_READ: 'analytics:read',\n\n // Log resources\n LOG_LIST: 'log:list',\n LOG_READ: 'log:read',\n} as const;\n\nexport type VibePermission = (typeof VIBE_PERMISSIONS)[keyof typeof VIBE_PERMISSIONS];\n"],"mappings":";AAwBA,IAAa,IAAmB;CAE9B,WAAW;CACX,WAAW;CACX,aAAa;CACb,aAAa;CACb,aAAa;CACb,WAAW;CACX,aAAa;CAGb,kBAAkB;CAClB,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,oBAAoB;CAGpB,YAAY;CACZ,YAAY;CACZ,cAAc;CACd,cAAc;CACd,cAAc;CAGd,cAAc;CACd,cAAc;CACd,gBAAgB;CAChB,gBAAgB;CAChB,gBAAgB;CAChB,iBAAiB;CAGjB,WAAW;CACX,WAAW;CACX,aAAa;CACb,aAAa;CACb,aAAa;CAGb,cAAc;CACd,cAAc;CACd,gBAAgB;CAChB,gBAAgB;CAChB,gBAAgB;CAGhB,eAAe;CACf,eAAe;CACf,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAGhB,0BAA0B;CAC1B,0BAA0B;CAC1B,4BAA4B;CAC5B,4BAA4B;CAC5B,4BAA4B;CAC5B,6BAA6B;CAQ7B,eAAe;CACf,eAAe;CACf,kBAAkB;CAGlB,aAAa;CACb,aAAa;CACb,eAAe;CACf,eAAe;CACf,eAAe;CAGf,gBAAgB;CAChB,gBAAgB;CAChB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,cAAc;CAGd,gBAAgB;CAChB,gBAAgB;CAChB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAElB,iBAAiB;CAGjB,aAAa;CACb,aAAa;CACb,eAAe;CACf,eAAe;CACf,eAAe;CACf,gBAAgB;CAChB,cAAc;CAGd,gBAAgB;CAGhB,iBAAiB;CAIjB,wBAAwB;CAGxB,YAAY;CACZ,YAAY;CACZ,cAAc;CACd,cAAc;CAGd,aAAa;CACb,aAAa;CACb,eAAe;CACf,eAAe;CACf,eAAe;CAEf,cAAc;CAGd,eAAe;CAGf,iBAAiB;CAGjB,gBAAgB;CAGhB,iBAAiB;CAGjB,aAAa;CACb,aAAa;CACb,eAAe;CACf,eAAe;CACf,cAAc;CAGd,gBAAgB;CAChB,gBAAgB;CAGhB,UAAU;CACV,UAAU;CACX"}