@agent-native/core 0.16.2 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/README.md +21 -5
  2. package/dist/agent/production-agent.d.ts.map +1 -1
  3. package/dist/agent/production-agent.js +24 -1
  4. package/dist/agent/production-agent.js.map +1 -1
  5. package/dist/cli/code-agent-executor.js +1 -1
  6. package/dist/cli/code-agent-executor.js.map +1 -1
  7. package/dist/cli/code.d.ts.map +1 -1
  8. package/dist/cli/code.js +29 -4
  9. package/dist/cli/code.js.map +1 -1
  10. package/dist/client/AgentPanel.d.ts.map +1 -1
  11. package/dist/client/AgentPanel.js +9 -1
  12. package/dist/client/AgentPanel.js.map +1 -1
  13. package/dist/client/AssistantChat.js +2 -2
  14. package/dist/client/AssistantChat.js.map +1 -1
  15. package/dist/client/ConnectBuilderCard.js +1 -1
  16. package/dist/client/ConnectBuilderCard.js.map +1 -1
  17. package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
  18. package/dist/client/components/CodeRequiredDialog.js +3 -1
  19. package/dist/client/components/CodeRequiredDialog.js.map +1 -1
  20. package/dist/client/composer/AgentComposerFrame.d.ts +3 -1
  21. package/dist/client/composer/AgentComposerFrame.d.ts.map +1 -1
  22. package/dist/client/composer/AgentComposerFrame.js +3 -3
  23. package/dist/client/composer/AgentComposerFrame.js.map +1 -1
  24. package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
  25. package/dist/client/composer/ComposerPlusMenu.js +2 -7
  26. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  27. package/dist/client/composer/PromptComposer.d.ts +4 -1
  28. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  29. package/dist/client/composer/PromptComposer.js +3 -3
  30. package/dist/client/composer/PromptComposer.js.map +1 -1
  31. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  32. package/dist/client/composer/TiptapComposer.js +13 -3
  33. package/dist/client/composer/TiptapComposer.js.map +1 -1
  34. package/dist/client/onboarding/OnboardingPanel.js +1 -1
  35. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  36. package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
  37. package/dist/client/settings/BackgroundAgentSection.js +9 -2
  38. package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
  39. package/dist/client/settings/BrowserSection.d.ts.map +1 -1
  40. package/dist/client/settings/BrowserSection.js +17 -3
  41. package/dist/client/settings/BrowserSection.js.map +1 -1
  42. package/dist/client/settings/DemoModeSection.d.ts +15 -0
  43. package/dist/client/settings/DemoModeSection.d.ts.map +1 -0
  44. package/dist/client/settings/DemoModeSection.js +72 -0
  45. package/dist/client/settings/DemoModeSection.js.map +1 -0
  46. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  47. package/dist/client/settings/SettingsPanel.js +8 -6
  48. package/dist/client/settings/SettingsPanel.js.map +1 -1
  49. package/dist/client/settings/useBuilderStatus.d.ts +15 -2
  50. package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
  51. package/dist/client/settings/useBuilderStatus.js +99 -11
  52. package/dist/client/settings/useBuilderStatus.js.map +1 -1
  53. package/dist/client/settings/useBuilderStatus.spec.js +12 -6
  54. package/dist/client/settings/useBuilderStatus.spec.js.map +1 -1
  55. package/dist/code-agents/background-controller.d.ts +39 -0
  56. package/dist/code-agents/background-controller.d.ts.map +1 -0
  57. package/dist/code-agents/background-controller.js +249 -0
  58. package/dist/code-agents/background-controller.js.map +1 -0
  59. package/dist/code-agents/background-run.d.ts +58 -0
  60. package/dist/code-agents/background-run.d.ts.map +1 -0
  61. package/dist/code-agents/background-run.js +58 -0
  62. package/dist/code-agents/background-run.js.map +1 -0
  63. package/dist/code-agents/index.d.ts +2 -0
  64. package/dist/code-agents/index.d.ts.map +1 -1
  65. package/dist/code-agents/index.js +2 -0
  66. package/dist/code-agents/index.js.map +1 -1
  67. package/dist/connections/index.d.ts +1 -0
  68. package/dist/connections/index.d.ts.map +1 -1
  69. package/dist/connections/index.js +1 -0
  70. package/dist/connections/index.js.map +1 -1
  71. package/dist/connections/reader.d.ts +248 -0
  72. package/dist/connections/reader.d.ts.map +1 -0
  73. package/dist/connections/reader.js +461 -0
  74. package/dist/connections/reader.js.map +1 -0
  75. package/dist/credentials/index.d.ts +11 -0
  76. package/dist/credentials/index.d.ts.map +1 -1
  77. package/dist/credentials/index.js +40 -15
  78. package/dist/credentials/index.js.map +1 -1
  79. package/dist/demo/actions/toggle-demo-mode.d.ts +3 -0
  80. package/dist/demo/actions/toggle-demo-mode.d.ts.map +1 -0
  81. package/dist/demo/actions/toggle-demo-mode.js +21 -0
  82. package/dist/demo/actions/toggle-demo-mode.js.map +1 -0
  83. package/dist/demo/config.d.ts +9 -0
  84. package/dist/demo/config.d.ts.map +1 -0
  85. package/dist/demo/config.js +58 -0
  86. package/dist/demo/config.js.map +1 -0
  87. package/dist/demo/redact.d.ts +17 -0
  88. package/dist/demo/redact.d.ts.map +1 -0
  89. package/dist/demo/redact.js +0 -0
  90. package/dist/demo/redact.js.map +1 -0
  91. package/dist/index.d.ts +2 -2
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +2 -2
  94. package/dist/index.js.map +1 -1
  95. package/dist/server/action-discovery.d.ts.map +1 -1
  96. package/dist/server/action-discovery.js +1 -0
  97. package/dist/server/action-discovery.js.map +1 -1
  98. package/dist/server/action-routes.d.ts.map +1 -1
  99. package/dist/server/action-routes.js +13 -3
  100. package/dist/server/action-routes.js.map +1 -1
  101. package/dist/server/agent-chat-plugin.d.ts +18 -0
  102. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  103. package/dist/server/agent-chat-plugin.js +57 -9
  104. package/dist/server/agent-chat-plugin.js.map +1 -1
  105. package/dist/server/agent-teams.d.ts +66 -1
  106. package/dist/server/agent-teams.d.ts.map +1 -1
  107. package/dist/server/agent-teams.js +433 -16
  108. package/dist/server/agent-teams.js.map +1 -1
  109. package/dist/server/builder-browser.d.ts +11 -0
  110. package/dist/server/builder-browser.d.ts.map +1 -1
  111. package/dist/server/builder-browser.js +45 -0
  112. package/dist/server/builder-browser.js.map +1 -1
  113. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  114. package/dist/server/core-routes-plugin.js +25 -2
  115. package/dist/server/core-routes-plugin.js.map +1 -1
  116. package/dist/templates/workspace-root/AGENTS.md +5 -5
  117. package/dist/templates/workspace-root/README.md +1 -1
  118. package/dist/workspace-connections/credentials.d.ts +64 -0
  119. package/dist/workspace-connections/credentials.d.ts.map +1 -0
  120. package/dist/workspace-connections/credentials.js +378 -0
  121. package/dist/workspace-connections/credentials.js.map +1 -0
  122. package/dist/workspace-connections/index.d.ts +2 -1
  123. package/dist/workspace-connections/index.d.ts.map +1 -1
  124. package/dist/workspace-connections/index.js +2 -1
  125. package/dist/workspace-connections/index.js.map +1 -1
  126. package/dist/workspace-connections/store.d.ts +16 -0
  127. package/dist/workspace-connections/store.d.ts.map +1 -1
  128. package/dist/workspace-connections/store.js +57 -1
  129. package/dist/workspace-connections/store.js.map +1 -1
  130. package/docs/content/agent-teams.md +22 -5
  131. package/docs/content/cloneable-saas.md +2 -2
  132. package/docs/content/code-agents-ui.md +103 -3
  133. package/docs/content/creating-templates.md +16 -0
  134. package/docs/content/getting-started.md +40 -14
  135. package/docs/content/migration-workbench.md +25 -2
  136. package/docs/content/multi-app-workspace.md +1 -1
  137. package/docs/content/template-analytics.md +17 -1
  138. package/docs/content/template-brain.md +57 -28
  139. package/docs/content/template-dispatch.md +9 -2
  140. package/docs/content/workspace-connections.md +63 -14
  141. package/docs/content/workspace-management.md +9 -2
  142. package/docs/content/workspace.md +12 -5
  143. package/package.json +1 -1
  144. package/src/templates/workspace-root/AGENTS.md +5 -5
  145. package/src/templates/workspace-root/README.md +1 -1
@@ -60,15 +60,15 @@ coding agents can discover the same workspace-wide guidance from the root.
60
60
  - Do not satisfy a new-app request by adding a route, page, component, or file
61
61
  to `apps/starter` or another existing app unless the user explicitly asks to
62
62
  modify that existing app.
63
- - Treat first-party apps such as Mail, Calendar, Analytics, and Dispatch as
63
+ - Treat first-party apps such as Mail, Calendar, Analytics, Brain, and Dispatch as
64
64
  existing hosted/connected neighbors available through links and A2A/default
65
- connected agents. For example, Mail, Calendar, and Analytics already exist at
65
+ connected agents. For example, Mail, Calendar, Analytics, and Brain already exist at
66
66
  `https://mail.agent-native.com`, `https://calendar.agent-native.com`, and
67
- `https://analytics.agent-native.com`.
68
- - If a new app needs to use Mail, Calendar, Analytics, or similar first-party
67
+ `https://analytics.agent-native.com`, and `https://brain.agent-native.com`.
68
+ - If a new app needs to use Mail, Calendar, Analytics, Brain, or similar first-party
69
69
  data/agents, build only the genuinely new workflow and delegate/link to those
70
70
  existing apps. Do not create wrapper apps, child apps, nested template copies,
71
- or cloned Mail/Calendar/Analytics implementations inside the new app just to
71
+ or cloned Mail/Calendar/Analytics/Brain implementations inside the new app just to
72
72
  provide access.
73
73
  - Only create a first-party app copy when the user explicitly asks for a
74
74
  customized fork/copy of that app. Otherwise prefer the hosted/shared app so
@@ -116,7 +116,7 @@ separate workspace app registry to edit. React Router apps must preserve
116
116
  For requests phrased as creating an "agent", classify the scope first: simple
117
117
  recurring Dispatch behavior can stay in Dispatch, while a robust app-like
118
118
  teammate should become a real workspace app listed with the rest of the apps.
119
- First-party apps such as Mail, Calendar, Analytics, and Dispatch should be
119
+ First-party apps such as Mail, Calendar, Analytics, Brain, and Dispatch should be
120
120
  treated as existing hosted or connected neighbors. If a new app needs access to
121
121
  their data or agents, link/delegate to those apps through the workspace/A2A
122
122
  path rather than creating wrapper apps, child apps, or cloned template copies
@@ -0,0 +1,64 @@
1
+ import { type CredentialStorageScope } from "../credentials/index.js";
2
+ import { type SecretRef } from "../secrets/storage.js";
3
+ import { type WorkspaceConnectionAppAccessMode, type WorkspaceConnectionPublicCredentialRef } from "./store.js";
4
+ export type WorkspaceConnectionCredentialResolutionStatus = "resolved" | "missing_context" | "not_available" | "missing_ref" | "missing_secret" | "error";
5
+ export type WorkspaceConnectionCredentialBackend = "secrets" | "credentials";
6
+ export interface ResolveWorkspaceConnectionCredentialForAppOptions {
7
+ appId: string;
8
+ provider: string;
9
+ key: string;
10
+ connectionId?: string | null;
11
+ userEmail?: string | null;
12
+ orgId?: string | null;
13
+ }
14
+ export interface ResolveWorkspaceConnectionCredentialsForAppOptions extends Omit<ResolveWorkspaceConnectionCredentialForAppOptions, "key"> {
15
+ keys: string[];
16
+ }
17
+ export interface WorkspaceConnectionCredentialProvenance {
18
+ source: "workspace_connection";
19
+ provider: string;
20
+ requestedKey: string;
21
+ resolvedKey: string;
22
+ credentialRef: WorkspaceConnectionPublicCredentialRef;
23
+ connectionId: string;
24
+ connectionLabel: string;
25
+ grantId: string | null;
26
+ appAccessMode: WorkspaceConnectionAppAccessMode;
27
+ secretScope: SecretRef["scope"] | CredentialStorageScope;
28
+ backend: WorkspaceConnectionCredentialBackend;
29
+ }
30
+ export interface WorkspaceConnectionCredentialResolutionCheck {
31
+ status: Exclude<WorkspaceConnectionCredentialResolutionStatus, "resolved" | "missing_context">;
32
+ reason: string;
33
+ key: string;
34
+ resolvedKey?: string;
35
+ connectionId?: string;
36
+ connectionLabel?: string;
37
+ grantId?: string | null;
38
+ appAccessMode?: WorkspaceConnectionAppAccessMode;
39
+ credentialRef?: WorkspaceConnectionPublicCredentialRef;
40
+ secretScope?: SecretRef["scope"] | CredentialStorageScope;
41
+ backend?: WorkspaceConnectionCredentialBackend;
42
+ }
43
+ export interface WorkspaceConnectionCredentialResolution {
44
+ available: boolean;
45
+ status: WorkspaceConnectionCredentialResolutionStatus;
46
+ reason: string;
47
+ provider: string;
48
+ key: string;
49
+ value?: string;
50
+ provenance: WorkspaceConnectionCredentialProvenance | null;
51
+ checked: WorkspaceConnectionCredentialResolutionCheck[];
52
+ }
53
+ export interface WorkspaceConnectionCredentialsResolution {
54
+ available: boolean;
55
+ appId: string;
56
+ provider: string;
57
+ connectionId: string | null;
58
+ values: Record<string, string>;
59
+ results: Record<string, WorkspaceConnectionCredentialResolution>;
60
+ missingKeys: string[];
61
+ }
62
+ export declare function resolveWorkspaceConnectionCredentialForApp(options: ResolveWorkspaceConnectionCredentialForAppOptions): Promise<WorkspaceConnectionCredentialResolution>;
63
+ export declare function resolveWorkspaceConnectionCredentialsForApp(options: ResolveWorkspaceConnectionCredentialsForAppOptions): Promise<WorkspaceConnectionCredentialsResolution>;
64
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/workspace-connections/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAIL,KAAK,gCAAgC,EAGrC,KAAK,sCAAsC,EAC5C,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,6CAA6C,GACrD,UAAU,GACV,iBAAiB,GACjB,eAAe,GACf,aAAa,GACb,gBAAgB,GAChB,OAAO,CAAC;AAEZ,MAAM,MAAM,oCAAoC,GAAG,SAAS,GAAG,aAAa,CAAC;AAE7E,MAAM,WAAW,iDAAiD;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,kDAAmD,SAAQ,IAAI,CAC9E,iDAAiD,EACjD,KAAK,CACN;IACC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,uCAAuC;IACtD,MAAM,EAAE,sBAAsB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,sCAAsC,CAAC;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,gCAAgC,CAAC;IAChD,WAAW,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,sBAAsB,CAAC;IACzD,OAAO,EAAE,oCAAoC,CAAC;CAC/C;AAED,MAAM,WAAW,4CAA4C;IAC3D,MAAM,EAAE,OAAO,CACb,6CAA6C,EAC7C,UAAU,GAAG,iBAAiB,CAC/B,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,CAAC,EAAE,gCAAgC,CAAC;IACjD,aAAa,CAAC,EAAE,sCAAsC,CAAC;IACvD,WAAW,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,sBAAsB,CAAC;IAC1D,OAAO,CAAC,EAAE,oCAAoC,CAAC;CAChD;AAED,MAAM,WAAW,uCAAuC;IACtD,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,6CAA6C,CAAC;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,uCAAuC,GAAG,IAAI,CAAC;IAC3D,OAAO,EAAE,4CAA4C,EAAE,CAAC;CACzD;AAED,MAAM,WAAW,wCAAwC;IACvD,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,uCAAuC,CAAC,CAAC;IACjE,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AA6bD,wBAAsB,0CAA0C,CAC9D,OAAO,EAAE,iDAAiD,GACzD,OAAO,CAAC,uCAAuC,CAAC,CAuBlD;AAED,wBAAsB,2CAA2C,CAC/D,OAAO,EAAE,kDAAkD,GAC1D,OAAO,CAAC,wCAAwC,CAAC,CA+BnD"}
@@ -0,0 +1,378 @@
1
+ import { resolveCredentialForScope, } from "../credentials/index.js";
2
+ import { getCredentialContext, getRequestContext, runWithRequestContext, } from "../server/request-context.js";
3
+ import { readAppSecret } from "../secrets/storage.js";
4
+ import { listWorkspaceConnectionsForApp, markWorkspaceConnectionUsed, resolveWorkspaceConnectionForApp, } from "./store.js";
5
+ const PROVIDER_CREDENTIAL_KEY_ALIASES = {
6
+ hubspot: {
7
+ HUBSPOT_ACCESS_TOKEN: ["HUBSPOT_PRIVATE_APP_TOKEN"],
8
+ HUBSPOT_PRIVATE_APP_TOKEN: ["HUBSPOT_ACCESS_TOKEN"],
9
+ },
10
+ };
11
+ function normalizeRequired(value, label) {
12
+ const normalized = value.trim();
13
+ if (!normalized)
14
+ throw new Error(`${label} is required.`);
15
+ return normalized;
16
+ }
17
+ function normalizeCredentialKey(key) {
18
+ return key.trim().toUpperCase();
19
+ }
20
+ function uniqueStrings(values) {
21
+ return Array.from(new Set(values.map((value) => value.trim()).filter(Boolean)));
22
+ }
23
+ function credentialKeyAliases(provider, key) {
24
+ const aliases = PROVIDER_CREDENTIAL_KEY_ALIASES[provider.trim().toLowerCase()]?.[normalizeCredentialKey(key)] ?? [];
25
+ return uniqueStrings([key, ...aliases]);
26
+ }
27
+ function credentialKeyMatches(provider, requestedKey, refKey) {
28
+ const requested = new Set(credentialKeyAliases(provider, requestedKey).map(normalizeCredentialKey));
29
+ return requested.has(normalizeCredentialKey(refKey));
30
+ }
31
+ function lookupKeysForRef(provider, requestedKey, refKey) {
32
+ return uniqueStrings([
33
+ refKey,
34
+ ...credentialKeyAliases(provider, refKey),
35
+ requestedKey,
36
+ ...credentialKeyAliases(provider, requestedKey),
37
+ ]);
38
+ }
39
+ function publicCredentialRef(ref, source) {
40
+ return {
41
+ key: ref.key,
42
+ scope: ref.scope,
43
+ provider: ref.provider,
44
+ label: ref.label,
45
+ source,
46
+ };
47
+ }
48
+ function credentialRefsForConnection(connection) {
49
+ return [
50
+ ...(connection.explicitGrant?.credentialRefs ?? []).map((ref) => ({
51
+ ref,
52
+ publicRef: publicCredentialRef(ref, "grant"),
53
+ })),
54
+ ...connection.credentialRefs.map((ref) => ({
55
+ ref,
56
+ publicRef: publicCredentialRef(ref, "connection"),
57
+ })),
58
+ ];
59
+ }
60
+ function refScope(ref) {
61
+ return ref.scope === "user" ||
62
+ ref.scope === "org" ||
63
+ ref.scope === "workspace"
64
+ ? ref.scope
65
+ : undefined;
66
+ }
67
+ function workspaceScopeId(ctx) {
68
+ return ctx.orgId ?? `solo:${ctx.userEmail}`;
69
+ }
70
+ function credentialCandidatesForRef(ref, ctx) {
71
+ const scope = refScope(ref);
72
+ if (scope === "user") {
73
+ return [{ key: ref.key, scope: "user", scopeId: ctx.userEmail }];
74
+ }
75
+ if (scope === "org") {
76
+ return ctx.orgId
77
+ ? [{ key: ref.key, scope: "org", scopeId: ctx.orgId }]
78
+ : [];
79
+ }
80
+ if (scope === "workspace") {
81
+ return [
82
+ { key: ref.key, scope: "workspace", scopeId: workspaceScopeId(ctx) },
83
+ ];
84
+ }
85
+ if (ctx.orgId) {
86
+ return [
87
+ { key: ref.key, scope: "org", scopeId: ctx.orgId },
88
+ { key: ref.key, scope: "workspace", scopeId: ctx.orgId },
89
+ { key: ref.key, scope: "user", scopeId: ctx.userEmail },
90
+ ];
91
+ }
92
+ return [
93
+ { key: ref.key, scope: "user", scopeId: ctx.userEmail },
94
+ { key: ref.key, scope: "workspace", scopeId: workspaceScopeId(ctx) },
95
+ ];
96
+ }
97
+ async function readCandidate(candidate, ctx) {
98
+ const secret = await readAppSecret({
99
+ key: candidate.key,
100
+ scope: candidate.scope,
101
+ scopeId: candidate.scopeId,
102
+ });
103
+ if (secret?.value) {
104
+ return {
105
+ value: secret.value,
106
+ key: candidate.key,
107
+ scope: candidate.scope,
108
+ backend: "secrets",
109
+ };
110
+ }
111
+ if (candidate.scope === "user" || candidate.scope === "org") {
112
+ const credential = await resolveCredentialForScope(candidate.key, {
113
+ ...ctx,
114
+ scope: candidate.scope,
115
+ });
116
+ if (credential) {
117
+ return {
118
+ value: credential,
119
+ key: candidate.key,
120
+ scope: candidate.scope,
121
+ backend: "credentials",
122
+ };
123
+ }
124
+ }
125
+ return null;
126
+ }
127
+ async function readFirstCredentialForRef({ provider, requestedKey, ref, ctx, }) {
128
+ for (const key of lookupKeysForRef(provider, requestedKey, ref.key)) {
129
+ const candidates = credentialCandidatesForRef({ ...ref, key }, ctx);
130
+ for (const candidate of candidates) {
131
+ const hit = await readCandidate(candidate, ctx);
132
+ if (hit)
133
+ return hit;
134
+ }
135
+ }
136
+ return null;
137
+ }
138
+ function contextFromOptions(options) {
139
+ const requestCtx = getCredentialContext();
140
+ const userEmail = options.userEmail?.trim() || requestCtx?.userEmail;
141
+ if (!userEmail)
142
+ return null;
143
+ const orgId = options.orgId === undefined
144
+ ? options.userEmail
145
+ ? null
146
+ : (requestCtx?.orgId ?? null)
147
+ : options.orgId?.trim() || null;
148
+ return { userEmail: userEmail.toLowerCase(), orgId };
149
+ }
150
+ function result(options) {
151
+ return {
152
+ available: options.status === "resolved",
153
+ status: options.status,
154
+ reason: options.reason,
155
+ provider: options.provider,
156
+ key: options.key,
157
+ ...(options.value ? { value: options.value } : {}),
158
+ provenance: options.provenance ?? null,
159
+ checked: options.checked ?? [],
160
+ };
161
+ }
162
+ function unresolvedStatus(checked) {
163
+ if (checked.some((entry) => entry.status === "error"))
164
+ return "error";
165
+ if (checked.some((entry) => entry.status === "missing_secret")) {
166
+ return "missing_secret";
167
+ }
168
+ if (checked.some((entry) => entry.status === "missing_ref")) {
169
+ return "missing_ref";
170
+ }
171
+ return "not_available";
172
+ }
173
+ function unresolvedReason(checked, provider, key) {
174
+ if (checked.length > 0)
175
+ return checked[checked.length - 1].reason;
176
+ return `No connected ${provider} workspace connection could provide ${key}.`;
177
+ }
178
+ async function resolveInRequestContext(options, ctx) {
179
+ const appId = normalizeRequired(options.appId, "resolveWorkspaceConnectionCredentialForApp appId");
180
+ const provider = normalizeRequired(options.provider, "resolveWorkspaceConnectionCredentialForApp provider");
181
+ const key = normalizeRequired(options.key, "resolveWorkspaceConnectionCredentialForApp key");
182
+ const connectionId = options.connectionId?.trim();
183
+ const checked = [];
184
+ let connections = [];
185
+ if (connectionId) {
186
+ const resolved = await resolveWorkspaceConnectionForApp({
187
+ appId,
188
+ provider,
189
+ connectionId,
190
+ includeDisabled: true,
191
+ requireConnected: true,
192
+ });
193
+ if (!resolved.available || !resolved.connection) {
194
+ checked.push({
195
+ status: "not_available",
196
+ reason: resolved.reason,
197
+ key,
198
+ connectionId: resolved.connection?.id,
199
+ connectionLabel: resolved.connection?.label,
200
+ grantId: resolved.appAccess?.grantId ?? null,
201
+ appAccessMode: resolved.appAccess?.mode,
202
+ });
203
+ return result({
204
+ provider,
205
+ key,
206
+ status: "not_available",
207
+ reason: resolved.reason,
208
+ checked,
209
+ });
210
+ }
211
+ connections = [resolved.connection];
212
+ }
213
+ else {
214
+ connections = (await listWorkspaceConnectionsForApp({
215
+ appId,
216
+ provider,
217
+ includeDisabled: false,
218
+ })).filter((connection) => connection.status === "connected");
219
+ if (connections.length === 0) {
220
+ const resolved = await resolveWorkspaceConnectionForApp({
221
+ appId,
222
+ provider,
223
+ includeDisabled: true,
224
+ requireConnected: true,
225
+ });
226
+ checked.push({
227
+ status: "not_available",
228
+ reason: resolved.reason,
229
+ key,
230
+ connectionId: resolved.connection?.id,
231
+ connectionLabel: resolved.connection?.label,
232
+ grantId: resolved.appAccess?.grantId ?? null,
233
+ appAccessMode: resolved.appAccess?.mode,
234
+ });
235
+ return result({
236
+ provider,
237
+ key,
238
+ status: "not_available",
239
+ reason: resolved.reason,
240
+ checked,
241
+ });
242
+ }
243
+ }
244
+ for (const connection of connections) {
245
+ const matchingRefs = credentialRefsForConnection(connection).filter(({ ref }) => credentialKeyMatches(provider, key, ref.key));
246
+ if (matchingRefs.length === 0) {
247
+ checked.push({
248
+ status: "missing_ref",
249
+ reason: `${connection.label} is granted to ${appId} but does not reference ${key}.`,
250
+ key,
251
+ connectionId: connection.id,
252
+ connectionLabel: connection.label,
253
+ grantId: connection.appAccess.grantId,
254
+ appAccessMode: connection.appAccess.mode,
255
+ });
256
+ continue;
257
+ }
258
+ for (const { ref, publicRef } of matchingRefs) {
259
+ try {
260
+ const hit = await readFirstCredentialForRef({
261
+ provider,
262
+ requestedKey: key,
263
+ ref,
264
+ ctx,
265
+ });
266
+ if (hit) {
267
+ await markWorkspaceConnectionUsed({
268
+ connectionId: connection.id,
269
+ appId: connection.appAccess.mode === "explicit-grant"
270
+ ? appId
271
+ : undefined,
272
+ });
273
+ const provenance = {
274
+ source: "workspace_connection",
275
+ provider,
276
+ requestedKey: key,
277
+ resolvedKey: hit.key,
278
+ credentialRef: publicRef,
279
+ connectionId: connection.id,
280
+ connectionLabel: connection.label,
281
+ grantId: connection.appAccess.grantId,
282
+ appAccessMode: connection.appAccess.mode,
283
+ secretScope: hit.scope,
284
+ backend: hit.backend,
285
+ };
286
+ return result({
287
+ provider,
288
+ key,
289
+ status: "resolved",
290
+ reason: `${key} is available through ${connection.label}.`,
291
+ value: hit.value,
292
+ provenance,
293
+ checked,
294
+ });
295
+ }
296
+ checked.push({
297
+ status: "missing_secret",
298
+ reason: `${connection.label} references ${ref.key}, but no scoped credential value was found.`,
299
+ key,
300
+ resolvedKey: ref.key,
301
+ connectionId: connection.id,
302
+ connectionLabel: connection.label,
303
+ grantId: connection.appAccess.grantId,
304
+ appAccessMode: connection.appAccess.mode,
305
+ credentialRef: publicRef,
306
+ });
307
+ }
308
+ catch (err) {
309
+ checked.push({
310
+ status: "error",
311
+ reason: `${connection.label} credential lookup failed: ${err instanceof Error ? err.message : String(err)}`,
312
+ key,
313
+ resolvedKey: ref.key,
314
+ connectionId: connection.id,
315
+ connectionLabel: connection.label,
316
+ grantId: connection.appAccess.grantId,
317
+ appAccessMode: connection.appAccess.mode,
318
+ credentialRef: publicRef,
319
+ });
320
+ }
321
+ }
322
+ }
323
+ const status = unresolvedStatus(checked);
324
+ return result({
325
+ provider,
326
+ key,
327
+ status,
328
+ reason: unresolvedReason(checked, provider, key),
329
+ checked,
330
+ });
331
+ }
332
+ export async function resolveWorkspaceConnectionCredentialForApp(options) {
333
+ const ctx = contextFromOptions(options);
334
+ const provider = options.provider?.trim() ?? "";
335
+ const key = options.key?.trim() ?? "";
336
+ if (!ctx) {
337
+ return result({
338
+ provider,
339
+ key,
340
+ status: "missing_context",
341
+ reason: "Workspace connection credential resolution requires an authenticated request context.",
342
+ });
343
+ }
344
+ const existing = getRequestContext() ?? {};
345
+ return runWithRequestContext({
346
+ ...existing,
347
+ userEmail: ctx.userEmail,
348
+ orgId: ctx.orgId ?? undefined,
349
+ }, () => resolveInRequestContext(options, ctx));
350
+ }
351
+ export async function resolveWorkspaceConnectionCredentialsForApp(options) {
352
+ const keys = uniqueStrings(options.keys);
353
+ const entries = await Promise.all(keys.map(async (key) => [
354
+ key,
355
+ await resolveWorkspaceConnectionCredentialForApp({ ...options, key }),
356
+ ]));
357
+ const results = Object.fromEntries(entries);
358
+ const values = {};
359
+ const missingKeys = [];
360
+ for (const [key, resolution] of entries) {
361
+ if (resolution.value) {
362
+ values[key] = resolution.value;
363
+ }
364
+ else {
365
+ missingKeys.push(key);
366
+ }
367
+ }
368
+ return {
369
+ available: missingKeys.length === 0,
370
+ appId: options.appId,
371
+ provider: options.provider,
372
+ connectionId: options.connectionId?.trim() || null,
373
+ values,
374
+ results,
375
+ missingKeys,
376
+ };
377
+ }
378
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/workspace-connections/credentials.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n resolveCredentialForScope,\n type CredentialContext,\n type CredentialStorageScope,\n} from \"../credentials/index.js\";\nimport {\n getCredentialContext,\n getRequestContext,\n runWithRequestContext,\n} from \"../server/request-context.js\";\nimport { readAppSecret, type SecretRef } from \"../secrets/storage.js\";\nimport {\n listWorkspaceConnectionsForApp,\n markWorkspaceConnectionUsed,\n resolveWorkspaceConnectionForApp,\n type WorkspaceConnectionAppAccessMode,\n type WorkspaceConnectionCredentialRef,\n type WorkspaceConnectionForApp,\n type WorkspaceConnectionPublicCredentialRef,\n} from \"./store.js\";\n\nexport type WorkspaceConnectionCredentialResolutionStatus =\n | \"resolved\"\n | \"missing_context\"\n | \"not_available\"\n | \"missing_ref\"\n | \"missing_secret\"\n | \"error\";\n\nexport type WorkspaceConnectionCredentialBackend = \"secrets\" | \"credentials\";\n\nexport interface ResolveWorkspaceConnectionCredentialForAppOptions {\n appId: string;\n provider: string;\n key: string;\n connectionId?: string | null;\n userEmail?: string | null;\n orgId?: string | null;\n}\n\nexport interface ResolveWorkspaceConnectionCredentialsForAppOptions extends Omit<\n ResolveWorkspaceConnectionCredentialForAppOptions,\n \"key\"\n> {\n keys: string[];\n}\n\nexport interface WorkspaceConnectionCredentialProvenance {\n source: \"workspace_connection\";\n provider: string;\n requestedKey: string;\n resolvedKey: string;\n credentialRef: WorkspaceConnectionPublicCredentialRef;\n connectionId: string;\n connectionLabel: string;\n grantId: string | null;\n appAccessMode: WorkspaceConnectionAppAccessMode;\n secretScope: SecretRef[\"scope\"] | CredentialStorageScope;\n backend: WorkspaceConnectionCredentialBackend;\n}\n\nexport interface WorkspaceConnectionCredentialResolutionCheck {\n status: Exclude<\n WorkspaceConnectionCredentialResolutionStatus,\n \"resolved\" | \"missing_context\"\n >;\n reason: string;\n key: string;\n resolvedKey?: string;\n connectionId?: string;\n connectionLabel?: string;\n grantId?: string | null;\n appAccessMode?: WorkspaceConnectionAppAccessMode;\n credentialRef?: WorkspaceConnectionPublicCredentialRef;\n secretScope?: SecretRef[\"scope\"] | CredentialStorageScope;\n backend?: WorkspaceConnectionCredentialBackend;\n}\n\nexport interface WorkspaceConnectionCredentialResolution {\n available: boolean;\n status: WorkspaceConnectionCredentialResolutionStatus;\n reason: string;\n provider: string;\n key: string;\n value?: string;\n provenance: WorkspaceConnectionCredentialProvenance | null;\n checked: WorkspaceConnectionCredentialResolutionCheck[];\n}\n\nexport interface WorkspaceConnectionCredentialsResolution {\n available: boolean;\n appId: string;\n provider: string;\n connectionId: string | null;\n values: Record<string, string>;\n results: Record<string, WorkspaceConnectionCredentialResolution>;\n missingKeys: string[];\n}\n\ntype ScopedCredentialCandidate = {\n key: string;\n scope: SecretRef[\"scope\"] | CredentialStorageScope;\n scopeId: string;\n};\n\ntype CredentialReadHit = {\n value: string;\n key: string;\n scope: SecretRef[\"scope\"] | CredentialStorageScope;\n backend: WorkspaceConnectionCredentialBackend;\n};\n\nconst PROVIDER_CREDENTIAL_KEY_ALIASES: Record<\n string,\n Record<string, string[]>\n> = {\n hubspot: {\n HUBSPOT_ACCESS_TOKEN: [\"HUBSPOT_PRIVATE_APP_TOKEN\"],\n HUBSPOT_PRIVATE_APP_TOKEN: [\"HUBSPOT_ACCESS_TOKEN\"],\n },\n};\n\nfunction normalizeRequired(value: string, label: string): string {\n const normalized = value.trim();\n if (!normalized) throw new Error(`${label} is required.`);\n return normalized;\n}\n\nfunction normalizeCredentialKey(key: string): string {\n return key.trim().toUpperCase();\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return Array.from(\n new Set(values.map((value) => value.trim()).filter(Boolean)),\n );\n}\n\nfunction credentialKeyAliases(provider: string, key: string): string[] {\n const aliases =\n PROVIDER_CREDENTIAL_KEY_ALIASES[provider.trim().toLowerCase()]?.[\n normalizeCredentialKey(key)\n ] ?? [];\n return uniqueStrings([key, ...aliases]);\n}\n\nfunction credentialKeyMatches(\n provider: string,\n requestedKey: string,\n refKey: string,\n): boolean {\n const requested = new Set(\n credentialKeyAliases(provider, requestedKey).map(normalizeCredentialKey),\n );\n return requested.has(normalizeCredentialKey(refKey));\n}\n\nfunction lookupKeysForRef(\n provider: string,\n requestedKey: string,\n refKey: string,\n): string[] {\n return uniqueStrings([\n refKey,\n ...credentialKeyAliases(provider, refKey),\n requestedKey,\n ...credentialKeyAliases(provider, requestedKey),\n ]);\n}\n\nfunction publicCredentialRef(\n ref: WorkspaceConnectionCredentialRef,\n source: WorkspaceConnectionPublicCredentialRef[\"source\"],\n): WorkspaceConnectionPublicCredentialRef {\n return {\n key: ref.key,\n scope: ref.scope,\n provider: ref.provider,\n label: ref.label,\n source,\n };\n}\n\nfunction credentialRefsForConnection(\n connection: WorkspaceConnectionForApp,\n): Array<{\n ref: WorkspaceConnectionCredentialRef;\n publicRef: WorkspaceConnectionPublicCredentialRef;\n}> {\n return [\n ...(connection.explicitGrant?.credentialRefs ?? []).map((ref) => ({\n ref,\n publicRef: publicCredentialRef(ref, \"grant\"),\n })),\n ...connection.credentialRefs.map((ref) => ({\n ref,\n publicRef: publicCredentialRef(ref, \"connection\"),\n })),\n ];\n}\n\nfunction refScope(\n ref: WorkspaceConnectionCredentialRef,\n): SecretRef[\"scope\"] | undefined {\n return ref.scope === \"user\" ||\n ref.scope === \"org\" ||\n ref.scope === \"workspace\"\n ? ref.scope\n : undefined;\n}\n\nfunction workspaceScopeId(ctx: CredentialContext): string {\n return ctx.orgId ?? `solo:${ctx.userEmail}`;\n}\n\nfunction credentialCandidatesForRef(\n ref: WorkspaceConnectionCredentialRef,\n ctx: CredentialContext,\n): ScopedCredentialCandidate[] {\n const scope = refScope(ref);\n if (scope === \"user\") {\n return [{ key: ref.key, scope: \"user\", scopeId: ctx.userEmail }];\n }\n if (scope === \"org\") {\n return ctx.orgId\n ? [{ key: ref.key, scope: \"org\", scopeId: ctx.orgId }]\n : [];\n }\n if (scope === \"workspace\") {\n return [\n { key: ref.key, scope: \"workspace\", scopeId: workspaceScopeId(ctx) },\n ];\n }\n if (ctx.orgId) {\n return [\n { key: ref.key, scope: \"org\", scopeId: ctx.orgId },\n { key: ref.key, scope: \"workspace\", scopeId: ctx.orgId },\n { key: ref.key, scope: \"user\", scopeId: ctx.userEmail },\n ];\n }\n return [\n { key: ref.key, scope: \"user\", scopeId: ctx.userEmail },\n { key: ref.key, scope: \"workspace\", scopeId: workspaceScopeId(ctx) },\n ];\n}\n\nasync function readCandidate(\n candidate: ScopedCredentialCandidate,\n ctx: CredentialContext,\n): Promise<CredentialReadHit | null> {\n const secret = await readAppSecret({\n key: candidate.key,\n scope: candidate.scope as SecretRef[\"scope\"],\n scopeId: candidate.scopeId,\n });\n if (secret?.value) {\n return {\n value: secret.value,\n key: candidate.key,\n scope: candidate.scope,\n backend: \"secrets\",\n };\n }\n\n if (candidate.scope === \"user\" || candidate.scope === \"org\") {\n const credential = await resolveCredentialForScope(candidate.key, {\n ...ctx,\n scope: candidate.scope,\n });\n if (credential) {\n return {\n value: credential,\n key: candidate.key,\n scope: candidate.scope,\n backend: \"credentials\",\n };\n }\n }\n\n return null;\n}\n\nasync function readFirstCredentialForRef({\n provider,\n requestedKey,\n ref,\n ctx,\n}: {\n provider: string;\n requestedKey: string;\n ref: WorkspaceConnectionCredentialRef;\n ctx: CredentialContext;\n}): Promise<CredentialReadHit | null> {\n for (const key of lookupKeysForRef(provider, requestedKey, ref.key)) {\n const candidates = credentialCandidatesForRef({ ...ref, key }, ctx);\n for (const candidate of candidates) {\n const hit = await readCandidate(candidate, ctx);\n if (hit) return hit;\n }\n }\n\n return null;\n}\n\nfunction contextFromOptions(\n options: Pick<\n ResolveWorkspaceConnectionCredentialForAppOptions,\n \"userEmail\" | \"orgId\"\n >,\n): CredentialContext | null {\n const requestCtx = getCredentialContext();\n const userEmail = options.userEmail?.trim() || requestCtx?.userEmail;\n if (!userEmail) return null;\n const orgId =\n options.orgId === undefined\n ? options.userEmail\n ? null\n : (requestCtx?.orgId ?? null)\n : options.orgId?.trim() || null;\n return { userEmail: userEmail.toLowerCase(), orgId };\n}\n\nfunction result(options: {\n provider: string;\n key: string;\n status: WorkspaceConnectionCredentialResolutionStatus;\n reason: string;\n checked?: WorkspaceConnectionCredentialResolutionCheck[];\n value?: string;\n provenance?: WorkspaceConnectionCredentialProvenance | null;\n}): WorkspaceConnectionCredentialResolution {\n return {\n available: options.status === \"resolved\",\n status: options.status,\n reason: options.reason,\n provider: options.provider,\n key: options.key,\n ...(options.value ? { value: options.value } : {}),\n provenance: options.provenance ?? null,\n checked: options.checked ?? [],\n };\n}\n\nfunction unresolvedStatus(\n checked: WorkspaceConnectionCredentialResolutionCheck[],\n): WorkspaceConnectionCredentialResolutionStatus {\n if (checked.some((entry) => entry.status === \"error\")) return \"error\";\n if (checked.some((entry) => entry.status === \"missing_secret\")) {\n return \"missing_secret\";\n }\n if (checked.some((entry) => entry.status === \"missing_ref\")) {\n return \"missing_ref\";\n }\n return \"not_available\";\n}\n\nfunction unresolvedReason(\n checked: WorkspaceConnectionCredentialResolutionCheck[],\n provider: string,\n key: string,\n): string {\n if (checked.length > 0) return checked[checked.length - 1].reason;\n return `No connected ${provider} workspace connection could provide ${key}.`;\n}\n\nasync function resolveInRequestContext(\n options: ResolveWorkspaceConnectionCredentialForAppOptions,\n ctx: CredentialContext,\n): Promise<WorkspaceConnectionCredentialResolution> {\n const appId = normalizeRequired(\n options.appId,\n \"resolveWorkspaceConnectionCredentialForApp appId\",\n );\n const provider = normalizeRequired(\n options.provider,\n \"resolveWorkspaceConnectionCredentialForApp provider\",\n );\n const key = normalizeRequired(\n options.key,\n \"resolveWorkspaceConnectionCredentialForApp key\",\n );\n const connectionId = options.connectionId?.trim();\n const checked: WorkspaceConnectionCredentialResolutionCheck[] = [];\n\n let connections: WorkspaceConnectionForApp[] = [];\n if (connectionId) {\n const resolved = await resolveWorkspaceConnectionForApp({\n appId,\n provider,\n connectionId,\n includeDisabled: true,\n requireConnected: true,\n });\n if (!resolved.available || !resolved.connection) {\n checked.push({\n status: \"not_available\",\n reason: resolved.reason,\n key,\n connectionId: resolved.connection?.id,\n connectionLabel: resolved.connection?.label,\n grantId: resolved.appAccess?.grantId ?? null,\n appAccessMode: resolved.appAccess?.mode,\n });\n return result({\n provider,\n key,\n status: \"not_available\",\n reason: resolved.reason,\n checked,\n });\n }\n connections = [resolved.connection];\n } else {\n connections = (\n await listWorkspaceConnectionsForApp({\n appId,\n provider,\n includeDisabled: false,\n })\n ).filter((connection) => connection.status === \"connected\");\n if (connections.length === 0) {\n const resolved = await resolveWorkspaceConnectionForApp({\n appId,\n provider,\n includeDisabled: true,\n requireConnected: true,\n });\n checked.push({\n status: \"not_available\",\n reason: resolved.reason,\n key,\n connectionId: resolved.connection?.id,\n connectionLabel: resolved.connection?.label,\n grantId: resolved.appAccess?.grantId ?? null,\n appAccessMode: resolved.appAccess?.mode,\n });\n return result({\n provider,\n key,\n status: \"not_available\",\n reason: resolved.reason,\n checked,\n });\n }\n }\n\n for (const connection of connections) {\n const matchingRefs = credentialRefsForConnection(connection).filter(\n ({ ref }) => credentialKeyMatches(provider, key, ref.key),\n );\n\n if (matchingRefs.length === 0) {\n checked.push({\n status: \"missing_ref\",\n reason: `${connection.label} is granted to ${appId} but does not reference ${key}.`,\n key,\n connectionId: connection.id,\n connectionLabel: connection.label,\n grantId: connection.appAccess.grantId,\n appAccessMode: connection.appAccess.mode,\n });\n continue;\n }\n\n for (const { ref, publicRef } of matchingRefs) {\n try {\n const hit = await readFirstCredentialForRef({\n provider,\n requestedKey: key,\n ref,\n ctx,\n });\n if (hit) {\n await markWorkspaceConnectionUsed({\n connectionId: connection.id,\n appId:\n connection.appAccess.mode === \"explicit-grant\"\n ? appId\n : undefined,\n });\n const provenance: WorkspaceConnectionCredentialProvenance = {\n source: \"workspace_connection\",\n provider,\n requestedKey: key,\n resolvedKey: hit.key,\n credentialRef: publicRef,\n connectionId: connection.id,\n connectionLabel: connection.label,\n grantId: connection.appAccess.grantId,\n appAccessMode: connection.appAccess.mode,\n secretScope: hit.scope,\n backend: hit.backend,\n };\n return result({\n provider,\n key,\n status: \"resolved\",\n reason: `${key} is available through ${connection.label}.`,\n value: hit.value,\n provenance,\n checked,\n });\n }\n checked.push({\n status: \"missing_secret\",\n reason: `${connection.label} references ${ref.key}, but no scoped credential value was found.`,\n key,\n resolvedKey: ref.key,\n connectionId: connection.id,\n connectionLabel: connection.label,\n grantId: connection.appAccess.grantId,\n appAccessMode: connection.appAccess.mode,\n credentialRef: publicRef,\n });\n } catch (err) {\n checked.push({\n status: \"error\",\n reason: `${connection.label} credential lookup failed: ${\n err instanceof Error ? err.message : String(err)\n }`,\n key,\n resolvedKey: ref.key,\n connectionId: connection.id,\n connectionLabel: connection.label,\n grantId: connection.appAccess.grantId,\n appAccessMode: connection.appAccess.mode,\n credentialRef: publicRef,\n });\n }\n }\n }\n\n const status = unresolvedStatus(checked);\n return result({\n provider,\n key,\n status,\n reason: unresolvedReason(checked, provider, key),\n checked,\n });\n}\n\nexport async function resolveWorkspaceConnectionCredentialForApp(\n options: ResolveWorkspaceConnectionCredentialForAppOptions,\n): Promise<WorkspaceConnectionCredentialResolution> {\n const ctx = contextFromOptions(options);\n const provider = options.provider?.trim() ?? \"\";\n const key = options.key?.trim() ?? \"\";\n if (!ctx) {\n return result({\n provider,\n key,\n status: \"missing_context\",\n reason:\n \"Workspace connection credential resolution requires an authenticated request context.\",\n });\n }\n\n const existing = getRequestContext() ?? {};\n return runWithRequestContext(\n {\n ...existing,\n userEmail: ctx.userEmail,\n orgId: ctx.orgId ?? undefined,\n },\n () => resolveInRequestContext(options, ctx),\n );\n}\n\nexport async function resolveWorkspaceConnectionCredentialsForApp(\n options: ResolveWorkspaceConnectionCredentialsForAppOptions,\n): Promise<WorkspaceConnectionCredentialsResolution> {\n const keys = uniqueStrings(options.keys);\n const entries = await Promise.all(\n keys.map(\n async (key) =>\n [\n key,\n await resolveWorkspaceConnectionCredentialForApp({ ...options, key }),\n ] as const,\n ),\n );\n const results = Object.fromEntries(entries);\n const values: Record<string, string> = {};\n const missingKeys: string[] = [];\n for (const [key, resolution] of entries) {\n if (resolution.value) {\n values[key] = resolution.value;\n } else {\n missingKeys.push(key);\n }\n }\n\n return {\n available: missingKeys.length === 0,\n appId: options.appId,\n provider: options.provider,\n connectionId: options.connectionId?.trim() || null,\n values,\n results,\n missingKeys,\n };\n}\n"]}
@@ -1,2 +1,3 @@
1
- export { deleteWorkspaceConnection, ensureWorkspaceConnectionsTable, getWorkspaceConnectionAppAccess, getWorkspaceConnection, getWorkspaceConnectionGrant, listWorkspaceConnectionProviderCatalogForApp, listWorkspaceConnectionGrants, listWorkspaceConnections, listWorkspaceConnectionsForApp, resolveWorkspaceConnectionForApp, revokeWorkspaceConnectionGrant, serializeWorkspaceConnectionGrant, serializeWorkspaceConnection, summarizeWorkspaceConnectionProviderForApp, summarizeWorkspaceConnectionProviderReadiness, upsertWorkspaceConnectionGrant, upsertWorkspaceConnection, type ListWorkspaceConnectionProviderCatalogForAppOptions, type ListWorkspaceConnectionGrantsOptions, type ListWorkspaceConnectionsOptions, type ListWorkspaceConnectionsForAppOptions, type ResolvedWorkspaceConnectionForApp, type ResolveWorkspaceConnectionForAppOptions, type SerializedWorkspaceConnectionGrant, type SerializedWorkspaceConnection, type SummarizeWorkspaceConnectionProviderForAppOptions, type SummarizeWorkspaceConnectionProviderReadinessOptions, type UpsertWorkspaceConnectionGrantInput, type UpsertWorkspaceConnectionInput, type WorkspaceConnectionAppAccess, type WorkspaceConnectionAppAccessMode, type WorkspaceConnection, type WorkspaceConnectionCredentialRef, type WorkspaceConnectionExplicitGrantSummary, type WorkspaceConnectionForApp, type WorkspaceConnectionForAppSummary, type WorkspaceConnectionGrant, type WorkspaceConnectionGrantAvailability, type WorkspaceConnectionGrantState, type WorkspaceConnectionProviderAppSummary, type WorkspaceConnectionProviderLike, type WorkspaceConnectionProviderCatalogForApp, type WorkspaceConnectionProviderCatalogForAppItem, type WorkspaceConnectionProviderReadiness, type WorkspaceConnectionProviderReadinessStatus, type WorkspaceConnectionPublicCredentialRef, type WorkspaceConnectionStatus, workspaceConnectionIsAvailableToApp, } from "./store.js";
1
+ export { deleteWorkspaceConnection, ensureWorkspaceConnectionsTable, getWorkspaceConnectionAppAccess, getWorkspaceConnection, getWorkspaceConnectionGrant, listWorkspaceConnectionProviderCatalogForApp, listWorkspaceConnectionGrants, listWorkspaceConnections, listWorkspaceConnectionsForApp, markWorkspaceConnectionUsed, resolveWorkspaceConnectionForApp, revokeWorkspaceConnectionGrant, serializeWorkspaceConnectionGrant, serializeWorkspaceConnection, summarizeWorkspaceConnectionProviderForApp, summarizeWorkspaceConnectionProviderReadiness, upsertWorkspaceConnectionGrant, upsertWorkspaceConnection, type ListWorkspaceConnectionProviderCatalogForAppOptions, type ListWorkspaceConnectionGrantsOptions, type ListWorkspaceConnectionsOptions, type ListWorkspaceConnectionsForAppOptions, type MarkWorkspaceConnectionUsedOptions, type MarkWorkspaceConnectionUsedResult, type ResolvedWorkspaceConnectionForApp, type ResolveWorkspaceConnectionForAppOptions, type SerializedWorkspaceConnectionGrant, type SerializedWorkspaceConnection, type SummarizeWorkspaceConnectionProviderForAppOptions, type SummarizeWorkspaceConnectionProviderReadinessOptions, type UpsertWorkspaceConnectionGrantInput, type UpsertWorkspaceConnectionInput, type WorkspaceConnectionAppAccess, type WorkspaceConnectionAppAccessMode, type WorkspaceConnection, type WorkspaceConnectionCredentialRef, type WorkspaceConnectionExplicitGrantSummary, type WorkspaceConnectionForApp, type WorkspaceConnectionForAppSummary, type WorkspaceConnectionGrant, type WorkspaceConnectionGrantAvailability, type WorkspaceConnectionGrantState, type WorkspaceConnectionProviderAppSummary, type WorkspaceConnectionProviderLike, type WorkspaceConnectionProviderCatalogForApp, type WorkspaceConnectionProviderCatalogForAppItem, type WorkspaceConnectionProviderReadiness, type WorkspaceConnectionProviderReadinessStatus, type WorkspaceConnectionPublicCredentialRef, type WorkspaceConnectionStatus, workspaceConnectionIsAvailableToApp, } from "./store.js";
2
+ export { resolveWorkspaceConnectionCredentialForApp, resolveWorkspaceConnectionCredentialsForApp, type ResolveWorkspaceConnectionCredentialForAppOptions, type ResolveWorkspaceConnectionCredentialsForAppOptions, type WorkspaceConnectionCredentialBackend, type WorkspaceConnectionCredentialProvenance, type WorkspaceConnectionCredentialResolution, type WorkspaceConnectionCredentialResolutionCheck, type WorkspaceConnectionCredentialResolutionStatus, type WorkspaceConnectionCredentialsResolution, } from "./credentials.js";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace-connections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAC/B,+BAA+B,EAC/B,sBAAsB,EACtB,2BAA2B,EAC3B,4CAA4C,EAC5C,6BAA6B,EAC7B,wBAAwB,EACxB,8BAA8B,EAC9B,gCAAgC,EAChC,8BAA8B,EAC9B,iCAAiC,EACjC,4BAA4B,EAC5B,0CAA0C,EAC1C,6CAA6C,EAC7C,8BAA8B,EAC9B,yBAAyB,EACzB,KAAK,mDAAmD,EACxD,KAAK,oCAAoC,EACzC,KAAK,+BAA+B,EACpC,KAAK,qCAAqC,EAC1C,KAAK,iCAAiC,EACtC,KAAK,uCAAuC,EAC5C,KAAK,kCAAkC,EACvC,KAAK,6BAA6B,EAClC,KAAK,iDAAiD,EACtD,KAAK,oDAAoD,EACzD,KAAK,mCAAmC,EACxC,KAAK,8BAA8B,EACnC,KAAK,4BAA4B,EACjC,KAAK,gCAAgC,EACrC,KAAK,mBAAmB,EACxB,KAAK,gCAAgC,EACrC,KAAK,uCAAuC,EAC5C,KAAK,yBAAyB,EAC9B,KAAK,gCAAgC,EACrC,KAAK,wBAAwB,EAC7B,KAAK,oCAAoC,EACzC,KAAK,6BAA6B,EAClC,KAAK,qCAAqC,EAC1C,KAAK,+BAA+B,EACpC,KAAK,wCAAwC,EAC7C,KAAK,4CAA4C,EACjD,KAAK,oCAAoC,EACzC,KAAK,0CAA0C,EAC/C,KAAK,sCAAsC,EAC3C,KAAK,yBAAyB,EAC9B,mCAAmC,GACpC,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace-connections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAC/B,+BAA+B,EAC/B,sBAAsB,EACtB,2BAA2B,EAC3B,4CAA4C,EAC5C,6BAA6B,EAC7B,wBAAwB,EACxB,8BAA8B,EAC9B,2BAA2B,EAC3B,gCAAgC,EAChC,8BAA8B,EAC9B,iCAAiC,EACjC,4BAA4B,EAC5B,0CAA0C,EAC1C,6CAA6C,EAC7C,8BAA8B,EAC9B,yBAAyB,EACzB,KAAK,mDAAmD,EACxD,KAAK,oCAAoC,EACzC,KAAK,+BAA+B,EACpC,KAAK,qCAAqC,EAC1C,KAAK,kCAAkC,EACvC,KAAK,iCAAiC,EACtC,KAAK,iCAAiC,EACtC,KAAK,uCAAuC,EAC5C,KAAK,kCAAkC,EACvC,KAAK,6BAA6B,EAClC,KAAK,iDAAiD,EACtD,KAAK,oDAAoD,EACzD,KAAK,mCAAmC,EACxC,KAAK,8BAA8B,EACnC,KAAK,4BAA4B,EACjC,KAAK,gCAAgC,EACrC,KAAK,mBAAmB,EACxB,KAAK,gCAAgC,EACrC,KAAK,uCAAuC,EAC5C,KAAK,yBAAyB,EAC9B,KAAK,gCAAgC,EACrC,KAAK,wBAAwB,EAC7B,KAAK,oCAAoC,EACzC,KAAK,6BAA6B,EAClC,KAAK,qCAAqC,EAC1C,KAAK,+BAA+B,EACpC,KAAK,wCAAwC,EAC7C,KAAK,4CAA4C,EACjD,KAAK,oCAAoC,EACzC,KAAK,0CAA0C,EAC/C,KAAK,sCAAsC,EAC3C,KAAK,yBAAyB,EAC9B,mCAAmC,GACpC,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,0CAA0C,EAC1C,2CAA2C,EAC3C,KAAK,iDAAiD,EACtD,KAAK,kDAAkD,EACvD,KAAK,oCAAoC,EACzC,KAAK,uCAAuC,EAC5C,KAAK,uCAAuC,EAC5C,KAAK,4CAA4C,EACjD,KAAK,6CAA6C,EAClD,KAAK,wCAAwC,GAC9C,MAAM,kBAAkB,CAAC"}
@@ -1,2 +1,3 @@
1
- export { deleteWorkspaceConnection, ensureWorkspaceConnectionsTable, getWorkspaceConnectionAppAccess, getWorkspaceConnection, getWorkspaceConnectionGrant, listWorkspaceConnectionProviderCatalogForApp, listWorkspaceConnectionGrants, listWorkspaceConnections, listWorkspaceConnectionsForApp, resolveWorkspaceConnectionForApp, revokeWorkspaceConnectionGrant, serializeWorkspaceConnectionGrant, serializeWorkspaceConnection, summarizeWorkspaceConnectionProviderForApp, summarizeWorkspaceConnectionProviderReadiness, upsertWorkspaceConnectionGrant, upsertWorkspaceConnection, workspaceConnectionIsAvailableToApp, } from "./store.js";
1
+ export { deleteWorkspaceConnection, ensureWorkspaceConnectionsTable, getWorkspaceConnectionAppAccess, getWorkspaceConnection, getWorkspaceConnectionGrant, listWorkspaceConnectionProviderCatalogForApp, listWorkspaceConnectionGrants, listWorkspaceConnections, listWorkspaceConnectionsForApp, markWorkspaceConnectionUsed, resolveWorkspaceConnectionForApp, revokeWorkspaceConnectionGrant, serializeWorkspaceConnectionGrant, serializeWorkspaceConnection, summarizeWorkspaceConnectionProviderForApp, summarizeWorkspaceConnectionProviderReadiness, upsertWorkspaceConnectionGrant, upsertWorkspaceConnection, workspaceConnectionIsAvailableToApp, } from "./store.js";
2
+ export { resolveWorkspaceConnectionCredentialForApp, resolveWorkspaceConnectionCredentialsForApp, } from "./credentials.js";
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workspace-connections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAC/B,+BAA+B,EAC/B,sBAAsB,EACtB,2BAA2B,EAC3B,4CAA4C,EAC5C,6BAA6B,EAC7B,wBAAwB,EACxB,8BAA8B,EAC9B,gCAAgC,EAChC,8BAA8B,EAC9B,iCAAiC,EACjC,4BAA4B,EAC5B,0CAA0C,EAC1C,6CAA6C,EAC7C,8BAA8B,EAC9B,yBAAyB,EA+BzB,mCAAmC,GACpC,MAAM,YAAY,CAAC","sourcesContent":["export {\n deleteWorkspaceConnection,\n ensureWorkspaceConnectionsTable,\n getWorkspaceConnectionAppAccess,\n getWorkspaceConnection,\n getWorkspaceConnectionGrant,\n listWorkspaceConnectionProviderCatalogForApp,\n listWorkspaceConnectionGrants,\n listWorkspaceConnections,\n listWorkspaceConnectionsForApp,\n resolveWorkspaceConnectionForApp,\n revokeWorkspaceConnectionGrant,\n serializeWorkspaceConnectionGrant,\n serializeWorkspaceConnection,\n summarizeWorkspaceConnectionProviderForApp,\n summarizeWorkspaceConnectionProviderReadiness,\n upsertWorkspaceConnectionGrant,\n upsertWorkspaceConnection,\n type ListWorkspaceConnectionProviderCatalogForAppOptions,\n type ListWorkspaceConnectionGrantsOptions,\n type ListWorkspaceConnectionsOptions,\n type ListWorkspaceConnectionsForAppOptions,\n type ResolvedWorkspaceConnectionForApp,\n type ResolveWorkspaceConnectionForAppOptions,\n type SerializedWorkspaceConnectionGrant,\n type SerializedWorkspaceConnection,\n type SummarizeWorkspaceConnectionProviderForAppOptions,\n type SummarizeWorkspaceConnectionProviderReadinessOptions,\n type UpsertWorkspaceConnectionGrantInput,\n type UpsertWorkspaceConnectionInput,\n type WorkspaceConnectionAppAccess,\n type WorkspaceConnectionAppAccessMode,\n type WorkspaceConnection,\n type WorkspaceConnectionCredentialRef,\n type WorkspaceConnectionExplicitGrantSummary,\n type WorkspaceConnectionForApp,\n type WorkspaceConnectionForAppSummary,\n type WorkspaceConnectionGrant,\n type WorkspaceConnectionGrantAvailability,\n type WorkspaceConnectionGrantState,\n type WorkspaceConnectionProviderAppSummary,\n type WorkspaceConnectionProviderLike,\n type WorkspaceConnectionProviderCatalogForApp,\n type WorkspaceConnectionProviderCatalogForAppItem,\n type WorkspaceConnectionProviderReadiness,\n type WorkspaceConnectionProviderReadinessStatus,\n type WorkspaceConnectionPublicCredentialRef,\n type WorkspaceConnectionStatus,\n workspaceConnectionIsAvailableToApp,\n} from \"./store.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workspace-connections/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAC/B,+BAA+B,EAC/B,sBAAsB,EACtB,2BAA2B,EAC3B,4CAA4C,EAC5C,6BAA6B,EAC7B,wBAAwB,EACxB,8BAA8B,EAC9B,2BAA2B,EAC3B,gCAAgC,EAChC,8BAA8B,EAC9B,iCAAiC,EACjC,4BAA4B,EAC5B,0CAA0C,EAC1C,6CAA6C,EAC7C,8BAA8B,EAC9B,yBAAyB,EAiCzB,mCAAmC,GACpC,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,0CAA0C,EAC1C,2CAA2C,GAS5C,MAAM,kBAAkB,CAAC","sourcesContent":["export {\n deleteWorkspaceConnection,\n ensureWorkspaceConnectionsTable,\n getWorkspaceConnectionAppAccess,\n getWorkspaceConnection,\n getWorkspaceConnectionGrant,\n listWorkspaceConnectionProviderCatalogForApp,\n listWorkspaceConnectionGrants,\n listWorkspaceConnections,\n listWorkspaceConnectionsForApp,\n markWorkspaceConnectionUsed,\n resolveWorkspaceConnectionForApp,\n revokeWorkspaceConnectionGrant,\n serializeWorkspaceConnectionGrant,\n serializeWorkspaceConnection,\n summarizeWorkspaceConnectionProviderForApp,\n summarizeWorkspaceConnectionProviderReadiness,\n upsertWorkspaceConnectionGrant,\n upsertWorkspaceConnection,\n type ListWorkspaceConnectionProviderCatalogForAppOptions,\n type ListWorkspaceConnectionGrantsOptions,\n type ListWorkspaceConnectionsOptions,\n type ListWorkspaceConnectionsForAppOptions,\n type MarkWorkspaceConnectionUsedOptions,\n type MarkWorkspaceConnectionUsedResult,\n type ResolvedWorkspaceConnectionForApp,\n type ResolveWorkspaceConnectionForAppOptions,\n type SerializedWorkspaceConnectionGrant,\n type SerializedWorkspaceConnection,\n type SummarizeWorkspaceConnectionProviderForAppOptions,\n type SummarizeWorkspaceConnectionProviderReadinessOptions,\n type UpsertWorkspaceConnectionGrantInput,\n type UpsertWorkspaceConnectionInput,\n type WorkspaceConnectionAppAccess,\n type WorkspaceConnectionAppAccessMode,\n type WorkspaceConnection,\n type WorkspaceConnectionCredentialRef,\n type WorkspaceConnectionExplicitGrantSummary,\n type WorkspaceConnectionForApp,\n type WorkspaceConnectionForAppSummary,\n type WorkspaceConnectionGrant,\n type WorkspaceConnectionGrantAvailability,\n type WorkspaceConnectionGrantState,\n type WorkspaceConnectionProviderAppSummary,\n type WorkspaceConnectionProviderLike,\n type WorkspaceConnectionProviderCatalogForApp,\n type WorkspaceConnectionProviderCatalogForAppItem,\n type WorkspaceConnectionProviderReadiness,\n type WorkspaceConnectionProviderReadinessStatus,\n type WorkspaceConnectionPublicCredentialRef,\n type WorkspaceConnectionStatus,\n workspaceConnectionIsAvailableToApp,\n} from \"./store.js\";\n\nexport {\n resolveWorkspaceConnectionCredentialForApp,\n resolveWorkspaceConnectionCredentialsForApp,\n type ResolveWorkspaceConnectionCredentialForAppOptions,\n type ResolveWorkspaceConnectionCredentialsForAppOptions,\n type WorkspaceConnectionCredentialBackend,\n type WorkspaceConnectionCredentialProvenance,\n type WorkspaceConnectionCredentialResolution,\n type WorkspaceConnectionCredentialResolutionCheck,\n type WorkspaceConnectionCredentialResolutionStatus,\n type WorkspaceConnectionCredentialsResolution,\n} from \"./credentials.js\";\n"]}