@agent-native/core 0.79.20 → 0.79.22

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 (141) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +16 -0
  3. package/corpus/core/docs/content/deployment.md +133 -0
  4. package/corpus/core/docs/content/faq.md +1 -1
  5. package/corpus/core/docs/content/multi-app-workspace.md +2 -0
  6. package/corpus/core/docs/content/tracking.md +3 -3
  7. package/corpus/core/package.json +1 -1
  8. package/corpus/core/src/agent/engine/openai-compatible-endpoint.ts +25 -0
  9. package/corpus/core/src/agent/engine/provider-env-vars.ts +2 -0
  10. package/corpus/core/src/agent/engine/registry.ts +59 -11
  11. package/corpus/core/src/client/FeedbackButton.tsx +11 -1
  12. package/corpus/core/src/client/agent-engine-key.ts +57 -10
  13. package/corpus/core/src/client/analytics.ts +78 -27
  14. package/corpus/core/src/client/blocks/library/HighlightedCode.tsx +1 -1
  15. package/corpus/core/src/client/index.ts +2 -0
  16. package/corpus/core/src/client/session-replay.ts +159 -17
  17. package/corpus/core/src/client/settings/SettingsPanel.tsx +119 -4
  18. package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +5 -0
  19. package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +8 -3
  20. package/corpus/core/src/scripts/agent-engines/test-agent-engine.ts +54 -6
  21. package/corpus/core/src/server/agent-engine-api-key-route.ts +83 -12
  22. package/corpus/core/src/server/core-routes-plugin.ts +26 -2
  23. package/corpus/core/src/styles/blocks.css +23 -7
  24. package/corpus/templates/analytics/actions/list-session-recordings.ts +1 -1
  25. package/corpus/templates/analytics/app/components/layout/MobileNav.tsx +5 -10
  26. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +22 -4
  27. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +64 -50
  28. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-layout.ts +38 -0
  29. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-sync.ts +89 -0
  30. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +138 -59
  31. package/corpus/templates/analytics/changelog/2026-06-27-dashboard-charts-drag-smoothly-when-rearranging-panels.md +6 -0
  32. package/corpus/templates/analytics/changelog/2026-06-27-dashboard-email-reports-still-send-when-the-live-screenshot-.md +6 -0
  33. package/corpus/templates/analytics/changelog/2026-06-27-fixed-dashboard-edits-so-charts-no-longer-briefly-snap-back-.md +6 -0
  34. package/corpus/templates/analytics/changelog/2026-06-27-mobile-navigation-chrome-and-motion.md +6 -0
  35. package/corpus/templates/analytics/changelog/2026-06-27-session-replay-lists-now-show-only-signed-in-recordings-with.md +6 -0
  36. package/corpus/templates/analytics/changelog/2026-06-27-sidebar-loading-placeholders-are-visible-in-light-mode.md +6 -0
  37. package/corpus/templates/analytics/netlify.toml +4 -0
  38. package/corpus/templates/analytics/scripts/seed-session-replay.ts +1 -0
  39. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +1 -0
  40. package/corpus/templates/analytics/server/lib/dashboard-report.ts +120 -29
  41. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +1 -1
  42. package/corpus/templates/analytics/server/lib/session-replay.ts +158 -46
  43. package/corpus/templates/assets/app/components/layout/Layout.tsx +1 -1
  44. package/corpus/templates/assets/changelog/2026-06-27-mobile-navigation-chrome-and-motion.md +6 -0
  45. package/corpus/templates/clips/app/components/capture-install-options.tsx +0 -9
  46. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +20 -4
  47. package/corpus/templates/clips/app/hooks/use-desktop-promo.ts +6 -2
  48. package/corpus/templates/clips/changelog/2026-06-27-clips-no-longer-shows-desktop-app-prompts-on-mobile-screens.md +6 -0
  49. package/corpus/templates/clips/changelog/2026-06-27-desktop-storage-setup-flow.md +6 -0
  50. package/corpus/templates/clips/changelog/2026-06-27-recorder-download-options-now-show-the-chrome-extension-and-.md +6 -0
  51. package/corpus/templates/clips/changelog/2026-06-27-recorder-setup-mobile-capture-options.md +6 -0
  52. package/corpus/templates/clips/chrome-extension/package.json +1 -1
  53. package/corpus/templates/clips/chrome-extension/src/sentry.ts +17 -1
  54. package/corpus/templates/clips/desktop/package.json +1 -0
  55. package/corpus/templates/clips/desktop/scripts/check-tauri-prereqs.mjs +45 -0
  56. package/corpus/templates/clips/desktop/src/app.tsx +32 -3
  57. package/corpus/templates/clips/desktop/src/lib/sentry.ts +71 -0
  58. package/corpus/templates/clips/desktop/src/main.tsx +2 -0
  59. package/corpus/templates/clips/desktop/src/styles.css +67 -0
  60. package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +2 -1
  61. package/corpus/templates/clips/desktop/src-tauri/build.rs +29 -0
  62. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +3 -0
  63. package/corpus/templates/clips/desktop/src-tauri/src/logfile.rs +1 -0
  64. package/corpus/templates/clips/desktop/src-tauri/src/sentry_report.rs +142 -0
  65. package/corpus/templates/clips/desktop/vite.config.ts +66 -0
  66. package/corpus/templates/design/app/components/layout/Layout.tsx +1 -1
  67. package/corpus/templates/design/changelog/2026-06-27-mobile-navigation-chrome-and-motion.md +6 -0
  68. package/corpus/templates/forms/actions/export-responses.ts +3 -2
  69. package/corpus/templates/forms/actions/list-responses.ts +2 -1
  70. package/corpus/templates/forms/actions/response-insights.ts +13 -4
  71. package/corpus/templates/forms/changelog/2026-06-27-anonymous-feedback-no-longer-shows-internal-agent-native-ano.md +6 -0
  72. package/corpus/templates/forms/server/handlers/submissions.ts +5 -8
  73. package/corpus/templates/forms/server/lib/integrations.ts +9 -6
  74. package/corpus/templates/forms/shared/submitter-email.ts +20 -0
  75. package/corpus/templates/forms/shared/types.ts +1 -1
  76. package/corpus/templates/plan/app/components/plan/wireframe/html-artboard.css +49 -10
  77. package/corpus/templates/slides/app/components/layout/Layout.tsx +1 -1
  78. package/corpus/templates/slides/changelog/2026-06-27-mobile-navigation-chrome-and-motion.md +6 -0
  79. package/dist/agent/engine/openai-compatible-endpoint.d.ts +3 -0
  80. package/dist/agent/engine/openai-compatible-endpoint.d.ts.map +1 -0
  81. package/dist/agent/engine/openai-compatible-endpoint.js +23 -0
  82. package/dist/agent/engine/openai-compatible-endpoint.js.map +1 -0
  83. package/dist/agent/engine/provider-env-vars.d.ts +1 -0
  84. package/dist/agent/engine/provider-env-vars.d.ts.map +1 -1
  85. package/dist/agent/engine/provider-env-vars.js +1 -0
  86. package/dist/agent/engine/provider-env-vars.js.map +1 -1
  87. package/dist/agent/engine/registry.d.ts.map +1 -1
  88. package/dist/agent/engine/registry.js +39 -12
  89. package/dist/agent/engine/registry.js.map +1 -1
  90. package/dist/client/FeedbackButton.d.ts.map +1 -1
  91. package/dist/client/FeedbackButton.js +6 -1
  92. package/dist/client/FeedbackButton.js.map +1 -1
  93. package/dist/client/agent-engine-key.d.ts +14 -0
  94. package/dist/client/agent-engine-key.d.ts.map +1 -1
  95. package/dist/client/agent-engine-key.js +35 -10
  96. package/dist/client/agent-engine-key.js.map +1 -1
  97. package/dist/client/analytics.d.ts.map +1 -1
  98. package/dist/client/analytics.js +71 -24
  99. package/dist/client/analytics.js.map +1 -1
  100. package/dist/client/blocks/library/HighlightedCode.d.ts +1 -1
  101. package/dist/client/blocks/library/HighlightedCode.js +1 -1
  102. package/dist/client/blocks/library/HighlightedCode.js.map +1 -1
  103. package/dist/client/index.d.ts +1 -1
  104. package/dist/client/index.d.ts.map +1 -1
  105. package/dist/client/index.js +1 -1
  106. package/dist/client/index.js.map +1 -1
  107. package/dist/client/session-replay.d.ts +1 -1
  108. package/dist/client/session-replay.d.ts.map +1 -1
  109. package/dist/client/session-replay.js +115 -17
  110. package/dist/client/session-replay.js.map +1 -1
  111. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  112. package/dist/client/settings/SettingsPanel.js +42 -6
  113. package/dist/client/settings/SettingsPanel.js.map +1 -1
  114. package/dist/collab/routes.d.ts +2 -2
  115. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  116. package/dist/notifications/routes.d.ts +1 -1
  117. package/dist/observability/routes.d.ts +7 -7
  118. package/dist/progress/routes.d.ts +1 -1
  119. package/dist/resources/handlers.d.ts +1 -1
  120. package/dist/scripts/agent-engines/manage-agent-engine.d.ts.map +1 -1
  121. package/dist/scripts/agent-engines/manage-agent-engine.js +4 -0
  122. package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
  123. package/dist/scripts/agent-engines/set-agent-engine.d.ts.map +1 -1
  124. package/dist/scripts/agent-engines/set-agent-engine.js +5 -4
  125. package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
  126. package/dist/scripts/agent-engines/test-agent-engine.d.ts.map +1 -1
  127. package/dist/scripts/agent-engines/test-agent-engine.js +37 -5
  128. package/dist/scripts/agent-engines/test-agent-engine.js.map +1 -1
  129. package/dist/server/agent-engine-api-key-route.d.ts +5 -5
  130. package/dist/server/agent-engine-api-key-route.d.ts.map +1 -1
  131. package/dist/server/agent-engine-api-key-route.js +71 -11
  132. package/dist/server/agent-engine-api-key-route.js.map +1 -1
  133. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  134. package/dist/server/core-routes-plugin.js +20 -3
  135. package/dist/server/core-routes-plugin.js.map +1 -1
  136. package/dist/styles/blocks.css +23 -7
  137. package/docs/content/deployment.md +133 -0
  138. package/docs/content/faq.md +1 -1
  139. package/docs/content/multi-app-workspace.md +2 -0
  140. package/docs/content/tracking.md +3 -3
  141. package/package.json +1 -1
@@ -26,8 +26,8 @@ export declare const getCollabState: import("h3").EventHandlerWithFetch<import("
26
26
  * Body: { update: string (base64), requestSource?: string }
27
27
  */
28
28
  export declare const postCollabUpdate: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
29
- ok?: undefined;
30
29
  error: string;
30
+ ok?: undefined;
31
31
  } | {
32
32
  error?: undefined;
33
33
  ok: boolean;
@@ -41,8 +41,8 @@ export declare const postCollabUpdate: import("h3").EventHandlerWithFetch<import
41
41
  * Body: { text: string, fieldName?: string, requestSource?: string }
42
42
  */
43
43
  export declare const postCollabText: import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
44
- ok?: undefined;
45
44
  text?: undefined;
45
+ ok?: undefined;
46
46
  error: string;
47
47
  } | {
48
48
  error?: undefined;
@@ -3,18 +3,18 @@ declare const _default: import("../../action.js").ActionDefinition<{
3
3
  url?: string;
4
4
  filename?: string;
5
5
  }, {
6
+ id?: undefined;
6
7
  error: string;
7
8
  configured?: undefined;
8
9
  connectPath?: undefined;
9
10
  url?: undefined;
10
- id?: undefined;
11
11
  provider?: undefined;
12
12
  } | {
13
+ id?: undefined;
13
14
  error: string;
14
15
  configured: boolean;
15
16
  connectPath: string;
16
17
  url?: undefined;
17
- id?: undefined;
18
18
  provider?: undefined;
19
19
  } | {
20
20
  error?: undefined;
@@ -28,7 +28,7 @@ export declare function createNotificationsHandler(): import("h3").EventHandlerW
28
28
  } | {
29
29
  count?: undefined;
30
30
  updated?: undefined;
31
- error?: undefined;
32
31
  ok: boolean;
32
+ error?: undefined;
33
33
  }>>;
34
34
  //# sourceMappingURL=routes.d.ts.map
@@ -41,28 +41,28 @@ export declare function createObservabilityHandler(): import("h3").EventHandlerW
41
41
  thumbsUpRate: number;
42
42
  avgEvalScore: number;
43
43
  } | {
44
- error?: undefined;
45
- ok?: undefined;
46
44
  summary: import("./types.js").TraceSummary;
47
45
  spans: import("./types.js").TraceSpan[];
48
46
  id?: undefined;
49
- } | {
50
47
  error?: undefined;
51
48
  ok?: undefined;
49
+ } | {
52
50
  summary?: undefined;
53
51
  spans?: undefined;
54
52
  id: string;
55
- } | {
53
+ error?: undefined;
56
54
  ok?: undefined;
55
+ } | {
57
56
  summary?: undefined;
58
57
  spans?: undefined;
59
- error: any;
60
58
  id?: undefined;
59
+ error: any;
60
+ ok?: undefined;
61
61
  } | {
62
- error?: undefined;
63
62
  summary?: undefined;
64
63
  spans?: undefined;
65
- ok: boolean;
66
64
  id?: undefined;
65
+ error?: undefined;
66
+ ok: boolean;
67
67
  }>>;
68
68
  //# sourceMappingURL=routes.d.ts.map
@@ -15,7 +15,7 @@ export declare function createProgressHandler(): import("h3").EventHandlerWithFe
15
15
  error: string;
16
16
  ok?: undefined;
17
17
  } | {
18
- error?: undefined;
19
18
  ok: boolean;
19
+ error?: undefined;
20
20
  }>>;
21
21
  //# sourceMappingURL=routes.d.ts.map
@@ -49,8 +49,8 @@ export declare function handleUpdateResource(event: any): Promise<import("./stor
49
49
  }>;
50
50
  /** DELETE /_agent-native/resources/:id — delete a resource */
51
51
  export declare function handleDeleteResource(event: any): Promise<{
52
- ok?: undefined;
53
52
  error: string;
53
+ ok?: undefined;
54
54
  } | {
55
55
  error?: undefined;
56
56
  ok: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"manage-agent-engine.d.ts","sourceRoot":"","sources":["../../../src/scripts/agent-engines/manage-agent-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AASvD,eAAO,MAAM,IAAI,EAAE,UAqClB,CAAC;AAyGF,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBvE"}
1
+ {"version":3,"file":"manage-agent-engine.d.ts","sourceRoot":"","sources":["../../../src/scripts/agent-engines/manage-agent-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AASvD,eAAO,MAAM,IAAI,EAAE,UA0ClB,CAAC;AAyGF,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBvE"}
@@ -35,6 +35,10 @@ export const tool = {
35
35
  type: "string",
36
36
  description: "Model ID (e.g. 'gpt-5.5', 'claude-sonnet-4-6', 'gemini-3-1-pro'). Required for \"set-app-default\"; optional for \"set\" and \"test\" where it defaults to the engine's default model.",
37
37
  },
38
+ baseUrl: {
39
+ type: "string",
40
+ description: 'Optional OpenAI-compatible endpoint URL for action="test" with engine="ai-sdk:openai". Saved endpoint settings are used when omitted.',
41
+ },
38
42
  appId: {
39
43
  type: "string",
40
44
  description: "App/template id whose default model should be managed. Defaults to the current app.",
@@ -1 +1 @@
1
- {"version":3,"file":"manage-agent-engine.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/manage-agent-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,qCAAqC,EACrC,kCAAkC,EAClC,gCAAgC,EAChC,iCAAiC,EACjC,iCAAiC,GAClC,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,mBAAmB,EACnB,6BAA6B,EAC7B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,eAAe,EACf,mBAAmB,GACpB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,GAAG,IAAI,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,CAAC,MAAM,IAAI,GAAe;IAC9B,WAAW,EACT,+ZAA+Z;IACja,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE;oBACJ,MAAM;oBACN,KAAK;oBACL,MAAM;oBACN,iBAAiB;oBACjB,iBAAiB;oBACjB,mBAAmB;iBACpB;gBACD,WAAW,EACT,mUAAmU;aACtU;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,uKAAuK;aAC1K;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wLAAwL;aAC3L;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,qFAAqF;aACxF;SACF;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;CACF,CAAC;AAEF,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,OAAO;YACL,SAAS,EAAE,mBAAmB,EAAE;YAChC,KAAK,EAAE,eAAe,EAAE;SACzB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAA4B;IAChD,OAAO,kCAAkC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAA4B;IAC1D,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK;QAAE,OAAO,0BAA0B,CAAC;IAC9C,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,MAAM,gCAAgC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,MAAM,qCAAqC,CAC3D,GAAG,CAAC,SAAS,EACb,GAAG,CAAC,KAAK,CACV,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAA4B;IAC1D,sBAAsB,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK;QAAE,OAAO,0BAA0B,CAAC;IAE9C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,MAAM;QAAE,OAAO,2BAA2B,CAAC;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,0BAA0B,CAAC;IAE9C,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK;QAAE,OAAO,0BAA0B,MAAM,GAAG,CAAC;IACvD,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,kBAAkB,MAAM,kFAAkF,KAAK,CAAC,cAAc,EAAE,CAAC;IAC1I,CAAC;IACD,IACE,KAAK,CAAC,IAAI,KAAK,SAAS;QACxB,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,EAC/C,CAAC;QACD,OAAO,iBAAiB,KAAK,iDAAiD,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACnH,CAAC;IAED,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,MAAM,qCAAqC,CAC3D,GAAG,CAAC,SAAS,EACb,GAAG,CAAC,KAAK,CACV,CAAC;IACF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,GAAG,CAAC,KAAK;YACd,CAAC,CAAC,2EAA2E;YAC7E,CAAC,CAAC,8DAA8D,CAAC;IACrE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,iCAAiC,CAAC,GAAG,EAAE,KAAK,EAAE;QACnE,MAAM;QACN,KAAK;QACL,SAAS,EAAE,GAAG,CAAC,SAAS;KACzB,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,EAAE,EAAE,IAAI;QACR,GAAG,QAAQ;QACX,OAAO,EAAE,qBAAqB,KAAK,WAAW,KAAK,QAAQ,KAAK,CAAC,KAAK,GAAG;KAC1E,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,IAA4B;IAE5B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK;QAAE,OAAO,0BAA0B,CAAC;IAC9C,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,MAAM,qCAAqC,CAC3D,GAAG,CAAC,SAAS,EACb,GAAG,CAAC,KAAK,CACV,CAAC;IACF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,GAAG,CAAC,KAAK;YACd,CAAC,CAAC,0EAA0E;YAC5E,CAAC,CAAC,6DAA6D,CAAC;IACpE,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,iCAAiC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrE,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,EAAE,EAAE,IAAI;QACR,GAAG,QAAQ;QACX,OAAO,EAAE,qBAAqB,KAAK,mCAAmC;KACvE,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAA4B;IACpD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAExB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,iBAAiB;YACpB,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAChC,KAAK,iBAAiB;YACpB,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAChC,KAAK,mBAAmB;YACtB,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAClC;YACE,OAAO,IAAI,CAAC,SAAS,CAAC;gBACpB,KAAK,EAAE,mBAAmB,MAAM,0FAA0F;aAC3H,CAAC,CAAC;IACP,CAAC;AACH,CAAC","sourcesContent":["/**\n * manage-agent-engine — unified tool for listing, setting, and testing agent engines.\n *\n * Consolidates the former list-agent-engines, set-agent-engine, and test-agent-engine\n * tools into a single tool with an `action` discriminator.\n */\n\nimport {\n canUpdateAgentAppModelDefaultSettings,\n normalizeAgentAppModelDefaultAppId,\n readAgentAppModelDefaultSettings,\n resetAgentAppModelDefaultSettings,\n writeAgentAppModelDefaultSettings,\n} from \"../../agent/app-model-defaults.js\";\nimport {\n getAgentEngineEntry,\n isAgentEnginePackageInstalled,\n normalizeModelForEngine,\n registerBuiltinEngines,\n} from \"../../agent/engine/index.js\";\nimport type { ActionTool } from \"../../agent/types.js\";\nimport {\n getRequestOrgId,\n getRequestUserEmail,\n} from \"../../server/request-context.js\";\nimport { run as runList } from \"./list-agent-engines.js\";\nimport { run as runSet } from \"./set-agent-engine.js\";\nimport { run as runTest } from \"./test-agent-engine.js\";\n\nexport const tool: ActionTool = {\n description:\n 'Manage AI agent engines: list available engines, set the active global engine/model, test an engine, or manage the current app/template default model. Pass action=\"list\" to see options, action=\"set\" to change the global default, action=\"test\" to verify connectivity, action=\"get-app-default\" to inspect this app default, action=\"set-app-default\" to set this app default, or action=\"reset-app-default\" to clear it.',\n parameters: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\n \"list\",\n \"set\",\n \"test\",\n \"get-app-default\",\n \"set-app-default\",\n \"reset-app-default\",\n ],\n description:\n '\"list\" — show available engines and current global selection. \"set\" — change the active global engine/model. \"test\" — send a trivial prompt to verify connectivity. \"get-app-default\" — show this app/template default. \"set-app-default\" — set this app/template default. \"reset-app-default\" — clear this app/template default.',\n },\n engine: {\n type: \"string\",\n description:\n 'Engine name (e.g. \"builder\", \"anthropic\", \"ai-sdk:openai\", \"ai-sdk:google\"). Required for \"set\" and \"set-app-default\", optional for \"test\" (defaults to \"anthropic\").',\n },\n model: {\n type: \"string\",\n description:\n \"Model ID (e.g. 'gpt-5.5', 'claude-sonnet-4-6', 'gemini-3-1-pro'). Required for \\\"set-app-default\\\"; optional for \\\"set\\\" and \\\"test\\\" where it defaults to the engine's default model.\",\n },\n appId: {\n type: \"string\",\n description:\n \"App/template id whose default model should be managed. Defaults to the current app.\",\n },\n },\n required: [\"action\"],\n },\n};\n\nfunction currentContext(): { userEmail?: string; orgId?: string | null } {\n try {\n return {\n userEmail: getRequestUserEmail(),\n orgId: getRequestOrgId(),\n };\n } catch {\n return {};\n }\n}\n\nfunction resolveAppId(args: Record<string, string>): string | null {\n return normalizeAgentAppModelDefaultAppId(args.appId);\n}\n\nasync function runGetAppDefault(args: Record<string, string>): Promise<string> {\n const appId = resolveAppId(args);\n if (!appId) return \"Error: appId is required\";\n const ctx = currentContext();\n const settings = await readAgentAppModelDefaultSettings(ctx, appId);\n const canUpdate = await canUpdateAgentAppModelDefaultSettings(\n ctx.userEmail,\n ctx.orgId,\n );\n return JSON.stringify({ ok: true, ...settings, canUpdate }, null, 2);\n}\n\nasync function runSetAppDefault(args: Record<string, string>): Promise<string> {\n registerBuiltinEngines();\n const appId = resolveAppId(args);\n if (!appId) return \"Error: appId is required\";\n\n const engine = args.engine?.trim();\n const model = args.model?.trim();\n if (!engine) return \"Error: engine is required\";\n if (!model) return \"Error: model is required\";\n\n const entry = getAgentEngineEntry(engine);\n if (!entry) return `Error: Unknown engine \"${engine}\"`;\n if (!isAgentEnginePackageInstalled(entry)) {\n return `Error: Engine \"${engine}\" requires optional packages that are not installed in this app. Run: pnpm add ${entry.installPackage}`;\n }\n if (\n entry.name === \"builder\" &&\n normalizeModelForEngine(entry, model) !== model\n ) {\n return `Error: Model \"${model}\" is not supported by Builder. Choose one of: ${entry.supportedModels.join(\", \")}`;\n }\n\n const ctx = currentContext();\n const canUpdate = await canUpdateAgentAppModelDefaultSettings(\n ctx.userEmail,\n ctx.orgId,\n );\n if (!canUpdate) {\n return ctx.orgId\n ? \"Error: Only organization owners and admins can change app model defaults.\"\n : \"Error: Authentication required to change app model defaults.\";\n }\n\n const settings = await writeAgentAppModelDefaultSettings(ctx, appId, {\n engine,\n model,\n updatedBy: ctx.userEmail,\n });\n return JSON.stringify(\n {\n ok: true,\n ...settings,\n message: `Default model for ${appId} set to ${model} via ${entry.label}.`,\n },\n null,\n 2,\n );\n}\n\nasync function runResetAppDefault(\n args: Record<string, string>,\n): Promise<string> {\n const appId = resolveAppId(args);\n if (!appId) return \"Error: appId is required\";\n const ctx = currentContext();\n const canUpdate = await canUpdateAgentAppModelDefaultSettings(\n ctx.userEmail,\n ctx.orgId,\n );\n if (!canUpdate) {\n return ctx.orgId\n ? \"Error: Only organization owners and admins can reset app model defaults.\"\n : \"Error: Authentication required to reset app model defaults.\";\n }\n const settings = await resetAgentAppModelDefaultSettings(ctx, appId);\n return JSON.stringify(\n {\n ok: true,\n ...settings,\n message: `Default model for ${appId} reset to the global LLM default.`,\n },\n null,\n 2,\n );\n}\n\nexport async function run(args: Record<string, string>): Promise<string> {\n const { action } = args;\n\n switch (action) {\n case \"list\":\n return runList(args);\n case \"set\":\n return runSet(args);\n case \"test\":\n return runTest(args);\n case \"get-app-default\":\n return runGetAppDefault(args);\n case \"set-app-default\":\n return runSetAppDefault(args);\n case \"reset-app-default\":\n return runResetAppDefault(args);\n default:\n return JSON.stringify({\n error: `Unknown action \"${action}\". Must be one of: list, set, test, get-app-default, set-app-default, reset-app-default.`,\n });\n }\n}\n"]}
1
+ {"version":3,"file":"manage-agent-engine.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/manage-agent-engine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * manage-agent-engine — unified tool for listing, setting, and testing agent engines.\n *\n * Consolidates the former list-agent-engines, set-agent-engine, and test-agent-engine\n * tools into a single tool with an `action` discriminator.\n */\n\nimport {\n canUpdateAgentAppModelDefaultSettings,\n normalizeAgentAppModelDefaultAppId,\n readAgentAppModelDefaultSettings,\n resetAgentAppModelDefaultSettings,\n writeAgentAppModelDefaultSettings,\n} from \"../../agent/app-model-defaults.js\";\nimport {\n getAgentEngineEntry,\n isAgentEnginePackageInstalled,\n normalizeModelForEngine,\n registerBuiltinEngines,\n} from \"../../agent/engine/index.js\";\nimport type { ActionTool } from \"../../agent/types.js\";\nimport {\n getRequestOrgId,\n getRequestUserEmail,\n} from \"../../server/request-context.js\";\nimport { run as runList } from \"./list-agent-engines.js\";\nimport { run as runSet } from \"./set-agent-engine.js\";\nimport { run as runTest } from \"./test-agent-engine.js\";\n\nexport const tool: ActionTool = {\n description:\n 'Manage AI agent engines: list available engines, set the active global engine/model, test an engine, or manage the current app/template default model. Pass action=\"list\" to see options, action=\"set\" to change the global default, action=\"test\" to verify connectivity, action=\"get-app-default\" to inspect this app default, action=\"set-app-default\" to set this app default, or action=\"reset-app-default\" to clear it.',\n parameters: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\n \"list\",\n \"set\",\n \"test\",\n \"get-app-default\",\n \"set-app-default\",\n \"reset-app-default\",\n ],\n description:\n '\"list\" — show available engines and current global selection. \"set\" — change the active global engine/model. \"test\" — send a trivial prompt to verify connectivity. \"get-app-default\" — show this app/template default. \"set-app-default\" — set this app/template default. \"reset-app-default\" — clear this app/template default.',\n },\n engine: {\n type: \"string\",\n description:\n 'Engine name (e.g. \"builder\", \"anthropic\", \"ai-sdk:openai\", \"ai-sdk:google\"). Required for \"set\" and \"set-app-default\", optional for \"test\" (defaults to \"anthropic\").',\n },\n model: {\n type: \"string\",\n description:\n \"Model ID (e.g. 'gpt-5.5', 'claude-sonnet-4-6', 'gemini-3-1-pro'). Required for \\\"set-app-default\\\"; optional for \\\"set\\\" and \\\"test\\\" where it defaults to the engine's default model.\",\n },\n baseUrl: {\n type: \"string\",\n description:\n 'Optional OpenAI-compatible endpoint URL for action=\"test\" with engine=\"ai-sdk:openai\". Saved endpoint settings are used when omitted.',\n },\n appId: {\n type: \"string\",\n description:\n \"App/template id whose default model should be managed. Defaults to the current app.\",\n },\n },\n required: [\"action\"],\n },\n};\n\nfunction currentContext(): { userEmail?: string; orgId?: string | null } {\n try {\n return {\n userEmail: getRequestUserEmail(),\n orgId: getRequestOrgId(),\n };\n } catch {\n return {};\n }\n}\n\nfunction resolveAppId(args: Record<string, string>): string | null {\n return normalizeAgentAppModelDefaultAppId(args.appId);\n}\n\nasync function runGetAppDefault(args: Record<string, string>): Promise<string> {\n const appId = resolveAppId(args);\n if (!appId) return \"Error: appId is required\";\n const ctx = currentContext();\n const settings = await readAgentAppModelDefaultSettings(ctx, appId);\n const canUpdate = await canUpdateAgentAppModelDefaultSettings(\n ctx.userEmail,\n ctx.orgId,\n );\n return JSON.stringify({ ok: true, ...settings, canUpdate }, null, 2);\n}\n\nasync function runSetAppDefault(args: Record<string, string>): Promise<string> {\n registerBuiltinEngines();\n const appId = resolveAppId(args);\n if (!appId) return \"Error: appId is required\";\n\n const engine = args.engine?.trim();\n const model = args.model?.trim();\n if (!engine) return \"Error: engine is required\";\n if (!model) return \"Error: model is required\";\n\n const entry = getAgentEngineEntry(engine);\n if (!entry) return `Error: Unknown engine \"${engine}\"`;\n if (!isAgentEnginePackageInstalled(entry)) {\n return `Error: Engine \"${engine}\" requires optional packages that are not installed in this app. Run: pnpm add ${entry.installPackage}`;\n }\n if (\n entry.name === \"builder\" &&\n normalizeModelForEngine(entry, model) !== model\n ) {\n return `Error: Model \"${model}\" is not supported by Builder. Choose one of: ${entry.supportedModels.join(\", \")}`;\n }\n\n const ctx = currentContext();\n const canUpdate = await canUpdateAgentAppModelDefaultSettings(\n ctx.userEmail,\n ctx.orgId,\n );\n if (!canUpdate) {\n return ctx.orgId\n ? \"Error: Only organization owners and admins can change app model defaults.\"\n : \"Error: Authentication required to change app model defaults.\";\n }\n\n const settings = await writeAgentAppModelDefaultSettings(ctx, appId, {\n engine,\n model,\n updatedBy: ctx.userEmail,\n });\n return JSON.stringify(\n {\n ok: true,\n ...settings,\n message: `Default model for ${appId} set to ${model} via ${entry.label}.`,\n },\n null,\n 2,\n );\n}\n\nasync function runResetAppDefault(\n args: Record<string, string>,\n): Promise<string> {\n const appId = resolveAppId(args);\n if (!appId) return \"Error: appId is required\";\n const ctx = currentContext();\n const canUpdate = await canUpdateAgentAppModelDefaultSettings(\n ctx.userEmail,\n ctx.orgId,\n );\n if (!canUpdate) {\n return ctx.orgId\n ? \"Error: Only organization owners and admins can reset app model defaults.\"\n : \"Error: Authentication required to reset app model defaults.\";\n }\n const settings = await resetAgentAppModelDefaultSettings(ctx, appId);\n return JSON.stringify(\n {\n ok: true,\n ...settings,\n message: `Default model for ${appId} reset to the global LLM default.`,\n },\n null,\n 2,\n );\n}\n\nexport async function run(args: Record<string, string>): Promise<string> {\n const { action } = args;\n\n switch (action) {\n case \"list\":\n return runList(args);\n case \"set\":\n return runSet(args);\n case \"test\":\n return runTest(args);\n case \"get-app-default\":\n return runGetAppDefault(args);\n case \"set-app-default\":\n return runSetAppDefault(args);\n case \"reset-app-default\":\n return runResetAppDefault(args);\n default:\n return JSON.stringify({\n error: `Unknown action \"${action}\". Must be one of: list, set, test, get-app-default, set-app-default, reset-app-default.`,\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"set-agent-engine.d.ts","sourceRoot":"","sources":["../../../src/scripts/agent-engines/set-agent-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGvD,eAAO,MAAM,IAAI,EAAE,UAmBlB,CAAC;AAEF,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAsDvE"}
1
+ {"version":3,"file":"set-agent-engine.d.ts","sourceRoot":"","sources":["../../../src/scripts/agent-engines/set-agent-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGvD,eAAO,MAAM,IAAI,EAAE,UAmBlB,CAAC;AAEF,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA0DvE"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * set-agent-engine — validates and writes agent engine selection to settings.
3
3
  */
4
- import { listAgentEngines, getAgentEngineEntry, isAgentEnginePackageInstalled, normalizeModelForEngine, registerBuiltinEngines, } from "../../agent/engine/index.js";
4
+ import { listAgentEngines, getAgentEngineEntry, isAgentEnginePackageInstalled, isStoredEngineUsableForRequest, normalizeModelForEngine, registerBuiltinEngines, } from "../../agent/engine/index.js";
5
5
  import { putSetting } from "../../settings/index.js";
6
6
  export const tool = {
7
7
  description: 'Set the active AI agent engine and model. Changes take effect on the next conversation. Use manage-agent-engine with action="list" first to see available options.',
@@ -45,9 +45,10 @@ export async function run(args) {
45
45
  // uncurated saves. Builder is an enumerated gateway and is checked above.
46
46
  const modelIsCurated = entry.supportedModels.length === 0 ||
47
47
  entry.supportedModels.includes(resolvedModel);
48
- const missingEnvVars = entry.requiredEnvVars.filter((v) => !process.env[v]);
49
- if (missingEnvVars.length > 0) {
50
- return `Warning: Engine "${engineName}" requires the following environment variables which are not set: ${missingEnvVars.join(", ")}. The engine will fail at runtime without them.`;
48
+ const usable = await isStoredEngineUsableForRequest({ engine: engineName }, entry);
49
+ if (!usable) {
50
+ const missingEnvVars = entry.requiredEnvVars.join(", ");
51
+ return `Warning: Engine "${engineName}" requires the following credentials which are not configured for this request: ${missingEnvVars}. The engine will fail at runtime without them.`;
51
52
  }
52
53
  await putSetting("agent-engine", {
53
54
  engine: engineName,
@@ -1 +1 @@
1
- {"version":3,"file":"set-agent-engine.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/set-agent-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,6BAA6B,EAC7B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,CAAC,MAAM,IAAI,GAAe;IAC9B,WAAW,EACT,oKAAoK;IACtK,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,kIAAkI;aACrI;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,4HAA4H;aAC/H;SACF;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAA4B;IACpD,sBAAsB,EAAE,CAAC;IAEzB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAE3C,IAAI,CAAC,UAAU;QAAE,OAAO,6BAA6B,CAAC;IAEtD,MAAM,KAAK,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,gBAAgB,EAAE;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,kBAAkB,UAAU,mCAAmC,SAAS,EAAE,CAAC;IACpF,CAAC;IAED,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,kBAAkB,UAAU,kFAAkF,KAAK,CAAC,cAAc,EAAE,CAAC;IAC9I,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC;IAClD,IACE,KAAK,CAAC,IAAI,KAAK,SAAS;QACxB,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,aAAa,EAC/D,CAAC;QACD,OAAO,iBAAiB,aAAa,iDAAiD,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3H,CAAC;IAED,sEAAsE;IACtE,0EAA0E;IAC1E,0EAA0E;IAC1E,MAAM,cAAc,GAClB,KAAK,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;QAClC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAEhD,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,oBAAoB,UAAU,qEAAqE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,iDAAiD,CAAC;IACvL,CAAC;IAED,MAAM,UAAU,CAAC,cAAc,EAAE;QAC/B,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,aAAa;KACrB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,cAAc;QAC/B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,YAAY,aAAa,mCAAmC,KAAK,CAAC,KAAK,sEAAsE,CAAC;IAElJ,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,uBAAuB,KAAK,CAAC,KAAK,eAAe,aAAa,2CAA2C,UAAU,EAAE;KAC/H,CAAC,CAAC;AACL,CAAC","sourcesContent":["/**\n * set-agent-engine — validates and writes agent engine selection to settings.\n */\n\nimport {\n listAgentEngines,\n getAgentEngineEntry,\n isAgentEnginePackageInstalled,\n normalizeModelForEngine,\n registerBuiltinEngines,\n} from \"../../agent/engine/index.js\";\nimport type { ActionTool } from \"../../agent/types.js\";\nimport { putSetting } from \"../../settings/index.js\";\n\nexport const tool: ActionTool = {\n description:\n 'Set the active AI agent engine and model. Changes take effect on the next conversation. Use manage-agent-engine with action=\"list\" first to see available options.',\n parameters: {\n type: \"object\",\n properties: {\n engine: {\n type: \"string\",\n description:\n 'Engine name (e.g. \"anthropic\", \"ai-sdk:openai\", \"ai-sdk:google\"). Use manage-agent-engine with action=\"list\" to see all options.',\n },\n model: {\n type: \"string\",\n description:\n \"Model ID to use with this engine (e.g. 'gpt-5.5', 'claude-sonnet-4-6'). Defaults to the engine's default model if omitted.\",\n },\n },\n required: [\"engine\"],\n },\n};\n\nexport async function run(args: Record<string, string>): Promise<string> {\n registerBuiltinEngines();\n\n const { engine: engineName, model } = args;\n\n if (!engineName) return \"Error: --engine is required\";\n\n const entry = getAgentEngineEntry(engineName);\n if (!entry) {\n const available = listAgentEngines()\n .map((e) => e.name)\n .join(\", \");\n return `Error: Engine \"${engineName}\" not found. Available engines: ${available}`;\n }\n\n if (!isAgentEnginePackageInstalled(entry)) {\n return `Error: Engine \"${engineName}\" requires optional packages that are not installed in this app. Run: pnpm add ${entry.installPackage}`;\n }\n\n const resolvedModel = model ?? entry.defaultModel;\n if (\n entry.name === \"builder\" &&\n normalizeModelForEngine(entry, resolvedModel) !== resolvedModel\n ) {\n return `Error: Model \"${resolvedModel}\" is not supported by Builder. Choose one of: ${entry.supportedModels.join(\", \")}`;\n }\n\n // supportedModels is a suggestion list, not an allowlist — accept any\n // string for BYO/custom engines (OpenRouter / Ollama / previews) and flag\n // uncurated saves. Builder is an enumerated gateway and is checked above.\n const modelIsCurated =\n entry.supportedModels.length === 0 ||\n entry.supportedModels.includes(resolvedModel);\n\n const missingEnvVars = entry.requiredEnvVars.filter((v) => !process.env[v]);\n if (missingEnvVars.length > 0) {\n return `Warning: Engine \"${engineName}\" requires the following environment variables which are not set: ${missingEnvVars.join(\", \")}. The engine will fail at runtime without them.`;\n }\n\n await putSetting(\"agent-engine\", {\n engine: engineName,\n model: resolvedModel,\n });\n\n const customNote = modelIsCurated\n ? \"\"\n : ` (model \"${resolvedModel}\" isn't in the curated list for ${entry.label}; saved as a custom model — verify it's a real ID for this provider)`;\n\n return JSON.stringify({\n ok: true,\n engine: engineName,\n model: resolvedModel,\n message: `Agent engine set to ${entry.label} with model ${resolvedModel}. Takes effect on the next conversation.${customNote}`,\n });\n}\n"]}
1
+ {"version":3,"file":"set-agent-engine.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/set-agent-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,6BAA6B,EAC7B,8BAA8B,EAC9B,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,MAAM,CAAC,MAAM,IAAI,GAAe;IAC9B,WAAW,EACT,oKAAoK;IACtK,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,kIAAkI;aACrI;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,4HAA4H;aAC/H;SACF;QACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;KACrB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAA4B;IACpD,sBAAsB,EAAE,CAAC;IAEzB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IAE3C,IAAI,CAAC,UAAU;QAAE,OAAO,6BAA6B,CAAC;IAEtD,MAAM,KAAK,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,gBAAgB,EAAE;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,kBAAkB,UAAU,mCAAmC,SAAS,EAAE,CAAC;IACpF,CAAC;IAED,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,kBAAkB,UAAU,kFAAkF,KAAK,CAAC,cAAc,EAAE,CAAC;IAC9I,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,IAAI,KAAK,CAAC,YAAY,CAAC;IAClD,IACE,KAAK,CAAC,IAAI,KAAK,SAAS;QACxB,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,aAAa,EAC/D,CAAC;QACD,OAAO,iBAAiB,aAAa,iDAAiD,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3H,CAAC;IAED,sEAAsE;IACtE,0EAA0E;IAC1E,0EAA0E;IAC1E,MAAM,cAAc,GAClB,KAAK,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;QAClC,KAAK,CAAC,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,MAAM,8BAA8B,CACjD,EAAE,MAAM,EAAE,UAAU,EAAE,EACtB,KAAK,CACN,CAAC;IACF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,OAAO,oBAAoB,UAAU,mFAAmF,cAAc,iDAAiD,CAAC;IAC1L,CAAC;IAED,MAAM,UAAU,CAAC,cAAc,EAAE;QAC/B,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,aAAa;KACrB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,cAAc;QAC/B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,YAAY,aAAa,mCAAmC,KAAK,CAAC,KAAK,sEAAsE,CAAC;IAElJ,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,uBAAuB,KAAK,CAAC,KAAK,eAAe,aAAa,2CAA2C,UAAU,EAAE;KAC/H,CAAC,CAAC;AACL,CAAC","sourcesContent":["/**\n * set-agent-engine — validates and writes agent engine selection to settings.\n */\n\nimport {\n listAgentEngines,\n getAgentEngineEntry,\n isAgentEnginePackageInstalled,\n isStoredEngineUsableForRequest,\n normalizeModelForEngine,\n registerBuiltinEngines,\n} from \"../../agent/engine/index.js\";\nimport type { ActionTool } from \"../../agent/types.js\";\nimport { putSetting } from \"../../settings/index.js\";\n\nexport const tool: ActionTool = {\n description:\n 'Set the active AI agent engine and model. Changes take effect on the next conversation. Use manage-agent-engine with action=\"list\" first to see available options.',\n parameters: {\n type: \"object\",\n properties: {\n engine: {\n type: \"string\",\n description:\n 'Engine name (e.g. \"anthropic\", \"ai-sdk:openai\", \"ai-sdk:google\"). Use manage-agent-engine with action=\"list\" to see all options.',\n },\n model: {\n type: \"string\",\n description:\n \"Model ID to use with this engine (e.g. 'gpt-5.5', 'claude-sonnet-4-6'). Defaults to the engine's default model if omitted.\",\n },\n },\n required: [\"engine\"],\n },\n};\n\nexport async function run(args: Record<string, string>): Promise<string> {\n registerBuiltinEngines();\n\n const { engine: engineName, model } = args;\n\n if (!engineName) return \"Error: --engine is required\";\n\n const entry = getAgentEngineEntry(engineName);\n if (!entry) {\n const available = listAgentEngines()\n .map((e) => e.name)\n .join(\", \");\n return `Error: Engine \"${engineName}\" not found. Available engines: ${available}`;\n }\n\n if (!isAgentEnginePackageInstalled(entry)) {\n return `Error: Engine \"${engineName}\" requires optional packages that are not installed in this app. Run: pnpm add ${entry.installPackage}`;\n }\n\n const resolvedModel = model ?? entry.defaultModel;\n if (\n entry.name === \"builder\" &&\n normalizeModelForEngine(entry, resolvedModel) !== resolvedModel\n ) {\n return `Error: Model \"${resolvedModel}\" is not supported by Builder. Choose one of: ${entry.supportedModels.join(\", \")}`;\n }\n\n // supportedModels is a suggestion list, not an allowlist — accept any\n // string for BYO/custom engines (OpenRouter / Ollama / previews) and flag\n // uncurated saves. Builder is an enumerated gateway and is checked above.\n const modelIsCurated =\n entry.supportedModels.length === 0 ||\n entry.supportedModels.includes(resolvedModel);\n\n const usable = await isStoredEngineUsableForRequest(\n { engine: engineName },\n entry,\n );\n if (!usable) {\n const missingEnvVars = entry.requiredEnvVars.join(\", \");\n return `Warning: Engine \"${engineName}\" requires the following credentials which are not configured for this request: ${missingEnvVars}. The engine will fail at runtime without them.`;\n }\n\n await putSetting(\"agent-engine\", {\n engine: engineName,\n model: resolvedModel,\n });\n\n const customNote = modelIsCurated\n ? \"\"\n : ` (model \"${resolvedModel}\" isn't in the curated list for ${entry.label}; saved as a custom model — verify it's a real ID for this provider)`;\n\n return JSON.stringify({\n ok: true,\n engine: engineName,\n model: resolvedModel,\n message: `Agent engine set to ${entry.label} with model ${resolvedModel}. Takes effect on the next conversation.${customNote}`,\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"test-agent-engine.d.ts","sourceRoot":"","sources":["../../../src/scripts/agent-engines/test-agent-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEvD,eAAO,MAAM,IAAI,EAAE,UAmBlB,CAAC;AAEF,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAuFvE"}
1
+ {"version":3,"file":"test-agent-engine.d.ts","sourceRoot":"","sources":["../../../src/scripts/agent-engines/test-agent-engine.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAOvD,eAAO,MAAM,IAAI,EAAE,UAwBlB,CAAC;AAwCF,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAkFvE"}
@@ -2,6 +2,8 @@
2
2
  * test-agent-engine — sends a trivial prompt to verify the engine is working.
3
3
  */
4
4
  import { getAgentEngineEntry, registerBuiltinEngines, } from "../../agent/engine/index.js";
5
+ import { normalizeOpenAiBaseUrl, OPENAI_BASE_URL_ENV_VAR, } from "../../agent/engine/openai-compatible-endpoint.js";
6
+ import { canUseDeployCredentialFallbackForRequest, readDeployCredentialEnv, resolveSecret, } from "../../server/credential-provider.js";
5
7
  export const tool = {
6
8
  description: "Test an agent engine by sending a trivial prompt and measuring latency. Useful for verifying API keys and connectivity before switching engines.",
7
9
  parameters: {
@@ -15,10 +17,44 @@ export const tool = {
15
17
  type: "string",
16
18
  description: "Model to use for the test. Defaults to the engine's default model.",
17
19
  },
20
+ baseUrl: {
21
+ type: "string",
22
+ description: 'Optional OpenAI-compatible endpoint URL to test with "ai-sdk:openai". Uses the saved endpoint when omitted.',
23
+ },
18
24
  },
19
25
  required: [],
20
26
  },
21
27
  };
28
+ async function resolveAgentEngineSecret(key) {
29
+ try {
30
+ const value = await resolveSecret(key);
31
+ if (value)
32
+ return value;
33
+ }
34
+ catch {
35
+ // Fall through to deploy env when this request is allowed to use it.
36
+ }
37
+ return canUseDeployCredentialFallbackForRequest()
38
+ ? readDeployCredentialEnv(key)
39
+ : undefined;
40
+ }
41
+ async function createEngineConfig(entry, args) {
42
+ const config = {
43
+ apiKey: entry.requiredEnvVars.length > 0
44
+ ? await resolveAgentEngineSecret(entry.requiredEnvVars[0])
45
+ : undefined,
46
+ allowEnvFallback: canUseDeployCredentialFallbackForRequest(),
47
+ };
48
+ if (entry.name === "ai-sdk:openai") {
49
+ const rawBaseUrl = args.baseUrl?.trim()
50
+ ? args.baseUrl
51
+ : await resolveAgentEngineSecret(OPENAI_BASE_URL_ENV_VAR);
52
+ if (rawBaseUrl) {
53
+ config.baseUrl = normalizeOpenAiBaseUrl(rawBaseUrl);
54
+ }
55
+ }
56
+ return config;
57
+ }
22
58
  export async function run(args) {
23
59
  registerBuiltinEngines();
24
60
  const engineName = args.engine ?? "anthropic";
@@ -31,11 +67,7 @@ export async function run(args) {
31
67
  }
32
68
  const model = args.model ?? entry.defaultModel;
33
69
  try {
34
- const engine = entry.create({
35
- apiKey: entry.requiredEnvVars.length > 0
36
- ? process.env[entry.requiredEnvVars[0]]
37
- : undefined,
38
- });
70
+ const engine = entry.create(await createEngineConfig(entry, args));
39
71
  const start = Date.now();
40
72
  const controller = new AbortController();
41
73
  const timeout = setTimeout(() => controller.abort(), 30_000);
@@ -1 +1 @@
1
- {"version":3,"file":"test-agent-engine.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/test-agent-engine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * test-agent-engine — sends a trivial prompt to verify the engine is working.\n */\n\nimport {\n getAgentEngineEntry,\n registerBuiltinEngines,\n} from \"../../agent/engine/index.js\";\nimport type { ActionTool } from \"../../agent/types.js\";\n\nexport const tool: ActionTool = {\n description:\n \"Test an agent engine by sending a trivial prompt and measuring latency. Useful for verifying API keys and connectivity before switching engines.\",\n parameters: {\n type: \"object\",\n properties: {\n engine: {\n type: \"string\",\n description:\n 'Engine name to test (e.g. \"anthropic\", \"ai-sdk:openai\"). Defaults to \"anthropic\".',\n },\n model: {\n type: \"string\",\n description:\n \"Model to use for the test. Defaults to the engine's default model.\",\n },\n },\n required: [],\n },\n};\n\nexport async function run(args: Record<string, string>): Promise<string> {\n registerBuiltinEngines();\n\n const engineName = args.engine ?? \"anthropic\";\n const entry = getAgentEngineEntry(engineName);\n if (!entry) {\n return JSON.stringify({\n ok: false,\n error: `Engine \"${engineName}\" not found`,\n });\n }\n\n const model = args.model ?? entry.defaultModel;\n\n try {\n const engine = entry.create({\n apiKey:\n entry.requiredEnvVars.length > 0\n ? process.env[entry.requiredEnvVars[0]]\n : undefined,\n });\n\n const start = Date.now();\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 30_000);\n\n let responseText = \"\";\n let stopReason = \"\";\n\n let streamError: string | undefined;\n\n try {\n for await (const event of engine.stream({\n model,\n systemPrompt: \"You are a test agent. Reply concisely.\",\n messages: [\n {\n role: \"user\",\n content: [{ type: \"text\", text: \"Reply with exactly: OK\" }],\n },\n ],\n tools: [],\n abortSignal: controller.signal,\n })) {\n if (event.type === \"text-delta\") {\n responseText += event.text;\n } else if (event.type === \"stop\") {\n stopReason = event.reason;\n if (event.reason === \"error\") {\n streamError = (event as any).error ?? \"Unknown error\";\n }\n }\n }\n } finally {\n clearTimeout(timeout);\n }\n\n const latencyMs = Date.now() - start;\n\n if (streamError) {\n return JSON.stringify({\n ok: false,\n engine: engineName,\n model,\n error: streamError,\n capabilities: entry.capabilities,\n });\n }\n\n return JSON.stringify({\n ok: true,\n engine: engineName,\n model,\n latencyMs,\n response: responseText.slice(0, 100),\n stopReason,\n capabilities: entry.capabilities,\n });\n } catch (err: any) {\n return JSON.stringify({\n ok: false,\n engine: engineName,\n model,\n error: err?.message ?? String(err),\n capabilities: entry.capabilities,\n });\n }\n}\n"]}
1
+ {"version":3,"file":"test-agent-engine.js","sourceRoot":"","sources":["../../../src/scripts/agent-engines/test-agent-engine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * test-agent-engine — sends a trivial prompt to verify the engine is working.\n */\n\nimport {\n getAgentEngineEntry,\n registerBuiltinEngines,\n type AgentEngineEntry,\n} from \"../../agent/engine/index.js\";\nimport {\n normalizeOpenAiBaseUrl,\n OPENAI_BASE_URL_ENV_VAR,\n} from \"../../agent/engine/openai-compatible-endpoint.js\";\nimport type { ActionTool } from \"../../agent/types.js\";\nimport {\n canUseDeployCredentialFallbackForRequest,\n readDeployCredentialEnv,\n resolveSecret,\n} from \"../../server/credential-provider.js\";\n\nexport const tool: ActionTool = {\n description:\n \"Test an agent engine by sending a trivial prompt and measuring latency. Useful for verifying API keys and connectivity before switching engines.\",\n parameters: {\n type: \"object\",\n properties: {\n engine: {\n type: \"string\",\n description:\n 'Engine name to test (e.g. \"anthropic\", \"ai-sdk:openai\"). Defaults to \"anthropic\".',\n },\n model: {\n type: \"string\",\n description:\n \"Model to use for the test. Defaults to the engine's default model.\",\n },\n baseUrl: {\n type: \"string\",\n description:\n 'Optional OpenAI-compatible endpoint URL to test with \"ai-sdk:openai\". Uses the saved endpoint when omitted.',\n },\n },\n required: [],\n },\n};\n\nasync function resolveAgentEngineSecret(\n key: string,\n): Promise<string | undefined> {\n try {\n const value = await resolveSecret(key);\n if (value) return value;\n } catch {\n // Fall through to deploy env when this request is allowed to use it.\n }\n return canUseDeployCredentialFallbackForRequest()\n ? readDeployCredentialEnv(key)\n : undefined;\n}\n\nasync function createEngineConfig(\n entry: AgentEngineEntry,\n args: Record<string, string>,\n): Promise<Record<string, unknown>> {\n const config: Record<string, unknown> = {\n apiKey:\n entry.requiredEnvVars.length > 0\n ? await resolveAgentEngineSecret(entry.requiredEnvVars[0])\n : undefined,\n allowEnvFallback: canUseDeployCredentialFallbackForRequest(),\n };\n\n if (entry.name === \"ai-sdk:openai\") {\n const rawBaseUrl = args.baseUrl?.trim()\n ? args.baseUrl\n : await resolveAgentEngineSecret(OPENAI_BASE_URL_ENV_VAR);\n if (rawBaseUrl) {\n config.baseUrl = normalizeOpenAiBaseUrl(rawBaseUrl);\n }\n }\n\n return config;\n}\n\nexport async function run(args: Record<string, string>): Promise<string> {\n registerBuiltinEngines();\n\n const engineName = args.engine ?? \"anthropic\";\n const entry = getAgentEngineEntry(engineName);\n if (!entry) {\n return JSON.stringify({\n ok: false,\n error: `Engine \"${engineName}\" not found`,\n });\n }\n\n const model = args.model ?? entry.defaultModel;\n\n try {\n const engine = entry.create(await createEngineConfig(entry, args));\n\n const start = Date.now();\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 30_000);\n\n let responseText = \"\";\n let stopReason = \"\";\n\n let streamError: string | undefined;\n\n try {\n for await (const event of engine.stream({\n model,\n systemPrompt: \"You are a test agent. Reply concisely.\",\n messages: [\n {\n role: \"user\",\n content: [{ type: \"text\", text: \"Reply with exactly: OK\" }],\n },\n ],\n tools: [],\n abortSignal: controller.signal,\n })) {\n if (event.type === \"text-delta\") {\n responseText += event.text;\n } else if (event.type === \"stop\") {\n stopReason = event.reason;\n if (event.reason === \"error\") {\n streamError = (event as any).error ?? \"Unknown error\";\n }\n }\n }\n } finally {\n clearTimeout(timeout);\n }\n\n const latencyMs = Date.now() - start;\n\n if (streamError) {\n return JSON.stringify({\n ok: false,\n engine: engineName,\n model,\n error: streamError,\n capabilities: entry.capabilities,\n });\n }\n\n return JSON.stringify({\n ok: true,\n engine: engineName,\n model,\n latencyMs,\n response: responseText.slice(0, 100),\n stopReason,\n capabilities: entry.capabilities,\n });\n } catch (err: any) {\n return JSON.stringify({\n ok: false,\n engine: engineName,\n model,\n error: err?.message ?? String(err),\n capabilities: entry.capabilities,\n });\n }\n}\n"]}
@@ -7,7 +7,9 @@ export interface AgentEngineApiKeyWriteTarget {
7
7
  export declare function normalizeAgentEngineApiKeyPayload(body: unknown): {
8
8
  ok: true;
9
9
  key: string;
10
- value: string;
10
+ value?: string;
11
+ baseUrl?: string;
12
+ clearBaseUrl: boolean;
11
13
  scope: AgentEngineApiKeyScope;
12
14
  } | {
13
15
  ok: false;
@@ -23,15 +25,13 @@ export declare function resolveAgentEngineApiKeyWriteTarget(event: H3Event, scop
23
25
  error: string;
24
26
  }>;
25
27
  export declare function createAgentEngineApiKeyHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
26
- ok?: undefined;
27
28
  error: any;
28
- key?: undefined;
29
- scope?: undefined;
30
29
  } | {
31
- error?: undefined;
32
30
  ok: boolean;
33
31
  key: string;
32
+ baseUrlKey?: string;
34
33
  scope: AgentEngineApiKeyScope;
34
+ error?: undefined;
35
35
  }>>;
36
36
  export {};
37
37
  //# sourceMappingURL=agent-engine-api-key-route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-engine-api-key-route.d.ts","sourceRoot":"","sources":["../../src/server/agent-engine-api-key-route.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,OAAO,EACb,MAAM,IAAI,CAAC;AAgBZ,KAAK,sBAAsB,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7C,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,OAAO,GAC3D;IACE,EAAE,EAAE,IAAI,CAAC;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,sBAAsB,CAAC;CAC/B,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAgDnD;AAED,wBAAsB,mCAAmC,CACvD,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CACN;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,4BAA4B,CAAA;CAAE,GAClD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CACnD,CA6BA;AAED,wBAAgB,8BAA8B;;;;;;;;;;IAqC7C"}
1
+ {"version":3,"file":"agent-engine-api-key-route.d.ts","sourceRoot":"","sources":["../../src/server/agent-engine-api-key-route.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,OAAO,EACb,MAAM,IAAI,CAAC;AAoBZ,KAAK,sBAAsB,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7C,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,sBAAsB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,OAAO,GAC3D;IACE,EAAE,EAAE,IAAI,CAAC;IACT,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,sBAAsB,CAAC;CAC/B,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA6FnD;AAED,wBAAsB,mCAAmC,CACvD,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CACN;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,4BAA4B,CAAA;CAAE,GAClD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CACnD,CA6BA;AAED,wBAAgB,8BAA8B;;;;;;;;IAyD7C"}
@@ -1,7 +1,8 @@
1
1
  import { defineEventHandler, getMethod, setResponseStatus, } from "h3";
2
- import { PROVIDER_ENV_META } from "../agent/engine/provider-env-vars.js";
2
+ import { normalizeOpenAiBaseUrl } from "../agent/engine/openai-compatible-endpoint.js";
3
+ import { OPENAI_BASE_URL_ENV_VAR, PROVIDER_ENV_META, } from "../agent/engine/provider-env-vars.js";
3
4
  import { getOrgContext } from "../org/context.js";
4
- import { writeAppSecret } from "../secrets/storage.js";
5
+ import { deleteAppSecret, writeAppSecret } from "../secrets/storage.js";
5
6
  import { getSession } from "./auth.js";
6
7
  import { readBody } from "./h3-helpers.js";
7
8
  const PROVIDER_TO_ENV_VAR = new Map(Object.entries(PROVIDER_ENV_META).map(([provider, meta]) => [
@@ -29,8 +30,45 @@ export function normalizeAgentEngineApiKeyPayload(body) {
29
30
  : typeof raw.apiKey === "string"
30
31
  ? raw.apiKey.trim()
31
32
  : "";
32
- if (!value) {
33
- return { ok: false, statusCode: 400, error: "value is required" };
33
+ const rawBaseUrl = typeof raw.baseUrl === "string"
34
+ ? raw.baseUrl
35
+ : typeof raw.endpointUrl === "string"
36
+ ? raw.endpointUrl
37
+ : "";
38
+ let baseUrl;
39
+ if (rawBaseUrl.trim()) {
40
+ if (key !== PROVIDER_TO_ENV_VAR.get("openai")) {
41
+ return {
42
+ ok: false,
43
+ statusCode: 400,
44
+ error: "Endpoint URL is only supported for OpenAI.",
45
+ };
46
+ }
47
+ try {
48
+ baseUrl = normalizeOpenAiBaseUrl(rawBaseUrl);
49
+ }
50
+ catch (err) {
51
+ return {
52
+ ok: false,
53
+ statusCode: 400,
54
+ error: err instanceof Error ? err.message : String(err),
55
+ };
56
+ }
57
+ }
58
+ const clearBaseUrl = raw.clearBaseUrl === true && baseUrl == null;
59
+ if (clearBaseUrl && key !== PROVIDER_TO_ENV_VAR.get("openai")) {
60
+ return {
61
+ ok: false,
62
+ statusCode: 400,
63
+ error: "Endpoint URL is only supported for OpenAI.",
64
+ };
65
+ }
66
+ if (!value && !baseUrl && !clearBaseUrl) {
67
+ return {
68
+ ok: false,
69
+ statusCode: 400,
70
+ error: "value or baseUrl is required",
71
+ };
34
72
  }
35
73
  if (raw.scope != null && raw.scope !== "user" && raw.scope !== "org") {
36
74
  return {
@@ -42,7 +80,9 @@ export function normalizeAgentEngineApiKeyPayload(body) {
42
80
  return {
43
81
  ok: true,
44
82
  key,
45
- value,
83
+ ...(value ? { value } : {}),
84
+ ...(baseUrl ? { baseUrl } : {}),
85
+ clearBaseUrl,
46
86
  scope: raw.scope === "org" ? "org" : "user",
47
87
  };
48
88
  }
@@ -89,15 +129,35 @@ export function createAgentEngineApiKeyHandler() {
89
129
  setResponseStatus(event, resolved.statusCode);
90
130
  return { error: resolved.error };
91
131
  }
92
- await writeAppSecret({
93
- key: payload.key,
94
- value: payload.value,
95
- scope: resolved.target.scope,
96
- scopeId: resolved.target.scopeId,
97
- });
132
+ if (payload.value) {
133
+ await writeAppSecret({
134
+ key: payload.key,
135
+ value: payload.value,
136
+ scope: resolved.target.scope,
137
+ scopeId: resolved.target.scopeId,
138
+ });
139
+ }
140
+ if (payload.baseUrl) {
141
+ await writeAppSecret({
142
+ key: OPENAI_BASE_URL_ENV_VAR,
143
+ value: payload.baseUrl,
144
+ scope: resolved.target.scope,
145
+ scopeId: resolved.target.scopeId,
146
+ });
147
+ }
148
+ else if (payload.clearBaseUrl) {
149
+ await deleteAppSecret({
150
+ key: OPENAI_BASE_URL_ENV_VAR,
151
+ scope: resolved.target.scope,
152
+ scopeId: resolved.target.scopeId,
153
+ });
154
+ }
98
155
  return {
99
156
  ok: true,
100
157
  key: payload.key,
158
+ ...(payload.baseUrl || payload.clearBaseUrl
159
+ ? { baseUrlKey: OPENAI_BASE_URL_ENV_VAR }
160
+ : {}),
101
161
  scope: resolved.target.scope,
102
162
  };
103
163
  });
@@ -1 +1 @@
1
- {"version":3,"file":"agent-engine-api-key-route.js","sourceRoot":"","sources":["../../src/server/agent-engine-api-key-route.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,iBAAiB,GAElB,MAAM,IAAI,CAAC;AAEZ,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,mBAAmB,GAAG,IAAI,GAAG,CACjC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IAC1D,QAAQ;IACR,IAAI,CAAC,MAAM;CACZ,CAAC,CACH,CAAC;AACF,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;AASpE,MAAM,UAAU,iCAAiC,CAAC,IAAa;IAQ7D,MAAM,OAAO,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,MAAM,GAAG,GAAG,OAMX,CAAC;IAEF,MAAM,GAAG,GACP,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ;QACzB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;QAChB,CAAC,CAAC,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAChC,CAAC,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;YACtD,CAAC,CAAC,EAAE,CAAC;IACX,IAAI,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO;YACL,EAAE,EAAE,KAAK;YACT,UAAU,EAAE,GAAG;YACf,KAAK,EAAE,wCAAwC;SAChD,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GACT,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;QAC3B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;QAClB,CAAC,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;YAC9B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;YACnB,CAAC,CAAC,EAAE,CAAC;IACX,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;IACpE,CAAC;IAED,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,MAAM,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QACrE,OAAO;YACL,EAAE,EAAE,KAAK;YACT,UAAU,EAAE,GAAG;YACf,KAAK,EAAE,+BAA+B;SACvC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,GAAG;QACH,KAAK;QACL,KAAK,EAAE,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mCAAmC,CACvD,KAAc,EACd,KAA6B;IAK7B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;IAC1E,CAAC;IAED,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE;SAClD,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IACzE,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACjD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,UAAU,EAAE,GAAG;YACf,KAAK,EAAE,6DAA6D;SACrE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE;KAC7C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC5C,OAAO,kBAAkB,CAAC,KAAK,EAAE,KAAc,EAAE,EAAE;QACjD,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,MAAM,EAAE,CAAC;YAChC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9B,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;QACzC,CAAC;QAED,MAAM,OAAO,GAAG,iCAAiC,CAC/C,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CACxC,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;YAC7C,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAClC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,mCAAmC,CACxD,KAAK,EACL,OAAO,CAAC,KAAK,CACd,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC9C,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnC,CAAC;QAED,MAAM,cAAc,CAAC;YACnB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK;YAC5B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO;SACjC,CAAC,CAAC;QAEH,OAAO;YACL,EAAE,EAAE,IAAI;YACR,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK;SAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n defineEventHandler,\n getMethod,\n setResponseStatus,\n type H3Event,\n} from \"h3\";\n\nimport { PROVIDER_ENV_META } from \"../agent/engine/provider-env-vars.js\";\nimport { getOrgContext } from \"../org/context.js\";\nimport { writeAppSecret } from \"../secrets/storage.js\";\nimport { getSession } from \"./auth.js\";\nimport { readBody } from \"./h3-helpers.js\";\n\nconst PROVIDER_TO_ENV_VAR = new Map(\n Object.entries(PROVIDER_ENV_META).map(([provider, meta]) => [\n provider,\n meta.envVar,\n ]),\n);\nconst PROVIDER_ENV_VAR_KEYS = new Set(PROVIDER_TO_ENV_VAR.values());\n\ntype AgentEngineApiKeyScope = \"user\" | \"org\";\n\nexport interface AgentEngineApiKeyWriteTarget {\n scope: AgentEngineApiKeyScope;\n scopeId: string;\n}\n\nexport function normalizeAgentEngineApiKeyPayload(body: unknown):\n | {\n ok: true;\n key: string;\n value: string;\n scope: AgentEngineApiKeyScope;\n }\n | { ok: false; statusCode: number; error: string } {\n const payload = body && typeof body === \"object\" ? body : {};\n const raw = payload as {\n key?: unknown;\n provider?: unknown;\n value?: unknown;\n apiKey?: unknown;\n scope?: unknown;\n };\n\n const key =\n typeof raw.key === \"string\"\n ? raw.key.trim()\n : typeof raw.provider === \"string\"\n ? (PROVIDER_TO_ENV_VAR.get(raw.provider.trim()) ?? \"\")\n : \"\";\n if (!key || !PROVIDER_ENV_VAR_KEYS.has(key)) {\n return {\n ok: false,\n statusCode: 400,\n error: \"Unsupported agent engine provider key.\",\n };\n }\n\n const value =\n typeof raw.value === \"string\"\n ? raw.value.trim()\n : typeof raw.apiKey === \"string\"\n ? raw.apiKey.trim()\n : \"\";\n if (!value) {\n return { ok: false, statusCode: 400, error: \"value is required\" };\n }\n\n if (raw.scope != null && raw.scope !== \"user\" && raw.scope !== \"org\") {\n return {\n ok: false,\n statusCode: 400,\n error: 'scope must be \"user\" or \"org\"',\n };\n }\n\n return {\n ok: true,\n key,\n value,\n scope: raw.scope === \"org\" ? \"org\" : \"user\",\n };\n}\n\nexport async function resolveAgentEngineApiKeyWriteTarget(\n event: H3Event,\n scope: AgentEngineApiKeyScope,\n): Promise<\n | { ok: true; target: AgentEngineApiKeyWriteTarget }\n | { ok: false; statusCode: number; error: string }\n> {\n const session = await getSession(event).catch(() => null);\n if (!session?.email) {\n return { ok: false, statusCode: 401, error: \"Authentication required\" };\n }\n\n if (scope === \"user\") {\n return {\n ok: true,\n target: { scope: \"user\", scopeId: session.email },\n };\n }\n\n const ctx = await getOrgContext(event).catch(() => null);\n if (!ctx?.orgId) {\n return { ok: false, statusCode: 400, error: \"No active organization\" };\n }\n if (ctx.role !== \"owner\" && ctx.role !== \"admin\") {\n return {\n ok: false,\n statusCode: 403,\n error: \"Only organization owners and admins can set org-scoped keys\",\n };\n }\n\n return {\n ok: true,\n target: { scope: \"org\", scopeId: ctx.orgId },\n };\n}\n\nexport function createAgentEngineApiKeyHandler() {\n return defineEventHandler(async (event: H3Event) => {\n if (getMethod(event) !== \"POST\") {\n setResponseStatus(event, 405);\n return { error: \"Method not allowed\" };\n }\n\n const payload = normalizeAgentEngineApiKeyPayload(\n await readBody(event).catch(() => ({})),\n );\n if (!payload.ok) {\n setResponseStatus(event, payload.statusCode);\n return { error: payload.error };\n }\n\n const resolved = await resolveAgentEngineApiKeyWriteTarget(\n event,\n payload.scope,\n );\n if (!resolved.ok) {\n setResponseStatus(event, resolved.statusCode);\n return { error: resolved.error };\n }\n\n await writeAppSecret({\n key: payload.key,\n value: payload.value,\n scope: resolved.target.scope,\n scopeId: resolved.target.scopeId,\n });\n\n return {\n ok: true,\n key: payload.key,\n scope: resolved.target.scope,\n };\n });\n}\n"]}
1
+ {"version":3,"file":"agent-engine-api-key-route.js","sourceRoot":"","sources":["../../src/server/agent-engine-api-key-route.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n defineEventHandler,\n getMethod,\n setResponseStatus,\n type H3Event,\n} from \"h3\";\n\nimport { normalizeOpenAiBaseUrl } from \"../agent/engine/openai-compatible-endpoint.js\";\nimport {\n OPENAI_BASE_URL_ENV_VAR,\n PROVIDER_ENV_META,\n} from \"../agent/engine/provider-env-vars.js\";\nimport { getOrgContext } from \"../org/context.js\";\nimport { deleteAppSecret, writeAppSecret } from \"../secrets/storage.js\";\nimport { getSession } from \"./auth.js\";\nimport { readBody } from \"./h3-helpers.js\";\n\nconst PROVIDER_TO_ENV_VAR = new Map(\n Object.entries(PROVIDER_ENV_META).map(([provider, meta]) => [\n provider,\n meta.envVar,\n ]),\n);\nconst PROVIDER_ENV_VAR_KEYS = new Set(PROVIDER_TO_ENV_VAR.values());\n\ntype AgentEngineApiKeyScope = \"user\" | \"org\";\n\nexport interface AgentEngineApiKeyWriteTarget {\n scope: AgentEngineApiKeyScope;\n scopeId: string;\n}\n\nexport function normalizeAgentEngineApiKeyPayload(body: unknown):\n | {\n ok: true;\n key: string;\n value?: string;\n baseUrl?: string;\n clearBaseUrl: boolean;\n scope: AgentEngineApiKeyScope;\n }\n | { ok: false; statusCode: number; error: string } {\n const payload = body && typeof body === \"object\" ? body : {};\n const raw = payload as {\n key?: unknown;\n provider?: unknown;\n value?: unknown;\n apiKey?: unknown;\n baseUrl?: unknown;\n endpointUrl?: unknown;\n clearBaseUrl?: unknown;\n scope?: unknown;\n };\n\n const key =\n typeof raw.key === \"string\"\n ? raw.key.trim()\n : typeof raw.provider === \"string\"\n ? (PROVIDER_TO_ENV_VAR.get(raw.provider.trim()) ?? \"\")\n : \"\";\n if (!key || !PROVIDER_ENV_VAR_KEYS.has(key)) {\n return {\n ok: false,\n statusCode: 400,\n error: \"Unsupported agent engine provider key.\",\n };\n }\n\n const value =\n typeof raw.value === \"string\"\n ? raw.value.trim()\n : typeof raw.apiKey === \"string\"\n ? raw.apiKey.trim()\n : \"\";\n\n const rawBaseUrl =\n typeof raw.baseUrl === \"string\"\n ? raw.baseUrl\n : typeof raw.endpointUrl === \"string\"\n ? raw.endpointUrl\n : \"\";\n let baseUrl: string | undefined;\n if (rawBaseUrl.trim()) {\n if (key !== PROVIDER_TO_ENV_VAR.get(\"openai\")) {\n return {\n ok: false,\n statusCode: 400,\n error: \"Endpoint URL is only supported for OpenAI.\",\n };\n }\n try {\n baseUrl = normalizeOpenAiBaseUrl(rawBaseUrl);\n } catch (err) {\n return {\n ok: false,\n statusCode: 400,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n const clearBaseUrl = raw.clearBaseUrl === true && baseUrl == null;\n if (clearBaseUrl && key !== PROVIDER_TO_ENV_VAR.get(\"openai\")) {\n return {\n ok: false,\n statusCode: 400,\n error: \"Endpoint URL is only supported for OpenAI.\",\n };\n }\n\n if (!value && !baseUrl && !clearBaseUrl) {\n return {\n ok: false,\n statusCode: 400,\n error: \"value or baseUrl is required\",\n };\n }\n\n if (raw.scope != null && raw.scope !== \"user\" && raw.scope !== \"org\") {\n return {\n ok: false,\n statusCode: 400,\n error: 'scope must be \"user\" or \"org\"',\n };\n }\n\n return {\n ok: true,\n key,\n ...(value ? { value } : {}),\n ...(baseUrl ? { baseUrl } : {}),\n clearBaseUrl,\n scope: raw.scope === \"org\" ? \"org\" : \"user\",\n };\n}\n\nexport async function resolveAgentEngineApiKeyWriteTarget(\n event: H3Event,\n scope: AgentEngineApiKeyScope,\n): Promise<\n | { ok: true; target: AgentEngineApiKeyWriteTarget }\n | { ok: false; statusCode: number; error: string }\n> {\n const session = await getSession(event).catch(() => null);\n if (!session?.email) {\n return { ok: false, statusCode: 401, error: \"Authentication required\" };\n }\n\n if (scope === \"user\") {\n return {\n ok: true,\n target: { scope: \"user\", scopeId: session.email },\n };\n }\n\n const ctx = await getOrgContext(event).catch(() => null);\n if (!ctx?.orgId) {\n return { ok: false, statusCode: 400, error: \"No active organization\" };\n }\n if (ctx.role !== \"owner\" && ctx.role !== \"admin\") {\n return {\n ok: false,\n statusCode: 403,\n error: \"Only organization owners and admins can set org-scoped keys\",\n };\n }\n\n return {\n ok: true,\n target: { scope: \"org\", scopeId: ctx.orgId },\n };\n}\n\nexport function createAgentEngineApiKeyHandler() {\n return defineEventHandler(async (event: H3Event) => {\n if (getMethod(event) !== \"POST\") {\n setResponseStatus(event, 405);\n return { error: \"Method not allowed\" };\n }\n\n const payload = normalizeAgentEngineApiKeyPayload(\n await readBody(event).catch(() => ({})),\n );\n if (!payload.ok) {\n setResponseStatus(event, payload.statusCode);\n return { error: payload.error };\n }\n\n const resolved = await resolveAgentEngineApiKeyWriteTarget(\n event,\n payload.scope,\n );\n if (!resolved.ok) {\n setResponseStatus(event, resolved.statusCode);\n return { error: resolved.error };\n }\n\n if (payload.value) {\n await writeAppSecret({\n key: payload.key,\n value: payload.value,\n scope: resolved.target.scope,\n scopeId: resolved.target.scopeId,\n });\n }\n\n if (payload.baseUrl) {\n await writeAppSecret({\n key: OPENAI_BASE_URL_ENV_VAR,\n value: payload.baseUrl,\n scope: resolved.target.scope,\n scopeId: resolved.target.scopeId,\n });\n } else if (payload.clearBaseUrl) {\n await deleteAppSecret({\n key: OPENAI_BASE_URL_ENV_VAR,\n scope: resolved.target.scope,\n scopeId: resolved.target.scopeId,\n });\n }\n\n return {\n ok: true,\n key: payload.key,\n ...(payload.baseUrl || payload.clearBaseUrl\n ? { baseUrlKey: OPENAI_BASE_URL_ENV_VAR }\n : {}),\n scope: resolved.target.scope,\n };\n });\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"core-routes-plugin.d.ts","sourceRoot":"","sources":["../../src/server/core-routes-plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core-routes-plugin.d.ts","sourceRoot":"","sources":["../../src/server/core-routes-plugin.ts"],"names":[],"mappings":"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"}