@pitcher/js-api 1.26.1 → 1.27.1

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 (58) hide show
  1. package/js-api.esm.d.ts +0 -1
  2. package/js-api.esm.js +141 -0
  3. package/js-api.esm.js.map +1 -1
  4. package/js-api.umd.min.js +17 -10
  5. package/js-api.umd.min.js.map +1 -1
  6. package/lib/apps/browser/appTypes.d.ts +2 -1
  7. package/lib/apps/browser/stores/api.d.ts +22 -2
  8. package/lib/apps/browser/stores/app.d.ts +6 -1
  9. package/lib/apps/browser/util/sortOrder.d.ts +36 -0
  10. package/lib/apps/browser/util/sortOrder.test.d.ts +1 -0
  11. package/lib/apps/canvas-builder/components/ui/DataCharts/types.d.ts +7 -1
  12. package/lib/apps/canvas-builder/components/ui/DataCharts/types.spec.d.ts +1 -0
  13. package/lib/apps/canvas-builder/components/ui/DynamicContent/useDynamicContent.d.ts +11 -1
  14. package/lib/apps/canvas-builder/composables/lazySections.d.ts +53 -0
  15. package/lib/apps/canvas-builder/composables/lazySections.spec.d.ts +1 -0
  16. package/lib/apps/canvas-builder/composables/useCanvas.d.ts +108 -14
  17. package/lib/apps/canvas-builder/composables/useCanvasBlocks.d.ts +4 -0
  18. package/lib/apps/canvas-builder/composables/useHtmlUserPropertyFields.d.ts +4 -0
  19. package/lib/apps/canvas-builder/courseMode.spec.d.ts +1 -0
  20. package/lib/apps/canvas-builder/types/canvas.d.ts +77 -2
  21. package/lib/apps/canvas-selector/stores/app.d.ts +14 -0
  22. package/lib/apps/collection-player/stores/app.store.d.ts +1 -0
  23. package/lib/components/savedCanvases/CSavedCanvasesManagement.use.d.ts +2 -0
  24. package/lib/components/savedCanvases/smartFolders/SmartFolders.use.d.ts +8 -0
  25. package/lib/composables/useCanvasRendererExcludedTags.d.ts +15 -0
  26. package/lib/composables/useCanvasRendererExcludedTags.spec.d.ts +1 -0
  27. package/lib/composables/useThemeVars.d.ts +2 -0
  28. package/lib/constants/cdp.const.d.ts +1 -0
  29. package/lib/main.lib.d.ts +5 -1
  30. package/lib/sdk/api/HighLevelApi.d.ts +17 -0
  31. package/lib/sdk/api/modules/ai.d.ts +52 -0
  32. package/lib/sdk/api/modules/canvas.d.ts +42 -1
  33. package/lib/sdk/api/modules/index.d.ts +1 -0
  34. package/lib/sdk/interfaces.d.ts +13 -1
  35. package/lib/sdk/main.d.ts +39 -0
  36. package/lib/sdk/payload.types.d.ts +121 -0
  37. package/lib/theme/light.d.ts +2 -0
  38. package/lib/theme/theme.types.d.ts +1 -0
  39. package/lib/types/ai-tasks.const.d.ts +80 -0
  40. package/lib/types/instanceSettings.types.d.ts +2 -0
  41. package/lib/types/launchDarkly.types.d.ts +16 -7
  42. package/lib/types/organizationSettings.types.d.ts +18 -0
  43. package/lib/util/fullscreen.util.d.ts +12 -1
  44. package/lib/util/handlebars.d.ts +19 -0
  45. package/lib/util/network.d.ts +21 -0
  46. package/lib/util/network.test.d.ts +1 -0
  47. package/lib/util/string.d.ts +13 -0
  48. package/package.json +1 -1
  49. package/types/openapi/index.d.ts +1 -0
  50. package/types/openapi/models/Canvas.d.ts +2 -2
  51. package/types/openapi/models/CanvasCreate.d.ts +2 -2
  52. package/types/openapi/models/CanvasRetrieve.d.ts +10 -2
  53. package/types/openapi/models/CanvasUpdate.d.ts +2 -2
  54. package/types/openapi/models/DeletedCanvas.d.ts +2 -2
  55. package/types/openapi/models/FolderFolder.d.ts +4 -0
  56. package/types/openapi/models/FolderRetrieve.d.ts +1 -0
  57. package/types/openapi/models/MetadataTemplateFieldTypeEnum.d.ts +3 -1
  58. package/types/openapi/models/MiniCanvasWithTags.d.ts +5 -0
package/js-api.esm.d.ts CHANGED
@@ -1,2 +1 @@
1
1
  export * from './lib/sdk/main.umd-esm'
2
- export {}
package/js-api.esm.js CHANGED
@@ -2380,6 +2380,124 @@ const index = /*#__PURE__*/_mergeNamespaces({
2380
2380
  default: pr
2381
2381
  }, [postRobotExports]);
2382
2382
 
2383
+ function resolvePiaSearchMode(config) {
2384
+ if (config?.mode === "off" || config?.mode === "on_device" || config?.mode === "online") return config.mode;
2385
+ return "off";
2386
+ }
2387
+
2388
+ const PIA_SEARCH_ROUTE = "/core/api/protected/pia-prepare/pia-search";
2389
+ const CAPABILITIES_TIMEOUT_MS = 3e3;
2390
+ const ON_DEVICE_MAX_TOKENS = 512;
2391
+ const WEB_CAPABILITIES = {
2392
+ available: true,
2393
+ offline: false,
2394
+ runtime: "bedrock-online"
2395
+ };
2396
+ function withTimeout(promise, ms, label) {
2397
+ return new Promise((resolve, reject) => {
2398
+ const timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms);
2399
+ promise.then(
2400
+ (value) => {
2401
+ clearTimeout(timer);
2402
+ resolve(value);
2403
+ },
2404
+ (error) => {
2405
+ clearTimeout(timer);
2406
+ reject(error);
2407
+ }
2408
+ );
2409
+ });
2410
+ }
2411
+ function normalizeOrigin(domain) {
2412
+ return domain.startsWith("http") ? domain : `https://${domain}`;
2413
+ }
2414
+ function apiOriginFromEnv(env) {
2415
+ const claimDomain = env?.pitcher?.token_claims?.["https://pitcher.com/claims/urls"]?.custom_domain;
2416
+ if (typeof claimDomain === "string" && claimDomain.length > 0) return normalizeOrigin(claimDomain);
2417
+ const orgDomain = env?.pitcher?.organization?.metadata?.custom_domain;
2418
+ if (typeof orgDomain === "string" && orgDomain.length > 0) return normalizeOrigin(orgDomain);
2419
+ throw new Error("piaSearchAnswer: no customer domain found in env (token_claims / organization metadata)");
2420
+ }
2421
+ function buildOnDevicePrompt(query, contextText) {
2422
+ const context = typeof contextText === "string" && contextText.trim().length > 0 ? contextText.trim() : "No content context was provided.";
2423
+ return `You are PIA, a sales content assistant. Answer the rep's question using ONLY the CONTEXT below — do not invent content that is not in it.
2424
+
2425
+ CONTEXT:
2426
+ ${context}
2427
+
2428
+ QUESTION: ${query}
2429
+
2430
+ Answer concisely in plain text. If the context does not contain the answer, say you could not find it in the available content.`;
2431
+ }
2432
+ async function aiGetCapabilities() {
2433
+ const env = await highLevelApi.API.request("get_env");
2434
+ if (env?.mode === "IOS") {
2435
+ return highLevelApi.API.request("ai.get_capabilities");
2436
+ }
2437
+ return { ...WEB_CAPABILITIES };
2438
+ }
2439
+ function aiComplete(payload) {
2440
+ if (!payload || typeof payload.prompt !== "string" || payload.prompt.trim() === "") {
2441
+ return Promise.reject(new Error("prompt is required and must be a non-empty string"));
2442
+ }
2443
+ return highLevelApi.API.request("ai.complete", payload);
2444
+ }
2445
+ async function piaSearchAnswer(payload) {
2446
+ if (!payload || typeof payload.query !== "string" || payload.query.trim() === "") {
2447
+ return Promise.reject(new Error("query is required and must be a non-empty string"));
2448
+ }
2449
+ const env = await highLevelApi.API.request("get_env");
2450
+ const mode = resolvePiaSearchMode(env?.launch_darkly?.pia_search_config);
2451
+ if (mode === "off") {
2452
+ throw new Error('pia_search_disabled: pia_search_config resolves to mode "off"');
2453
+ }
2454
+ if (mode === "on_device" && env?.mode === "IOS") {
2455
+ try {
2456
+ const capabilities = await withTimeout(
2457
+ highLevelApi.API.request("ai.get_capabilities"),
2458
+ CAPABILITIES_TIMEOUT_MS,
2459
+ "ai.get_capabilities"
2460
+ );
2461
+ if (capabilities?.available) {
2462
+ const completion = await aiComplete({
2463
+ prompt: buildOnDevicePrompt(payload.query, payload.context_text),
2464
+ max_tokens: payload.max_tokens ?? ON_DEVICE_MAX_TOKENS
2465
+ });
2466
+ return { answer: completion.text, source: "on_device" };
2467
+ }
2468
+ } catch (error) {
2469
+ console.warn("[piaSearchAnswer] on-device path unavailable, falling back to online:", error);
2470
+ }
2471
+ }
2472
+ const instanceId = payload.instance_id || env?.pitcher?.instance?.id;
2473
+ if (!instanceId) {
2474
+ throw new Error("piaSearchAnswer: instance_id could not be resolved from the payload or env");
2475
+ }
2476
+ const response = await fetch(`${apiOriginFromEnv(env)}${PIA_SEARCH_ROUTE}`, {
2477
+ method: "POST",
2478
+ headers: {
2479
+ "Content-Type": "application/json",
2480
+ Authorization: `Bearer ${env.pitcher.access_token}`
2481
+ },
2482
+ body: JSON.stringify({
2483
+ query: payload.query,
2484
+ instance_id: instanceId,
2485
+ ...Array.isArray(payload.file_ids) && payload.file_ids.length > 0 && { file_ids: payload.file_ids }
2486
+ })
2487
+ });
2488
+ if (!response.ok) {
2489
+ throw new Error(`pia_search ${response.status}`);
2490
+ }
2491
+ const data = await response.json();
2492
+ const output = data?.pia_search ?? {};
2493
+ return {
2494
+ answer: typeof output.answer === "string" ? output.answer : "",
2495
+ cited_file_ids: Array.isArray(output.cited_file_ids) ? output.cited_file_ids : [],
2496
+ ...output.confidence && { confidence: output.confidence },
2497
+ source: "online"
2498
+ };
2499
+ }
2500
+
2383
2501
  function open$2(payload = {}) {
2384
2502
  return this.API.request("open", payload);
2385
2503
  }
@@ -2428,6 +2546,9 @@ function updateCanvasIndicators(payload) {
2428
2546
  function getCanvas$1(payload) {
2429
2547
  return this.API.request("get_canvas", payload);
2430
2548
  }
2549
+ function getSectionsByIds(payload) {
2550
+ return this.API.request("get_canvas_sections_by_ids", payload);
2551
+ }
2431
2552
  function shareCanvas(payload) {
2432
2553
  return this.API.request("share_canvas", payload);
2433
2554
  }
@@ -3383,6 +3504,8 @@ function assignCanvasTheme(payload) {
3383
3504
 
3384
3505
  const modules = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
3385
3506
  __proto__: null,
3507
+ aiComplete,
3508
+ aiGetCapabilities,
3386
3509
  assignCanvasTheme,
3387
3510
  close: close$2,
3388
3511
  createCanvas: createCanvas$1,
@@ -3421,6 +3544,7 @@ const modules = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
3421
3544
  getFolders,
3422
3545
  getInstanceMetadataTemplates: getInstanceMetadataTemplates$1,
3423
3546
  getLanguages,
3547
+ getSectionsByIds,
3424
3548
  getThemes,
3425
3549
  getUsers: getUsers$1,
3426
3550
  isOffline,
@@ -3430,6 +3554,7 @@ const modules = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
3430
3554
  openExternalUrl,
3431
3555
  openWebViewAlwaysOnTop,
3432
3556
  patchCoreFolder,
3557
+ piaSearchAnswer,
3433
3558
  query,
3434
3559
  refreshAccessToken,
3435
3560
  refreshServiceToken,
@@ -3577,6 +3702,7 @@ var PitcherExternalEventName = /* @__PURE__ */ ((PitcherExternalEventName2) => {
3577
3702
  PitcherExternalEventName2["CREATE_AND_OPEN_CANVAS"] = "create_and_open_canvas";
3578
3703
  PitcherExternalEventName2["OPEN_CANVAS"] = "open_canvas";
3579
3704
  PitcherExternalEventName2["START_CALL"] = "start_call";
3705
+ PitcherExternalEventName2["SELECT_ACCOUNT"] = "select_account";
3580
3706
  return PitcherExternalEventName2;
3581
3707
  })(PitcherExternalEventName || {});
3582
3708
 
@@ -3907,6 +4033,20 @@ const onlineRestApiHandlers = {
3907
4033
  const res = await http.get(`/canvases/${params.id}`, { params: restParams });
3908
4034
  return res;
3909
4035
  },
4036
+ // Lazy section loading companion: batch-hydrate section bodies for a canvas
4037
+ // that was fetched as a shell (`?lazy_sections=true`). Hits the same Django
4038
+ // /api/v1 base as get_canvas. Returns { sections: CanvasSection[] }.
4039
+ get_canvas_sections_by_ids: async (params) => {
4040
+ check();
4041
+ const res = await http.post("/canvases/sections/by-ids", {
4042
+ canvas_id: params.canvas_id,
4043
+ section_ids: params.section_ids,
4044
+ ...params.exclude_drafts !== void 0 && { exclude_drafts: params.exclude_drafts },
4045
+ ...params.include_expired_files !== void 0 && { include_expired_files: params.include_expired_files },
4046
+ ...params.include_pending_files !== void 0 && { include_pending_files: params.include_pending_files }
4047
+ });
4048
+ return res;
4049
+ },
3910
4050
  create_canvas: async (params) => {
3911
4051
  check();
3912
4052
  const res = await http.post("/canvases", { ...params, instance_id: env.pitcher.instance.id });
@@ -4063,6 +4203,7 @@ class LowLevelApi extends EventEmitter {
4063
4203
  } else if (res.response.status === "error") {
4064
4204
  if (this.options.errorLogger) {
4065
4205
  this.options.errorLogger({
4206
+ type: res.request.type,
4066
4207
  message: `Pitcher JS API call failure: ${res.request.type}`,
4067
4208
  js_api_response: JSON.stringify(truncateObject(res, 3, TRUNCATE_LENGTH_TRIGGER))
4068
4209
  });