@burdenoff/microfe-theculturepost 2026.709.1 → 2026.713.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.
package/dist/index.d.ts CHANGED
@@ -1,3 +1,9 @@
1
1
  export * from './theculturepost';
2
2
  export * from './services/createSandboxAssistantTransport';
3
+ export { enTranslations } from './theculturepost/translations/en';
4
+ export { hiTranslations } from './theculturepost/translations/hi';
5
+ export { taTranslations } from './theculturepost/translations/ta';
6
+ export { zhTranslations } from './theculturepost/translations/zh';
7
+ export { esTranslations } from './theculturepost/translations/es';
8
+ export { arTranslations } from './theculturepost/translations/ar';
3
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AAKjC,cAAc,4CAA4C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AAKjC,cAAc,4CAA4C,CAAC;AAK3D,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC"}
package/dist/index.js CHANGED
@@ -7,4 +7,10 @@ import { tWithFallback as d } from "./theculturepost/utils/i18n.js";
7
7
  import { slugify as f } from "./theculturepost/utils/slug.js";
8
8
  import "./theculturepost/index.js";
9
9
  import { useSandboxAssistantTransport as p } from "./services/createSandboxAssistantTransport.js";
10
- export { t as TheCulturePostProvider, u as TheCulturePostRoot, r as cn, i as formatDate, a as formatDateTime, o as formatDuration, s as formatEnumLabel, c as formatNumber, l as formatRelativeTime, e as joinPath, f as slugify, d as tWithFallback, p as useSandboxAssistantTransport, n as useTheCulturePost };
10
+ import { enTranslations as m } from "./theculturepost/translations/en.js";
11
+ import { hiTranslations as h } from "./theculturepost/translations/hi.js";
12
+ import { taTranslations as g } from "./theculturepost/translations/ta.js";
13
+ import { zhTranslations as _ } from "./theculturepost/translations/zh.js";
14
+ import { esTranslations as v } from "./theculturepost/translations/es.js";
15
+ import { arTranslations as y } from "./theculturepost/translations/ar.js";
16
+ export { t as TheCulturePostProvider, u as TheCulturePostRoot, y as arTranslations, r as cn, m as enTranslations, v as esTranslations, i as formatDate, a as formatDateTime, o as formatDuration, s as formatEnumLabel, c as formatNumber, l as formatRelativeTime, h as hiTranslations, e as joinPath, f as slugify, d as tWithFallback, g as taTranslations, p as useSandboxAssistantTransport, n as useTheCulturePost, _ as zhTranslations };
@@ -1,10 +1,11 @@
1
1
  /**
2
- * TheCulturePost adapter for the shared fe-libs AssistantWidget.
2
+ * theculturepost adapter for the shared fe-libs AssistantWidget transport.
3
3
  *
4
- * The floating widget (fe-libs, Layer 1) is backend-agnostic — it calls an
5
- * injected `AssistantTransport`. This hook builds a transport that reuses the
6
- * existing sandbox `api-calls` agent: it provisions/reuses a sandbox, opens a
7
- * session, dispatches the prompt async, then polls for the streamed answer.
4
+ * The sandbox lifecycle + poll/stream loop now lives in
5
+ * `@burdenoff/fe-libs/shared/assistant` (one implementation for all products);
6
+ * this is a thin wrapper. The exported name/shape are unchanged so app-shell
7
+ * imports don't move. The public return type is a LOCALLY-declared structural
8
+ * mirror — never re-export fe-libs types (vite-plugin-dts path rewriting).
8
9
  */
9
10
  interface AssistantSendArgs {
10
11
  prompt: string;
@@ -15,12 +16,9 @@ export interface AssistantTransport {
15
16
  sendPrompt: (args: AssistantSendArgs) => Promise<{
16
17
  text: string;
17
18
  }>;
19
+ prewarm?: (level?: 'probe' | 'full') => void;
20
+ suspend?: () => void;
18
21
  }
19
- /**
20
- * Returns a memoized `AssistantTransport` wired to the TheCulturePost sandbox
21
- * `api-calls` agent. The sandbox + session are cached in refs so follow-up
22
- * turns reuse the warm environment for the lifetime of the host shell.
23
- */
24
22
  export declare function useSandboxAssistantTransport(): AssistantTransport;
25
23
  export {};
26
24
  //# sourceMappingURL=createSandboxAssistantTransport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createSandboxAssistantTransport.d.ts","sourceRoot":"","sources":["../../src/services/createSandboxAssistantTransport.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAsBH,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpE;AAqHD;;;;GAIG;AACH,wBAAgB,4BAA4B,IAAI,kBAAkB,CAsIjE"}
1
+ {"version":3,"file":"createSandboxAssistantTransport.d.ts","sourceRoot":"","sources":["../../src/services/createSandboxAssistantTransport.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,4BAA4B,IAAI,kBAAkB,CAMjE"}
@@ -1,126 +1,14 @@
1
- import { useTheCulturePost as e } from "../theculturepost/context/TheCulturePostContext.js";
2
- import "../theculturepost/context/index.js";
3
- import { createAssistantSandbox as t, createAssistantSession as n, extendAssistantSandboxTTL as r, findExistingSandbox as i, getAssistantMessages as a, sendAssistantPromptAsync as o, waitForAssistantServiceReady as s, waitForSandboxReady as c } from "./assistantApi.js";
4
- import { gatherPageContext as l } from "../utils/pageContext.js";
5
- import { useCallback as u, useMemo as d, useRef as f } from "react";
6
- import { useAuthToken as p } from "@burdenoff/fe-libs/shared/providers/shell";
1
+ import { gatherPageContext as e } from "../utils/pageContext.js";
2
+ import { useSandboxAssistantTransport as t } from "@burdenoff/fe-libs/shared/assistant";
7
3
  //#region src/services/createSandboxAssistantTransport.ts
8
- var m = "assistant", h = 18e4, g = 1500, _ = 3e4;
9
- function v(e) {
10
- try {
11
- let t = e === "workspaceId" ? "burdenoff-active-context-workspace" : "burdenoff-active-context-organization", n = localStorage.getItem(t);
12
- if (n) return n;
13
- let r = sessionStorage.getItem("bf-active-profile");
14
- if (!r) return "";
15
- let i = localStorage.getItem(`bf-p-${r}-context`);
16
- return i ? JSON.parse(i)[e] ?? "" : "";
17
- } catch {
18
- return "";
19
- }
20
- }
21
- function y() {
22
- return new URLSearchParams(window.location.search).get("workspace") ?? v("workspaceId");
23
- }
24
- function b() {
25
- return new URLSearchParams(window.location.search).get("org") ?? v("organizationId");
26
- }
27
- function x(e) {
28
- return e.info?.time?.created ?? 0;
29
- }
30
- function S(e) {
31
- return (e ?? []).filter((e) => e.type === "text" && typeof e.text == "string").map((e) => e.text?.trim() ?? "").filter(Boolean).join("\n");
32
- }
33
- function C(e) {
34
- return (e ?? []).filter((e) => e.type === "tool" && e.tool).map((e) => {
35
- let t = e.state?.status ?? "running", n = e.tool ?? "tool";
36
- return t === "completed" ? `Completed: ${n}` : t === "failed" ? `Failed: ${n}` : `Running: ${n}`;
4
+ function n() {
5
+ return t({
6
+ product: "theculturepost",
7
+ gatherPageContext: e,
8
+ enableCredits: !0
37
9
  });
38
10
  }
39
- function w(e, t) {
40
- let n = e.filter((e) => e.info?.role === "assistant" && x(e) >= t).sort((e, t) => x(e) - x(t));
41
- if (n.length === 0) return {
42
- content: "Thinking…",
43
- done: !1
44
- };
45
- let r = n[n.length - 1], i = S(r.parts), a = C(r.parts);
46
- return {
47
- content: [i, ...a].filter(Boolean).join("\n\n") || "Thinking…",
48
- done: !!r.info?.time?.completed && (!!i || a.length > 0)
49
- };
50
- }
51
- function T(e) {
52
- return e.replace(/(Authorization\s*:\s*Bearer\s+)[^\s\n]+/gi, "$1[REDACTED]").replace(/(X-Workspace-Authorization\s*:\s*Bearer\s+)[^\s\n]+/gi, "$1[REDACTED]").replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9._-]+\.[A-Za-z0-9._-]+\b/g, "[REDACTED_JWT]").replace(/\bsk-ant-[A-Za-z0-9-]+\b/g, "[REDACTED_API_KEY]");
53
- }
54
- function E(e) {
55
- let t = e instanceof Error ? e.message.toLowerCase() : String(e).toLowerCase();
56
- return t.includes("rate limit exceeded") || t.includes("unauthorized") || t.includes("k8s api error 401") ? !1 : [
57
- "sandbox not found",
58
- "sandbox is not running",
59
- "sandbox service not available yet",
60
- "sandbox failed",
61
- "sandbox startup timed out",
62
- "assistant service did not become healthy",
63
- "proxy error: 404",
64
- "proxy error: 502",
65
- "proxy error: 503"
66
- ].some((e) => t.includes(e));
67
- }
68
- function D() {
69
- let { getAccessToken: v, getWorkspaceToken: x, userId: S } = p(), { apiGatewayUrl: C } = e(), D = f(null), O = f(null), k = u(async (e, r) => {
70
- let a = D.current;
71
- if (!a) {
72
- if (a = await i(e, m, r, C), !a) {
73
- if (!v()) throw Error("API Calls mode requires an authenticated session. Please sign in again.");
74
- a = await t(e, m, r, C);
75
- }
76
- await c(a, e, r, C), await s(a, e, r, C), D.current = a;
77
- }
78
- let o = O.current;
79
- if (!o) {
80
- let t = await n(a, e, m, r, C);
81
- if (!t.sessionId) throw Error("Assistant session did not return an id");
82
- o = t.sessionId, O.current = o;
83
- }
84
- return {
85
- sandboxId: a,
86
- sessionId: o
87
- };
88
- }, [C, v]), A = u(async ({ prompt: e, onProgress: t, signal: n }) => {
89
- let i = y();
90
- if (!i) throw Error("The assistant needs an active workspace. Open a workspace and try again.");
91
- let s = {
92
- accessToken: v(),
93
- workspaceToken: x(),
94
- userId: S,
95
- organizationId: b()
96
- }, c = async (u) => {
97
- try {
98
- let { sandboxId: c, sessionId: u } = await k(i, s), d = Date.now();
99
- await o(c, i, u, e, m, l(), s, C);
100
- let f = Date.now() + h, p = Date.now(), v = w([], d);
101
- for (; Date.now() < f;) {
102
- if (n.aborted) throw Error("Cancelled");
103
- if (v = w(await a(c, i, u, s, C, 50), d), t(T(v.content)), v.done) break;
104
- Date.now() - p > _ && (await r(c, i, 600, s, C).catch(() => void 0), p = Date.now()), await new Promise((e) => setTimeout(e, g));
105
- }
106
- if (!v.done) throw Error("The assistant timed out while responding. Please try again.");
107
- return { text: T(v.content) };
108
- } catch (e) {
109
- if (u === 1 && E(e)) return D.current = null, O.current = null, c(2);
110
- throw e;
111
- }
112
- };
113
- return c(1);
114
- }, [
115
- C,
116
- k,
117
- v,
118
- x,
119
- S
120
- ]);
121
- return d(() => ({ sendPrompt: A }), [A]);
122
- }
123
11
  //#endregion
124
- export { D as useSandboxAssistantTransport };
12
+ export { n as useSandboxAssistantTransport };
125
13
 
126
14
  //# sourceMappingURL=createSandboxAssistantTransport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createSandboxAssistantTransport.js","names":[],"sources":["../../src/services/createSandboxAssistantTransport.ts"],"sourcesContent":["/**\n * TheCulturePost adapter for the shared fe-libs AssistantWidget.\n *\n * The floating widget (fe-libs, Layer 1) is backend-agnostic — it calls an\n * injected `AssistantTransport`. This hook builds a transport that reuses the\n * existing sandbox `api-calls` agent: it provisions/reuses a sandbox, opens a\n * session, dispatches the prompt async, then polls for the streamed answer.\n */\n\nimport { useCallback, useMemo, useRef } from 'react';\nimport { useAuthToken } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useTheCulturePost } from '#theculturepost/context';\nimport {\n createAssistantSandbox,\n createAssistantSession,\n extendAssistantSandboxTTL,\n findExistingSandbox,\n getAssistantMessages,\n sendAssistantPromptAsync,\n waitForAssistantServiceReady,\n waitForSandboxReady,\n} from './assistantApi';\nimport { gatherPageContext } from '#src/utils/pageContext';\nimport type {\n AssistantRawMessage,\n AssistantRawMessagePart,\n AssistantSandboxAuthContext,\n} from '#src/types/assistant';\n\ninterface AssistantSendArgs {\n prompt: string;\n onProgress: (partialText: string) => void;\n signal: AbortSignal;\n}\n\nexport interface AssistantTransport {\n sendPrompt: (args: AssistantSendArgs) => Promise<{ text: string }>;\n}\n\nconst MODE = 'assistant' as const;\nconst STREAM_BUDGET_MS = 180_000;\nconst POLL_INTERVAL_MS = 1500;\nconst TTL_EXTEND_INTERVAL_MS = 30_000;\n\nfunction getProfileContextValue(key: 'workspaceId' | 'organizationId'): string {\n try {\n const activeContextKey =\n key === 'workspaceId'\n ? 'burdenoff-active-context-workspace'\n : 'burdenoff-active-context-organization';\n const activeContextValue = localStorage.getItem(activeContextKey);\n if (activeContextValue) return activeContextValue;\n\n const activeProfileId = sessionStorage.getItem('bf-active-profile');\n if (!activeProfileId) return '';\n const raw = localStorage.getItem(`bf-p-${activeProfileId}-context`);\n if (!raw) return '';\n const context = JSON.parse(raw) as { workspaceId?: string; organizationId?: string };\n return context[key] ?? '';\n } catch {\n return '';\n }\n}\n\nfunction getWorkspaceId(): string {\n const params = new URLSearchParams(window.location.search);\n return params.get('workspace') ?? getProfileContextValue('workspaceId');\n}\n\nfunction getOrganizationId(): string {\n const params = new URLSearchParams(window.location.search);\n return params.get('org') ?? getProfileContextValue('organizationId');\n}\n\nfunction getRawMessageCreatedAt(message: AssistantRawMessage): number {\n return message.info?.time?.created ?? 0;\n}\n\nfunction getAssistantText(parts: AssistantRawMessage['parts']): string {\n return (parts ?? [])\n .filter(\n (part: AssistantRawMessagePart) => part.type === 'text' && typeof part.text === 'string'\n )\n .map((part: AssistantRawMessagePart) => part.text?.trim() ?? '')\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction getToolProgress(parts: AssistantRawMessage['parts']): string[] {\n return (parts ?? [])\n .filter((part: AssistantRawMessagePart) => part.type === 'tool' && part.tool)\n .map((part: AssistantRawMessagePart) => {\n const status = part.state?.status ?? 'running';\n const tool = part.tool ?? 'tool';\n if (status === 'completed') return `Completed: ${tool}`;\n if (status === 'failed') return `Failed: ${tool}`;\n return `Running: ${tool}`;\n });\n}\n\nfunction buildProgress(\n messages: AssistantRawMessage[],\n sinceMs: number\n): { content: string; done: boolean } {\n const relevant = messages\n .filter(\n (message) => message.info?.role === 'assistant' && getRawMessageCreatedAt(message) >= sinceMs\n )\n .sort((left, right) => getRawMessageCreatedAt(left) - getRawMessageCreatedAt(right));\n\n if (relevant.length === 0) return { content: 'Thinking…', done: false };\n\n const latest = relevant[relevant.length - 1]!;\n const text = getAssistantText(latest.parts);\n const toolProgress = getToolProgress(latest.parts);\n const content = [text, ...toolProgress].filter(Boolean).join('\\n\\n') || 'Thinking…';\n\n return {\n content,\n done: Boolean(latest.info?.time?.completed) && (Boolean(text) || toolProgress.length > 0),\n };\n}\n\nfunction sanitize(response: string): string {\n return response\n .replace(/(Authorization\\s*:\\s*Bearer\\s+)[^\\s\\n]+/gi, '$1[REDACTED]')\n .replace(/(X-Workspace-Authorization\\s*:\\s*Bearer\\s+)[^\\s\\n]+/gi, '$1[REDACTED]')\n .replace(/\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9._-]+\\.[A-Za-z0-9._-]+\\b/g, '[REDACTED_JWT]')\n .replace(/\\bsk-ant-[A-Za-z0-9-]+\\b/g, '[REDACTED_API_KEY]');\n}\n\nfunction isRecoverable(error: unknown): boolean {\n const message =\n error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();\n if (\n message.includes('rate limit exceeded') ||\n message.includes('unauthorized') ||\n message.includes('k8s api error 401')\n ) {\n return false;\n }\n return [\n 'sandbox not found',\n 'sandbox is not running',\n 'sandbox service not available yet',\n 'sandbox failed',\n 'sandbox startup timed out',\n 'assistant service did not become healthy',\n 'proxy error: 404',\n 'proxy error: 502',\n 'proxy error: 503',\n ].some((fragment) => message.includes(fragment));\n}\n\n/**\n * Returns a memoized `AssistantTransport` wired to the TheCulturePost sandbox\n * `api-calls` agent. The sandbox + session are cached in refs so follow-up\n * turns reuse the warm environment for the lifetime of the host shell.\n */\nexport function useSandboxAssistantTransport(): AssistantTransport {\n const { getAccessToken, getWorkspaceToken, userId } = useAuthToken();\n const { apiGatewayUrl } = useTheCulturePost();\n\n const sandboxIdRef = useRef<string | null>(null);\n const sessionIdRef = useRef<string | null>(null);\n\n const ensureRuntime = useCallback(\n async (\n workspaceId: string,\n authContext: AssistantSandboxAuthContext\n ): Promise<{ sandboxId: string; sessionId: string }> => {\n let sandboxId = sandboxIdRef.current;\n if (!sandboxId) {\n sandboxId = await findExistingSandbox(workspaceId, MODE, authContext, apiGatewayUrl);\n if (!sandboxId) {\n if (!getAccessToken()) {\n throw new Error(\n 'API Calls mode requires an authenticated session. Please sign in again.'\n );\n }\n sandboxId = await createAssistantSandbox(workspaceId, MODE, authContext, apiGatewayUrl);\n }\n await waitForSandboxReady(sandboxId, workspaceId, authContext, apiGatewayUrl);\n await waitForAssistantServiceReady(sandboxId, workspaceId, authContext, apiGatewayUrl);\n sandboxIdRef.current = sandboxId;\n }\n\n let sessionId = sessionIdRef.current;\n if (!sessionId) {\n const result = await createAssistantSession(\n sandboxId,\n workspaceId,\n MODE,\n authContext,\n apiGatewayUrl\n );\n if (!result.sessionId) {\n throw new Error('Assistant session did not return an id');\n }\n sessionId = result.sessionId;\n sessionIdRef.current = sessionId;\n }\n\n return { sandboxId, sessionId };\n },\n [apiGatewayUrl, getAccessToken]\n );\n\n const sendPrompt = useCallback(\n async ({ prompt, onProgress, signal }: AssistantSendArgs): Promise<{ text: string }> => {\n const workspaceId = getWorkspaceId();\n if (!workspaceId) {\n throw new Error('The assistant needs an active workspace. Open a workspace and try again.');\n }\n const authContext: AssistantSandboxAuthContext = {\n accessToken: getAccessToken(),\n workspaceToken: getWorkspaceToken(),\n userId,\n organizationId: getOrganizationId(),\n };\n\n const run = async (attempt: 1 | 2): Promise<{ text: string }> => {\n try {\n const { sandboxId, sessionId } = await ensureRuntime(workspaceId, authContext);\n\n const startedAt = Date.now();\n await sendAssistantPromptAsync(\n sandboxId,\n workspaceId,\n sessionId,\n prompt,\n MODE,\n gatherPageContext(),\n authContext,\n apiGatewayUrl\n );\n\n const timeoutAt = Date.now() + STREAM_BUDGET_MS;\n let lastTtlExtensionAt = Date.now();\n let progress = buildProgress([], startedAt);\n\n while (Date.now() < timeoutAt) {\n if (signal.aborted) throw new Error('Cancelled');\n\n const messages = await getAssistantMessages(\n sandboxId,\n workspaceId,\n sessionId,\n authContext,\n apiGatewayUrl,\n 50\n );\n progress = buildProgress(messages, startedAt);\n onProgress(sanitize(progress.content));\n if (progress.done) break;\n\n if (Date.now() - lastTtlExtensionAt > TTL_EXTEND_INTERVAL_MS) {\n await extendAssistantSandboxTTL(\n sandboxId,\n workspaceId,\n 600,\n authContext,\n apiGatewayUrl\n ).catch(() => undefined);\n lastTtlExtensionAt = Date.now();\n }\n\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n\n if (!progress.done) {\n throw new Error('The assistant timed out while responding. Please try again.');\n }\n\n return { text: sanitize(progress.content) };\n } catch (error) {\n // A stale/expired sandbox or session is recoverable — drop the warm\n // refs and retry once from a clean runtime.\n if (attempt === 1 && isRecoverable(error)) {\n sandboxIdRef.current = null;\n sessionIdRef.current = null;\n return run(2);\n }\n throw error;\n }\n };\n\n return run(1);\n },\n [apiGatewayUrl, ensureRuntime, getAccessToken, getWorkspaceToken, userId]\n );\n\n return useMemo<AssistantTransport>(() => ({ sendPrompt }), [sendPrompt]);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"createSandboxAssistantTransport.js","names":[],"sources":["../../src/services/createSandboxAssistantTransport.ts"],"sourcesContent":["/**\n * theculturepost adapter for the shared fe-libs AssistantWidget transport.\n *\n * The sandbox lifecycle + poll/stream loop now lives in\n * `@burdenoff/fe-libs/shared/assistant` (one implementation for all products);\n * this is a thin wrapper. The exported name/shape are unchanged so app-shell\n * imports don't move. The public return type is a LOCALLY-declared structural\n * mirror — never re-export fe-libs types (vite-plugin-dts path rewriting).\n */\n\nimport { useSandboxAssistantTransport as useSharedTransport } from '@burdenoff/fe-libs/shared/assistant';\nimport { gatherPageContext } from '#src/utils/pageContext';\n\ninterface AssistantSendArgs {\n prompt: string;\n onProgress: (partialText: string) => void;\n signal: AbortSignal;\n}\n\nexport interface AssistantTransport {\n sendPrompt: (args: AssistantSendArgs) => Promise<{ text: string }>;\n prewarm?: (level?: 'probe' | 'full') => void;\n suspend?: () => void;\n}\n\nexport function useSandboxAssistantTransport(): AssistantTransport {\n return useSharedTransport({\n product: 'theculturepost',\n gatherPageContext: gatherPageContext,\n enableCredits: true,\n });\n}\n"],"mappings":";;;AAyBA,SAAgB,IAAmD;AACjE,QAAO,EAAmB;EACxB,SAAS;EACU;EACnB,eAAe;EAChB,CAAC"}
@@ -0,0 +1,54 @@
1
+ //#region src/theculturepost/translations/ar.ts
2
+ var e = {
3
+ nav: {
4
+ home: "الرئيسية",
5
+ overview: "نظرة عامة",
6
+ stories: "القصص",
7
+ topics: "المواضيع",
8
+ timeline: "الخط الزمني",
9
+ discussions: "المناقشات",
10
+ archive: "الأرشيف"
11
+ },
12
+ stories: {
13
+ title: "القصص",
14
+ description: "مقالات ودراسات وشروحات وقصص مصورة وخطوط زمنية — عبر دورة النشر الكاملة.",
15
+ newStory: "قصة جديدة",
16
+ noStories: "لا توجد قصص بعد",
17
+ filterStatus: "تصفية حسب الحالة",
18
+ filterTopic: "تصفية حسب الموضوع"
19
+ },
20
+ topics: {
21
+ title: "المواضيع",
22
+ description: "مواضيع مختارة تغطي الثقافة والدين والتاريخ والتراث والفكر.",
23
+ newTopic: "موضوع جديد",
24
+ noTopics: "لا توجد مواضيع بعد"
25
+ },
26
+ discussions: {
27
+ title: "المناقشات",
28
+ description: "محادثات محترمة وmoderated — بما في ذلك مساحات بين الأديان ترحب بالعديد من التقاليد.",
29
+ openDiscussion: "فتح مناقشة",
30
+ noDiscussions: "لا توجد مناقشات مفتوحة"
31
+ },
32
+ archive: {
33
+ title: "الأرشيف",
34
+ description: "أرشيف حي من المخطوطات والصور والتسجيلات والخرائط والأشياء — مجمعة في مجموعات.",
35
+ newCollection: "مجموعة جديدة",
36
+ newArtifact: "إضافة قطعة",
37
+ newRecording: "تسجيل",
38
+ noCollections: "لا توجد مجموعات بعد"
39
+ },
40
+ common: {
41
+ loading: "جارٍ التحميل…",
42
+ error: "حدث خطأ",
43
+ retry: "إعادة المحاولة",
44
+ save: "حفظ",
45
+ cancel: "إلغاء",
46
+ edit: "تعديل",
47
+ share: "مشاركة",
48
+ back: "رجوع"
49
+ }
50
+ };
51
+ //#endregion
52
+ export { e as arTranslations };
53
+
54
+ //# sourceMappingURL=ar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar.js","names":[],"sources":["../../../src/theculturepost/translations/ar.ts"],"sourcesContent":["export const arTranslations = {\n nav: {\n home: 'الرئيسية',\n overview: 'نظرة عامة',\n stories: 'القصص',\n topics: 'المواضيع',\n timeline: 'الخط الزمني',\n discussions: 'المناقشات',\n archive: 'الأرشيف',\n },\n stories: {\n title: 'القصص',\n description: 'مقالات ودراسات وشروحات وقصص مصورة وخطوط زمنية — عبر دورة النشر الكاملة.',\n newStory: 'قصة جديدة',\n noStories: 'لا توجد قصص بعد',\n filterStatus: 'تصفية حسب الحالة',\n filterTopic: 'تصفية حسب الموضوع',\n },\n topics: {\n title: 'المواضيع',\n description: 'مواضيع مختارة تغطي الثقافة والدين والتاريخ والتراث والفكر.',\n newTopic: 'موضوع جديد',\n noTopics: 'لا توجد مواضيع بعد',\n },\n discussions: {\n title: 'المناقشات',\n description:\n 'محادثات محترمة وmoderated — بما في ذلك مساحات بين الأديان ترحب بالعديد من التقاليد.',\n openDiscussion: 'فتح مناقشة',\n noDiscussions: 'لا توجد مناقشات مفتوحة',\n },\n archive: {\n title: 'الأرشيف',\n description: 'أرشيف حي من المخطوطات والصور والتسجيلات والخرائط والأشياء — مجمعة في مجموعات.',\n newCollection: 'مجموعة جديدة',\n newArtifact: 'إضافة قطعة',\n newRecording: 'تسجيل',\n noCollections: 'لا توجد مجموعات بعد',\n },\n common: {\n loading: 'جارٍ التحميل…',\n error: 'حدث خطأ',\n retry: 'إعادة المحاولة',\n save: 'حفظ',\n cancel: 'إلغاء',\n edit: 'تعديل',\n share: 'مشاركة',\n back: 'رجوع',\n },\n};\n"],"mappings":";AAAA,IAAa,IAAiB;CAC5B,KAAK;EACH,MAAM;EACN,UAAU;EACV,SAAS;EACT,QAAQ;EACR,UAAU;EACV,aAAa;EACb,SAAS;EACV;CACD,SAAS;EACP,OAAO;EACP,aAAa;EACb,UAAU;EACV,WAAW;EACX,cAAc;EACd,aAAa;EACd;CACD,QAAQ;EACN,OAAO;EACP,aAAa;EACb,UAAU;EACV,UAAU;EACX;CACD,aAAa;EACX,OAAO;EACP,aACE;EACF,gBAAgB;EAChB,eAAe;EAChB;CACD,SAAS;EACP,OAAO;EACP,aAAa;EACb,eAAe;EACf,aAAa;EACb,cAAc;EACd,eAAe;EAChB;CACD,QAAQ;EACN,SAAS;EACT,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,MAAM;EACN,OAAO;EACP,MAAM;EACP;CACF"}
@@ -0,0 +1,54 @@
1
+ //#region src/theculturepost/translations/en.ts
2
+ var e = {
3
+ nav: {
4
+ home: "Home",
5
+ overview: "Overview",
6
+ stories: "Stories",
7
+ topics: "Topics",
8
+ timeline: "Timeline",
9
+ discussions: "Discussions",
10
+ archive: "Archive"
11
+ },
12
+ stories: {
13
+ title: "Stories",
14
+ description: "Articles, essays, explainers, photo stories and timelines — across the full editorial lifecycle.",
15
+ newStory: "New story",
16
+ noStories: "No stories yet",
17
+ filterStatus: "Filter by status",
18
+ filterTopic: "Filter by topic"
19
+ },
20
+ topics: {
21
+ title: "Topics",
22
+ description: "Curated subjects spanning culture, faith, history, heritage and thought.",
23
+ newTopic: "New topic",
24
+ noTopics: "No topics yet"
25
+ },
26
+ discussions: {
27
+ title: "Discussions",
28
+ description: "Respectful, moderated conversations — including interfaith spaces that welcome many traditions.",
29
+ openDiscussion: "Open discussion",
30
+ noDiscussions: "No open discussions"
31
+ },
32
+ archive: {
33
+ title: "Archive",
34
+ description: "A living archive of manuscripts, photographs, recordings, maps and objects — grouped into collections.",
35
+ newCollection: "New collection",
36
+ newArtifact: "Add artifact",
37
+ newRecording: "Record",
38
+ noCollections: "No collections yet"
39
+ },
40
+ common: {
41
+ loading: "Loading…",
42
+ error: "An error occurred",
43
+ retry: "Retry",
44
+ save: "Save",
45
+ cancel: "Cancel",
46
+ edit: "Edit",
47
+ share: "Share",
48
+ back: "Back"
49
+ }
50
+ };
51
+ //#endregion
52
+ export { e as enTranslations };
53
+
54
+ //# sourceMappingURL=en.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.js","names":[],"sources":["../../../src/theculturepost/translations/en.ts"],"sourcesContent":["export const enTranslations = {\n nav: {\n home: 'Home',\n overview: 'Overview',\n stories: 'Stories',\n topics: 'Topics',\n timeline: 'Timeline',\n discussions: 'Discussions',\n archive: 'Archive',\n },\n stories: {\n title: 'Stories',\n description:\n 'Articles, essays, explainers, photo stories and timelines — across the full editorial lifecycle.',\n newStory: 'New story',\n noStories: 'No stories yet',\n filterStatus: 'Filter by status',\n filterTopic: 'Filter by topic',\n },\n topics: {\n title: 'Topics',\n description: 'Curated subjects spanning culture, faith, history, heritage and thought.',\n newTopic: 'New topic',\n noTopics: 'No topics yet',\n },\n discussions: {\n title: 'Discussions',\n description:\n 'Respectful, moderated conversations — including interfaith spaces that welcome many traditions.',\n openDiscussion: 'Open discussion',\n noDiscussions: 'No open discussions',\n },\n archive: {\n title: 'Archive',\n description:\n 'A living archive of manuscripts, photographs, recordings, maps and objects — grouped into collections.',\n newCollection: 'New collection',\n newArtifact: 'Add artifact',\n newRecording: 'Record',\n noCollections: 'No collections yet',\n },\n common: {\n loading: 'Loading…',\n error: 'An error occurred',\n retry: 'Retry',\n save: 'Save',\n cancel: 'Cancel',\n edit: 'Edit',\n share: 'Share',\n back: 'Back',\n },\n};\n"],"mappings":";AAAA,IAAa,IAAiB;CAC5B,KAAK;EACH,MAAM;EACN,UAAU;EACV,SAAS;EACT,QAAQ;EACR,UAAU;EACV,aAAa;EACb,SAAS;EACV;CACD,SAAS;EACP,OAAO;EACP,aACE;EACF,UAAU;EACV,WAAW;EACX,cAAc;EACd,aAAa;EACd;CACD,QAAQ;EACN,OAAO;EACP,aAAa;EACb,UAAU;EACV,UAAU;EACX;CACD,aAAa;EACX,OAAO;EACP,aACE;EACF,gBAAgB;EAChB,eAAe;EAChB;CACD,SAAS;EACP,OAAO;EACP,aACE;EACF,eAAe;EACf,aAAa;EACb,cAAc;EACd,eAAe;EAChB;CACD,QAAQ;EACN,SAAS;EACT,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,MAAM;EACN,OAAO;EACP,MAAM;EACP;CACF"}
@@ -0,0 +1,54 @@
1
+ //#region src/theculturepost/translations/es.ts
2
+ var e = {
3
+ nav: {
4
+ home: "Inicio",
5
+ overview: "Resumen",
6
+ stories: "Historias",
7
+ topics: "Temas",
8
+ timeline: "Cronología",
9
+ discussions: "Discusiones",
10
+ archive: "Archivo"
11
+ },
12
+ stories: {
13
+ title: "Historias",
14
+ description: "Artículos, ensayos, explicaciones, reportajes fotográficos y cronologías — a lo largo de todo el ciclo editorial.",
15
+ newStory: "Nueva historia",
16
+ noStories: "Aún no hay historias",
17
+ filterStatus: "Filtrar por estado",
18
+ filterTopic: "Filtrar por tema"
19
+ },
20
+ topics: {
21
+ title: "Temas",
22
+ description: "Temas curados que abarcan cultura, fe, historia, patrimonio y pensamiento.",
23
+ newTopic: "Nuevo tema",
24
+ noTopics: "Aún no hay temas"
25
+ },
26
+ discussions: {
27
+ title: "Discusiones",
28
+ description: "Conversaciones respetuosas y moderadas, incluidos espacios interreligiosos que acogen muchas tradiciones.",
29
+ openDiscussion: "Abrir discusión",
30
+ noDiscussions: "No hay discusiones abiertas"
31
+ },
32
+ archive: {
33
+ title: "Archivo",
34
+ description: "Un archivo vivo de manuscritos, fotografías, grabaciones, mapas y objetos — agrupados en colecciones.",
35
+ newCollection: "Nueva colección",
36
+ newArtifact: "Añadir artefacto",
37
+ newRecording: "Grabar",
38
+ noCollections: "Aún no hay colecciones"
39
+ },
40
+ common: {
41
+ loading: "Cargando…",
42
+ error: "Se produjo un error",
43
+ retry: "Reintentar",
44
+ save: "Guardar",
45
+ cancel: "Cancelar",
46
+ edit: "Editar",
47
+ share: "Compartir",
48
+ back: "Atrás"
49
+ }
50
+ };
51
+ //#endregion
52
+ export { e as esTranslations };
53
+
54
+ //# sourceMappingURL=es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"es.js","names":[],"sources":["../../../src/theculturepost/translations/es.ts"],"sourcesContent":["export const esTranslations = {\n nav: {\n home: 'Inicio',\n overview: 'Resumen',\n stories: 'Historias',\n topics: 'Temas',\n timeline: 'Cronología',\n discussions: 'Discusiones',\n archive: 'Archivo',\n },\n stories: {\n title: 'Historias',\n description:\n 'Artículos, ensayos, explicaciones, reportajes fotográficos y cronologías — a lo largo de todo el ciclo editorial.',\n newStory: 'Nueva historia',\n noStories: 'Aún no hay historias',\n filterStatus: 'Filtrar por estado',\n filterTopic: 'Filtrar por tema',\n },\n topics: {\n title: 'Temas',\n description: 'Temas curados que abarcan cultura, fe, historia, patrimonio y pensamiento.',\n newTopic: 'Nuevo tema',\n noTopics: 'Aún no hay temas',\n },\n discussions: {\n title: 'Discusiones',\n description:\n 'Conversaciones respetuosas y moderadas, incluidos espacios interreligiosos que acogen muchas tradiciones.',\n openDiscussion: 'Abrir discusión',\n noDiscussions: 'No hay discusiones abiertas',\n },\n archive: {\n title: 'Archivo',\n description:\n 'Un archivo vivo de manuscritos, fotografías, grabaciones, mapas y objetos — agrupados en colecciones.',\n newCollection: 'Nueva colección',\n newArtifact: 'Añadir artefacto',\n newRecording: 'Grabar',\n noCollections: 'Aún no hay colecciones',\n },\n common: {\n loading: 'Cargando…',\n error: 'Se produjo un error',\n retry: 'Reintentar',\n save: 'Guardar',\n cancel: 'Cancelar',\n edit: 'Editar',\n share: 'Compartir',\n back: 'Atrás',\n },\n};\n"],"mappings":";AAAA,IAAa,IAAiB;CAC5B,KAAK;EACH,MAAM;EACN,UAAU;EACV,SAAS;EACT,QAAQ;EACR,UAAU;EACV,aAAa;EACb,SAAS;EACV;CACD,SAAS;EACP,OAAO;EACP,aACE;EACF,UAAU;EACV,WAAW;EACX,cAAc;EACd,aAAa;EACd;CACD,QAAQ;EACN,OAAO;EACP,aAAa;EACb,UAAU;EACV,UAAU;EACX;CACD,aAAa;EACX,OAAO;EACP,aACE;EACF,gBAAgB;EAChB,eAAe;EAChB;CACD,SAAS;EACP,OAAO;EACP,aACE;EACF,eAAe;EACf,aAAa;EACb,cAAc;EACd,eAAe;EAChB;CACD,QAAQ;EACN,SAAS;EACT,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,MAAM;EACN,OAAO;EACP,MAAM;EACP;CACF"}
@@ -0,0 +1,54 @@
1
+ //#region src/theculturepost/translations/hi.ts
2
+ var e = {
3
+ nav: {
4
+ home: "होम",
5
+ overview: "अवलोकन",
6
+ stories: "कहानियाँ",
7
+ topics: "विषय",
8
+ timeline: "समयरेखा",
9
+ discussions: "चर्चाएँ",
10
+ archive: "पुरालेख"
11
+ },
12
+ stories: {
13
+ title: "कहानियाँ",
14
+ description: "लेख, निबंध, स्पष्टीकरण, फोटो कहानियाँ और समयरेखाएँ — पूर्ण संपादकीय जीवनचक्र में।",
15
+ newStory: "नई कहानी",
16
+ noStories: "अभी तक कोई कहानी नहीं",
17
+ filterStatus: "स्थिति के अनुसार फ़िल्टर करें",
18
+ filterTopic: "विषय के अनुसार फ़िल्टर करें"
19
+ },
20
+ topics: {
21
+ title: "विषय",
22
+ description: "संस्कृति, धर्म, इतिहास, विरासत और विचार पर क्यूरेट किए गए विषय।",
23
+ newTopic: "नया विषय",
24
+ noTopics: "अभी तक कोई विषय नहीं"
25
+ },
26
+ discussions: {
27
+ title: "चर्चाएँ",
28
+ description: "सम्मानजनक, मॉडरेट की गई बातचीत — जिसमें अंतरधर्मी स्थान भी शामिल हैं।",
29
+ openDiscussion: "चर्चा खोलें",
30
+ noDiscussions: "कोई खुली चर्चा नहीं"
31
+ },
32
+ archive: {
33
+ title: "पुरालेख",
34
+ description: "हस्तलेख, फोटोग्राफ, रिकॉर्डिंग, मानचित्र और वस्तुओं का जीवंत संग्रह — संग्रहों में समूहबद्ध।",
35
+ newCollection: "नया संग्रह",
36
+ newArtifact: "वस्तु जोड़ें",
37
+ newRecording: "रिकॉर्ड करें",
38
+ noCollections: "अभी तक कोई संग्रह नहीं"
39
+ },
40
+ common: {
41
+ loading: "लोड हो रहा है…",
42
+ error: "एक त्रुटि हुई",
43
+ retry: "पुनः प्रयास करें",
44
+ save: "सहेजें",
45
+ cancel: "रद्द करें",
46
+ edit: "संपादित करें",
47
+ share: "साझा करें",
48
+ back: "पीछे"
49
+ }
50
+ };
51
+ //#endregion
52
+ export { e as hiTranslations };
53
+
54
+ //# sourceMappingURL=hi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hi.js","names":[],"sources":["../../../src/theculturepost/translations/hi.ts"],"sourcesContent":["export const hiTranslations = {\n nav: {\n home: 'होम',\n overview: 'अवलोकन',\n stories: 'कहानियाँ',\n topics: 'विषय',\n timeline: 'समयरेखा',\n discussions: 'चर्चाएँ',\n archive: 'पुरालेख',\n },\n stories: {\n title: 'कहानियाँ',\n description:\n 'लेख, निबंध, स्पष्टीकरण, फोटो कहानियाँ और समयरेखाएँ — पूर्ण संपादकीय जीवनचक्र में।',\n newStory: 'नई कहानी',\n noStories: 'अभी तक कोई कहानी नहीं',\n filterStatus: 'स्थिति के अनुसार फ़िल्टर करें',\n filterTopic: 'विषय के अनुसार फ़िल्टर करें',\n },\n topics: {\n title: 'विषय',\n description: 'संस्कृति, धर्म, इतिहास, विरासत और विचार पर क्यूरेट किए गए विषय।',\n newTopic: 'नया विषय',\n noTopics: 'अभी तक कोई विषय नहीं',\n },\n discussions: {\n title: 'चर्चाएँ',\n description: 'सम्मानजनक, मॉडरेट की गई बातचीत — जिसमें अंतरधर्मी स्थान भी शामिल हैं।',\n openDiscussion: 'चर्चा खोलें',\n noDiscussions: 'कोई खुली चर्चा नहीं',\n },\n archive: {\n title: 'पुरालेख',\n description:\n 'हस्तलेख, फोटोग्राफ, रिकॉर्डिंग, मानचित्र और वस्तुओं का जीवंत संग्रह — संग्रहों में समूहबद्ध।',\n newCollection: 'नया संग्रह',\n newArtifact: 'वस्तु जोड़ें',\n newRecording: 'रिकॉर्ड करें',\n noCollections: 'अभी तक कोई संग्रह नहीं',\n },\n common: {\n loading: 'लोड हो रहा है…',\n error: 'एक त्रुटि हुई',\n retry: 'पुनः प्रयास करें',\n save: 'सहेजें',\n cancel: 'रद्द करें',\n edit: 'संपादित करें',\n share: 'साझा करें',\n back: 'पीछे',\n },\n};\n"],"mappings":";AAAA,IAAa,IAAiB;CAC5B,KAAK;EACH,MAAM;EACN,UAAU;EACV,SAAS;EACT,QAAQ;EACR,UAAU;EACV,aAAa;EACb,SAAS;EACV;CACD,SAAS;EACP,OAAO;EACP,aACE;EACF,UAAU;EACV,WAAW;EACX,cAAc;EACd,aAAa;EACd;CACD,QAAQ;EACN,OAAO;EACP,aAAa;EACb,UAAU;EACV,UAAU;EACX;CACD,aAAa;EACX,OAAO;EACP,aAAa;EACb,gBAAgB;EAChB,eAAe;EAChB;CACD,SAAS;EACP,OAAO;EACP,aACE;EACF,eAAe;EACf,aAAa;EACb,cAAc;EACd,eAAe;EAChB;CACD,QAAQ;EACN,SAAS;EACT,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,MAAM;EACN,OAAO;EACP,MAAM;EACP;CACF"}
@@ -0,0 +1,54 @@
1
+ //#region src/theculturepost/translations/ta.ts
2
+ var e = {
3
+ nav: {
4
+ home: "முகப்பு",
5
+ overview: "கண்ணோட்டம்",
6
+ stories: "கதைகள்",
7
+ topics: "தலைப்புகள்",
8
+ timeline: "காலவரிசை",
9
+ discussions: "விவாதங்கள்",
10
+ archive: "காப்பகம்"
11
+ },
12
+ stories: {
13
+ title: "கதைகள்",
14
+ description: "கட்டுரைகள், கட்டுரைகள், விளக்கங்கள், புகைப்படக் கதைகள் மற்றும் காலவரிசைகள் — முழு ஆசிரியர் வாழ்க்கைச் சுழற்சியிலும்.",
15
+ newStory: "புதிய கதை",
16
+ noStories: "இன்னும் கதைகள் இல்லை",
17
+ filterStatus: "நிலையின்படி வடிகட்டு",
18
+ filterTopic: "தலைப்பின்படி வடிகட்டு"
19
+ },
20
+ topics: {
21
+ title: "தலைப்புகள்",
22
+ description: "கலாச்சாரம், மதம், வரலாறு, மரபு மற்றும் சிந்தனை ஆகியவற்றை உள்ளடக்கிய தேர்ந்தெடுக்கப்பட்ட தலைப்புகள்.",
23
+ newTopic: "புதிய தலைப்பு",
24
+ noTopics: "இன்னும் தலைப்புகள் இல்லை"
25
+ },
26
+ discussions: {
27
+ title: "விவாதங்கள்",
28
+ description: "மரியாதையான, மதிப்பீடு செய்யப்பட்ட உரையாடல்கள் — பல மரபுகளை வரவேற்கும் இடமையமான இடங்களுடன்.",
29
+ openDiscussion: "விவாதத்தைத் திற",
30
+ noDiscussions: "திறந்த விவாதங்கள் இல்லை"
31
+ },
32
+ archive: {
33
+ title: "காப்பகம்",
34
+ description: "கையெழுத்துப் பிரதிகள், புகைப்படங்கள், பதிவுகள், வரைபடங்கள் மற்றும் பொருட்களின் வாழும் காப்பகம் — தொகுப்புகளாக வகைப்படுத்தப்பட்டுள்ளது.",
35
+ newCollection: "புதிய தொகுப்பு",
36
+ newArtifact: "பொருளைச் சேர்",
37
+ newRecording: "பதிவு செய்",
38
+ noCollections: "இன்னும் தொகுப்புகள் இல்லை"
39
+ },
40
+ common: {
41
+ loading: "ஏற்றுகிறது…",
42
+ error: "பிழை ஏற்பட்டது",
43
+ retry: "மீண்டும் முயற்சி",
44
+ save: "சேமி",
45
+ cancel: "ரத்து",
46
+ edit: "திருத்து",
47
+ share: "பகிர்",
48
+ back: "பின்"
49
+ }
50
+ };
51
+ //#endregion
52
+ export { e as taTranslations };
53
+
54
+ //# sourceMappingURL=ta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ta.js","names":[],"sources":["../../../src/theculturepost/translations/ta.ts"],"sourcesContent":["export const taTranslations = {\n nav: {\n home: 'முகப்பு',\n overview: 'கண்ணோட்டம்',\n stories: 'கதைகள்',\n topics: 'தலைப்புகள்',\n timeline: 'காலவரிசை',\n discussions: 'விவாதங்கள்',\n archive: 'காப்பகம்',\n },\n stories: {\n title: 'கதைகள்',\n description:\n 'கட்டுரைகள், கட்டுரைகள், விளக்கங்கள், புகைப்படக் கதைகள் மற்றும் காலவரிசைகள் — முழு ஆசிரியர் வாழ்க்கைச் சுழற்சியிலும்.',\n newStory: 'புதிய கதை',\n noStories: 'இன்னும் கதைகள் இல்லை',\n filterStatus: 'நிலையின்படி வடிகட்டு',\n filterTopic: 'தலைப்பின்படி வடிகட்டு',\n },\n topics: {\n title: 'தலைப்புகள்',\n description:\n 'கலாச்சாரம், மதம், வரலாறு, மரபு மற்றும் சிந்தனை ஆகியவற்றை உள்ளடக்கிய தேர்ந்தெடுக்கப்பட்ட தலைப்புகள்.',\n newTopic: 'புதிய தலைப்பு',\n noTopics: 'இன்னும் தலைப்புகள் இல்லை',\n },\n discussions: {\n title: 'விவாதங்கள்',\n description:\n 'மரியாதையான, மதிப்பீடு செய்யப்பட்ட உரையாடல்கள் — பல மரபுகளை வரவேற்கும் இடமையமான இடங்களுடன்.',\n openDiscussion: 'விவாதத்தைத் திற',\n noDiscussions: 'திறந்த விவாதங்கள் இல்லை',\n },\n archive: {\n title: 'காப்பகம்',\n description:\n 'கையெழுத்துப் பிரதிகள், புகைப்படங்கள், பதிவுகள், வரைபடங்கள் மற்றும் பொருட்களின் வாழும் காப்பகம் — தொகுப்புகளாக வகைப்படுத்தப்பட்டுள்ளது.',\n newCollection: 'புதிய தொகுப்பு',\n newArtifact: 'பொருளைச் சேர்',\n newRecording: 'பதிவு செய்',\n noCollections: 'இன்னும் தொகுப்புகள் இல்லை',\n },\n common: {\n loading: 'ஏற்றுகிறது…',\n error: 'பிழை ஏற்பட்டது',\n retry: 'மீண்டும் முயற்சி',\n save: 'சேமி',\n cancel: 'ரத்து',\n edit: 'திருத்து',\n share: 'பகிர்',\n back: 'பின்',\n },\n};\n"],"mappings":";AAAA,IAAa,IAAiB;CAC5B,KAAK;EACH,MAAM;EACN,UAAU;EACV,SAAS;EACT,QAAQ;EACR,UAAU;EACV,aAAa;EACb,SAAS;EACV;CACD,SAAS;EACP,OAAO;EACP,aACE;EACF,UAAU;EACV,WAAW;EACX,cAAc;EACd,aAAa;EACd;CACD,QAAQ;EACN,OAAO;EACP,aACE;EACF,UAAU;EACV,UAAU;EACX;CACD,aAAa;EACX,OAAO;EACP,aACE;EACF,gBAAgB;EAChB,eAAe;EAChB;CACD,SAAS;EACP,OAAO;EACP,aACE;EACF,eAAe;EACf,aAAa;EACb,cAAc;EACd,eAAe;EAChB;CACD,QAAQ;EACN,SAAS;EACT,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,MAAM;EACN,OAAO;EACP,MAAM;EACP;CACF"}
@@ -0,0 +1,54 @@
1
+ //#region src/theculturepost/translations/zh.ts
2
+ var e = {
3
+ nav: {
4
+ home: "首页",
5
+ overview: "概览",
6
+ stories: "故事",
7
+ topics: "主题",
8
+ timeline: "时间线",
9
+ discussions: "讨论",
10
+ archive: "档案"
11
+ },
12
+ stories: {
13
+ title: "故事",
14
+ description: "文章、散文、解释、照片故事和时间线——贯穿整个编辑生命周期。",
15
+ newStory: "新建故事",
16
+ noStories: "还没有故事",
17
+ filterStatus: "按状态筛选",
18
+ filterTopic: "按主题筛选"
19
+ },
20
+ topics: {
21
+ title: "主题",
22
+ description: "涵盖文化、宗教、历史、遗产和思想的精选主题。",
23
+ newTopic: "新建主题",
24
+ noTopics: "还没有主题"
25
+ },
26
+ discussions: {
27
+ title: "讨论",
28
+ description: "尊重、有节制的对话——包括欢迎多种传统的跨信仰空间。",
29
+ openDiscussion: "开启讨论",
30
+ noDiscussions: "没有开放的讨论"
31
+ },
32
+ archive: {
33
+ title: "档案",
34
+ description: "手稿、照片、录音、地图和物品的活档案——按收藏分组。",
35
+ newCollection: "新建收藏",
36
+ newArtifact: "添加物品",
37
+ newRecording: "录制",
38
+ noCollections: "还没有收藏"
39
+ },
40
+ common: {
41
+ loading: "加载中…",
42
+ error: "发生错误",
43
+ retry: "重试",
44
+ save: "保存",
45
+ cancel: "取消",
46
+ edit: "编辑",
47
+ share: "分享",
48
+ back: "返回"
49
+ }
50
+ };
51
+ //#endregion
52
+ export { e as zhTranslations };
53
+
54
+ //# sourceMappingURL=zh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zh.js","names":[],"sources":["../../../src/theculturepost/translations/zh.ts"],"sourcesContent":["export const zhTranslations = {\n nav: {\n home: '首页',\n overview: '概览',\n stories: '故事',\n topics: '主题',\n timeline: '时间线',\n discussions: '讨论',\n archive: '档案',\n },\n stories: {\n title: '故事',\n description: '文章、散文、解释、照片故事和时间线——贯穿整个编辑生命周期。',\n newStory: '新建故事',\n noStories: '还没有故事',\n filterStatus: '按状态筛选',\n filterTopic: '按主题筛选',\n },\n topics: {\n title: '主题',\n description: '涵盖文化、宗教、历史、遗产和思想的精选主题。',\n newTopic: '新建主题',\n noTopics: '还没有主题',\n },\n discussions: {\n title: '讨论',\n description: '尊重、有节制的对话——包括欢迎多种传统的跨信仰空间。',\n openDiscussion: '开启讨论',\n noDiscussions: '没有开放的讨论',\n },\n archive: {\n title: '档案',\n description: '手稿、照片、录音、地图和物品的活档案——按收藏分组。',\n newCollection: '新建收藏',\n newArtifact: '添加物品',\n newRecording: '录制',\n noCollections: '还没有收藏',\n },\n common: {\n loading: '加载中…',\n error: '发生错误',\n retry: '重试',\n save: '保存',\n cancel: '取消',\n edit: '编辑',\n share: '分享',\n back: '返回',\n },\n};\n"],"mappings":";AAAA,IAAa,IAAiB;CAC5B,KAAK;EACH,MAAM;EACN,UAAU;EACV,SAAS;EACT,QAAQ;EACR,UAAU;EACV,aAAa;EACb,SAAS;EACV;CACD,SAAS;EACP,OAAO;EACP,aAAa;EACb,UAAU;EACV,WAAW;EACX,cAAc;EACd,aAAa;EACd;CACD,QAAQ;EACN,OAAO;EACP,aAAa;EACb,UAAU;EACV,UAAU;EACX;CACD,aAAa;EACX,OAAO;EACP,aAAa;EACb,gBAAgB;EAChB,eAAe;EAChB;CACD,SAAS;EACP,OAAO;EACP,aAAa;EACb,eAAe;EACf,aAAa;EACb,cAAc;EACd,eAAe;EAChB;CACD,QAAQ;EACN,SAAS;EACT,OAAO;EACP,OAAO;EACP,MAAM;EACN,QAAQ;EACR,MAAM;EACN,OAAO;EACP,MAAM;EACP;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-theculturepost",
3
- "version": "2026.709.1",
3
+ "version": "2026.713.1",
4
4
  "description": "Burdenoff TheCulturePost Microfrontend",
5
5
  "type": "module",
6
6
  "files": [
@@ -67,7 +67,7 @@
67
67
  },
68
68
  "dependencies": {
69
69
  "@apollo/client": "^4.0.11",
70
- "@burdenoff/fe-libs": "2026.704.3",
70
+ "@burdenoff/fe-libs": "2026.713.6",
71
71
  "@tanstack/react-query": "^5.90.16",
72
72
  "clsx": "^2.1.1",
73
73
  "graphql": "^16.10.0",
@@ -1,15 +0,0 @@
1
- import { PageContext } from '../utils/pageContext';
2
- import { AssistantArtifact, AssistantMode, AssistantRawMessage, AssistantSandboxAuthContext } from '../types/assistant';
3
-
4
- export declare function findExistingSandbox(workspaceId: string, mode: AssistantMode, authContext?: AssistantSandboxAuthContext, baseUrl?: string): Promise<string | null>;
5
- export declare function createAssistantSandbox(workspaceId: string, mode: AssistantMode, authContext?: AssistantSandboxAuthContext, baseUrl?: string): Promise<string>;
6
- export declare function waitForSandboxReady(sandboxId: string, workspaceId: string, authContext?: AssistantSandboxAuthContext, baseUrl?: string, maxWaitMs?: number, onProgress?: (message: string) => void): Promise<void>;
7
- export declare function waitForAssistantServiceReady(sandboxId: string, workspaceId: string, authContext?: AssistantSandboxAuthContext, baseUrl?: string, maxWaitMs?: number, onProgress?: (message: string) => void): Promise<void>;
8
- export declare function createAssistantSession(sandboxId: string, workspaceId: string, mode: AssistantMode, authContext?: AssistantSandboxAuthContext, baseUrl?: string): Promise<{
9
- sessionId: string;
10
- }>;
11
- export declare function sendAssistantPromptAsync(sandboxId: string, workspaceId: string, sessionId: string, prompt: string, mode: AssistantMode, pageContext?: PageContext, authContext?: AssistantSandboxAuthContext, baseUrl?: string): Promise<void>;
12
- export declare function getAssistantMessages(sandboxId: string, workspaceId: string, sessionId: string, authContext?: AssistantSandboxAuthContext, baseUrl?: string, limit?: number): Promise<AssistantRawMessage[]>;
13
- export declare function extendAssistantSandboxTTL(sandboxId: string, workspaceId: string, additionalSeconds?: number, authContext?: AssistantSandboxAuthContext, baseUrl?: string): Promise<void>;
14
- export declare function getAssistantArtifacts(sandboxId: string, workspaceId: string, sessionId: string, authContext?: AssistantSandboxAuthContext, baseUrl?: string): Promise<AssistantArtifact[]>;
15
- //# sourceMappingURL=assistantApi.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assistantApi.d.ts","sourceRoot":"","sources":["../../src/services/assistantApi.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EAEb,mBAAmB,EACnB,2BAA2B,EAC5B,MAAM,sBAAsB,CAAC;AAgG9B,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,aAAa,EACnB,WAAW,CAAC,EAAE,2BAA2B,EACzC,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0CxB;AAED,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,aAAa,EACnB,WAAW,CAAC,EAAE,2BAA2B,EACzC,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,CAgEjB;AAED,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,2BAA2B,EACzC,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,SAAU,EACnB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,IAAI,CAAC,CAuCf;AAgDD,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,2BAA2B,EACzC,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,SAAS,EAClB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED,wBAAsB,sBAAsB,CAC1C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,aAAa,EACnB,WAAW,CAAC,EAAE,2BAA2B,EACzC,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAYhC;AAED,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,aAAa,EACnB,WAAW,CAAC,EAAE,WAAW,EACzB,WAAW,CAAC,EAAE,2BAA2B,EACzC,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,2BAA2B,EACzC,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,SAAK,GACT,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAWhC;AAED,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,iBAAiB,SAAM,EACvB,WAAW,CAAC,EAAE,2BAA2B,EACzC,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,2BAA2B,EACzC,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAa9B"}
@@ -1,204 +0,0 @@
1
- import { graphqlFetch as e } from "@burdenoff/fe-libs/shared/graphql";
2
- //#region src/services/assistantApi.ts
3
- var t = "burdenoffregistry.azurecr.io", n = "alpha-delegated-auth-v11", r = "sandbox-app-client-headers-v1";
4
- function i(e) {
5
- return `${t}/wspace/ai-assistant-api-calls:${n}`;
6
- }
7
- function a(e) {
8
- return n;
9
- }
10
- function o(e) {
11
- let t = e.metadata?.assistantMode;
12
- if (t === "assistant" || t === "api-calls") return "assistant";
13
- let n = e.name ?? "";
14
- return n.startsWith("ai-assistant-assistant-") || n.startsWith("ai-assistant-api-calls-") ? "assistant" : null;
15
- }
16
- function s(e) {
17
- return {
18
- cpuRequest: "150m",
19
- cpuLimit: "750m",
20
- memoryRequest: "384Mi",
21
- memoryLimit: "1536Mi"
22
- };
23
- }
24
- function c(e, t) {
25
- return {
26
- workspaceId: e,
27
- ...t?.organizationId ? { custom: { organizationId: t.organizationId } } : {}
28
- };
29
- }
30
- async function l(t) {
31
- let n = await e({
32
- gateway: "workspace",
33
- baseUrl: t.baseUrl,
34
- query: t.query,
35
- variables: t.variables,
36
- workspaceToken: !0
37
- });
38
- if (n.errors?.length) {
39
- let e = n.errors.map((e) => e.message).join(", "), t = Error(e);
40
- throw t.statusCode = 200, t.result = n, t;
41
- }
42
- if (!n.data) throw Error("Sandbox GraphQL returned no data");
43
- return n.data;
44
- }
45
- async function u(e, t, n, i) {
46
- return ((await l({
47
- query: "\n query GetActiveSandboxes($context: ContextInput!) {\n getActiveSandboxes(context: $context) {\n id\n name\n status\n metadata\n template\n createdBy\n }\n }\n ",
48
- variables: { context: c(e, n) },
49
- workspaceId: e,
50
- authContext: n,
51
- baseUrl: i
52
- })).getActiveSandboxes ?? []).find((e) => (e.status === "RUNNING" || e.status === "PROVISIONING" || e.status === "PENDING") && e.template === "AI_BUILDER" && o(e) === t && (!n?.userId || e.createdBy === n.userId) && e.metadata?.authStrategy === r && e.metadata?.imageTag === a(t))?.id ?? null;
53
- }
54
- async function d(e, t, n, o) {
55
- let u = s(t), d = [
56
- {
57
- name: "AI_ASSISTANT_MODE",
58
- value: t
59
- },
60
- {
61
- name: "HOSTNAME",
62
- value: "0.0.0.0"
63
- },
64
- {
65
- name: "WORKSPACE_ID",
66
- value: e
67
- },
68
- {
69
- name: "AI_ASSISTANT_PRODUCT",
70
- value: "theculturepost"
71
- }
72
- ], f = await l({
73
- query: "\n mutation CreateSandbox($input: CreateSandboxInput!) {\n createSandbox(input: $input) {\n id\n name\n status\n network {\n internalUrl\n }\n }\n }\n ",
74
- variables: { input: {
75
- name: `ai-assistant-${t}-${Date.now()}`,
76
- description: `AI Assistant sandbox (${t} mode)`,
77
- template: "AI_BUILDER",
78
- mode: "DEPLOYMENT",
79
- containers: [{
80
- name: "ai-assistant",
81
- image: i(t),
82
- ports: [{
83
- containerPort: 8080,
84
- name: "http"
85
- }],
86
- env: d
87
- }],
88
- resources: {
89
- cpuRequest: u.cpuRequest,
90
- cpuLimit: u.cpuLimit,
91
- memoryRequest: u.memoryRequest,
92
- memoryLimit: u.memoryLimit
93
- },
94
- ttlSeconds: 600,
95
- metadata: {
96
- assistantMode: t,
97
- assistantOwnerUserId: n?.userId ?? null,
98
- assistantOrganizationId: n?.organizationId ?? null,
99
- authStrategy: r,
100
- imageTag: a(t)
101
- },
102
- context: c(e, n)
103
- } },
104
- workspaceId: e,
105
- authContext: n,
106
- baseUrl: o
107
- });
108
- if (!f?.createSandbox?.id) throw Error("createSandbox returned empty response");
109
- return f.createSandbox.id;
110
- }
111
- async function f(e, t, n, r, i = 3e5, a) {
112
- let o = Date.now();
113
- for (; Date.now() - o < i;) {
114
- let i = await l({
115
- query: "\n query GetSandbox($id: ID!, $context: ContextInput!) {\n getSandbox(id: $id, context: $context) {\n id\n status\n errorMessage\n network {\n internalUrl\n }\n }\n }\n ",
116
- variables: {
117
- id: e,
118
- context: c(t, n)
119
- },
120
- workspaceId: t,
121
- authContext: n,
122
- baseUrl: r
123
- }), s = i?.getSandbox?.status, u = i?.getSandbox?.errorMessage;
124
- if (s === "RUNNING") return;
125
- if (s === "FAILED" || s === "STOPPED" || s === "EXPIRED") throw Error(u ? `Sandbox ${s.toLowerCase()}: ${u}` : `Sandbox ${s.toLowerCase()}`);
126
- let d = Math.max(1, Math.round((Date.now() - o) / 1e3));
127
- a?.(`Starting assistant environment... (${d}s)`), await new Promise((e) => setTimeout(e, 2e3));
128
- }
129
- throw Error("Sandbox startup timed out");
130
- }
131
- async function p(e, t, n, r, i, a, o) {
132
- let s = (await l({
133
- query: "\n mutation ProxySandboxRequest($input: ProxySandboxRequestInput!) {\n proxySandboxRequest(input: $input) {\n status\n body\n }\n }\n ",
134
- variables: { input: {
135
- sandboxId: e,
136
- path: n,
137
- method: r,
138
- body: i,
139
- context: c(t, a)
140
- } },
141
- workspaceId: t,
142
- authContext: a,
143
- baseUrl: o
144
- })).proxySandboxRequest;
145
- if (!s || s.status >= 400) {
146
- let e = s?.body;
147
- throw Error(e?.error ?? `Proxy error: ${s?.status ?? "unknown"}`);
148
- }
149
- return s.body ?? {};
150
- }
151
- async function m(e, t, n, r, i = 9e4, a) {
152
- let o = Date.now();
153
- for (; Date.now() - o < i;) {
154
- try {
155
- await p(e, t, "/health", "GET", void 0, n, r);
156
- return;
157
- } catch (e) {
158
- let t = e instanceof Error ? e.message : String(e);
159
- if (!/proxy error: 502|proxy error: 503|proxy error: 404|service not available/i.test(t)) throw e;
160
- }
161
- let i = Math.max(1, Math.round((Date.now() - o) / 1e3));
162
- a?.(`Connecting to assistant... (${i}s)`), await new Promise((e) => setTimeout(e, 2e3));
163
- }
164
- throw Error("Assistant service did not become healthy before timeout");
165
- }
166
- async function h(e, t, n, r, i) {
167
- return { sessionId: (await p(e, t, "/sessions", "POST", { mode: n }, r, i)).session.id };
168
- }
169
- async function g(e, t, n, r, i, a, o, s) {
170
- let c = {
171
- mode: i,
172
- prompt: r,
173
- pageContext: a ? {
174
- currentUrl: a.currentUrl,
175
- currentPage: a.currentPage,
176
- entityType: a.entityType,
177
- entityId: a.entityId,
178
- platform: a.platform,
179
- version: a.version,
180
- viewportSize: a.viewportSize
181
- } : void 0
182
- };
183
- await p(e, t, `/sessions/${n}/prompt-async`, "POST", c, o, s);
184
- }
185
- async function _(e, t, n, r, i, a = 50) {
186
- return (await p(e, t, `/sessions/${n}/messages?limit=${a}`, "GET", void 0, r, i)).messages ?? [];
187
- }
188
- async function v(e, t, n = 600, r, i) {
189
- await l({
190
- query: "\n mutation ExtendSandboxTtl($id: ID!, $additionalSeconds: Int!, $context: ContextInput!) {\n extendSandboxTTL(id: $id, additionalSeconds: $additionalSeconds, context: $context) {\n id\n expiresAt\n }\n }\n ",
191
- variables: {
192
- id: e,
193
- additionalSeconds: n,
194
- context: c(t, r)
195
- },
196
- workspaceId: t,
197
- authContext: r,
198
- baseUrl: i
199
- });
200
- }
201
- //#endregion
202
- export { d as createAssistantSandbox, h as createAssistantSession, v as extendAssistantSandboxTTL, u as findExistingSandbox, _ as getAssistantMessages, g as sendAssistantPromptAsync, m as waitForAssistantServiceReady, f as waitForSandboxReady };
203
-
204
- //# sourceMappingURL=assistantApi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assistantApi.js","names":[],"sources":["../../src/services/assistantApi.ts"],"sourcesContent":["/**\n * TheCulturePost AI Assistant API service.\n *\n * Reuses the platform sandbox `api-calls` agent through the workspace gateway.\n * This implementation uses graphqlFetch (the same transport as the rest of the\n * microfrontend) rather than Apollo, keeping the MFE dependency surface small.\n */\n\nimport { graphqlFetch } from '@burdenoff/fe-libs/shared/graphql';\nimport type { PageContext } from '#src/utils/pageContext';\nimport type {\n AssistantArtifact,\n AssistantMode,\n AssistantPromptResult,\n AssistantRawMessage,\n AssistantSandboxAuthContext,\n} from '#src/types/assistant';\n\nconst HARBOR_REGISTRY = 'burdenoffregistry.azurecr.io';\nconst DEFAULT_IMAGE_TAG = import.meta.env.VITE_APP_ENV === 'prod' ? 'prod' : 'alpha';\nconst API_CALLS_IMAGE_TAG =\n import.meta.env.VITE_APP_ENV === 'prod' ? 'prod' : 'alpha-delegated-auth-v11';\nconst ASSISTANT_API_AUTH_STRATEGY = 'sandbox-app-client-headers-v1';\n\nfunction getImageForMode(_mode: AssistantMode): string {\n return `${HARBOR_REGISTRY}/wspace/ai-assistant-api-calls:${API_CALLS_IMAGE_TAG}`;\n}\n\nfunction getImageTagForMode(_mode: AssistantMode): string {\n return API_CALLS_IMAGE_TAG;\n}\n\nfunction resolveSandboxAssistantMode(sandbox: {\n metadata: Record<string, unknown> | null;\n name?: string | null;\n}): AssistantMode | null {\n const metadataMode = sandbox.metadata?.assistantMode;\n if (metadataMode === 'assistant' || metadataMode === 'api-calls') {\n return 'assistant';\n }\n const name = sandbox.name ?? '';\n if (name.startsWith('ai-assistant-assistant-') || name.startsWith('ai-assistant-api-calls-')) {\n return 'assistant';\n }\n return null;\n}\n\nfunction getResourcesForMode(_mode: AssistantMode): {\n cpuRequest: string;\n cpuLimit: string;\n memoryRequest: string;\n memoryLimit: string;\n} {\n return {\n cpuRequest: '150m',\n cpuLimit: '750m',\n memoryRequest: '384Mi',\n memoryLimit: '1536Mi',\n };\n}\n\nfunction buildSandboxContextInput(\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext\n): Record<string, unknown> {\n return {\n workspaceId,\n ...(authContext?.organizationId\n ? {\n custom: {\n organizationId: authContext.organizationId,\n },\n }\n : {}),\n };\n}\n\ninterface GraphQLResponse<TData> {\n data?: TData;\n errors?: Array<{ message: string }>;\n}\n\nasync function executeSandboxGraphQL<TData>(params: {\n query: string;\n variables: Record<string, unknown>;\n workspaceId: string;\n authContext?: AssistantSandboxAuthContext;\n baseUrl?: string;\n}): Promise<TData> {\n const response = await graphqlFetch<GraphQLResponse<TData>>({\n gateway: 'workspace',\n baseUrl: params.baseUrl,\n query: params.query,\n variables: params.variables,\n workspaceToken: true,\n });\n\n if (response.errors?.length) {\n const message = response.errors.map((error) => error.message).join(', ');\n const error = new Error(message) as Error & { statusCode?: number; result?: unknown };\n error.statusCode = 200;\n error.result = response;\n throw error;\n }\n\n if (!response.data) {\n throw new Error('Sandbox GraphQL returned no data');\n }\n\n return response.data as TData;\n}\n\nexport async function findExistingSandbox(\n workspaceId: string,\n mode: AssistantMode,\n authContext?: AssistantSandboxAuthContext,\n baseUrl?: string\n): Promise<string | null> {\n const query = `\n query GetActiveSandboxes($context: ContextInput!) {\n getActiveSandboxes(context: $context) {\n id\n name\n status\n metadata\n template\n createdBy\n }\n }\n `;\n const data = await executeSandboxGraphQL<{\n getActiveSandboxes: Array<{\n id: string;\n name: string;\n status: string;\n metadata: Record<string, unknown> | null;\n template: string;\n createdBy: string;\n }>;\n }>({\n query,\n variables: { context: buildSandboxContextInput(workspaceId, authContext) },\n workspaceId,\n authContext,\n baseUrl,\n });\n const sandboxes = data.getActiveSandboxes ?? [];\n\n return (\n sandboxes.find(\n (s) =>\n (s.status === 'RUNNING' || s.status === 'PROVISIONING' || s.status === 'PENDING') &&\n s.template === 'AI_BUILDER' &&\n resolveSandboxAssistantMode(s) === mode &&\n (!authContext?.userId || s.createdBy === authContext.userId) &&\n s.metadata?.authStrategy === ASSISTANT_API_AUTH_STRATEGY &&\n s.metadata?.imageTag === getImageTagForMode(mode)\n )?.id ?? null\n );\n}\n\nexport async function createAssistantSandbox(\n workspaceId: string,\n mode: AssistantMode,\n authContext?: AssistantSandboxAuthContext,\n baseUrl?: string\n): Promise<string> {\n const resources = getResourcesForMode(mode);\n const env = [\n { name: 'AI_ASSISTANT_MODE', value: mode },\n { name: 'HOSTNAME', value: '0.0.0.0' },\n { name: 'WORKSPACE_ID', value: workspaceId },\n { name: 'AI_ASSISTANT_PRODUCT', value: 'theculturepost' },\n ];\n\n const query = `\n mutation CreateSandbox($input: CreateSandboxInput!) {\n createSandbox(input: $input) {\n id\n name\n status\n network {\n internalUrl\n }\n }\n }\n `;\n\n const data = await executeSandboxGraphQL<{ createSandbox: { id: string } }>({\n query,\n variables: {\n input: {\n name: `ai-assistant-${mode}-${Date.now()}`,\n description: `AI Assistant sandbox (${mode} mode)`,\n template: 'AI_BUILDER',\n mode: 'DEPLOYMENT',\n containers: [\n {\n name: 'ai-assistant',\n image: getImageForMode(mode),\n ports: [{ containerPort: 8080, name: 'http' }],\n env,\n },\n ],\n resources: {\n cpuRequest: resources.cpuRequest,\n cpuLimit: resources.cpuLimit,\n memoryRequest: resources.memoryRequest,\n memoryLimit: resources.memoryLimit,\n },\n ttlSeconds: 600,\n metadata: {\n assistantMode: mode,\n assistantOwnerUserId: authContext?.userId ?? null,\n assistantOrganizationId: authContext?.organizationId ?? null,\n authStrategy: ASSISTANT_API_AUTH_STRATEGY,\n imageTag: getImageTagForMode(mode),\n },\n context: buildSandboxContextInput(workspaceId, authContext),\n },\n },\n workspaceId,\n authContext,\n baseUrl,\n });\n\n if (!data?.createSandbox?.id) {\n throw new Error('createSandbox returned empty response');\n }\n return data.createSandbox.id;\n}\n\nexport async function waitForSandboxReady(\n sandboxId: string,\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext,\n baseUrl?: string,\n maxWaitMs = 300_000,\n onProgress?: (message: string) => void\n): Promise<void> {\n const query = `\n query GetSandbox($id: ID!, $context: ContextInput!) {\n getSandbox(id: $id, context: $context) {\n id\n status\n errorMessage\n network {\n internalUrl\n }\n }\n }\n `;\n const start = Date.now();\n while (Date.now() - start < maxWaitMs) {\n const data = await executeSandboxGraphQL<{\n getSandbox: { status?: string; errorMessage?: string } | null;\n }>({\n query,\n variables: { id: sandboxId, context: buildSandboxContextInput(workspaceId, authContext) },\n workspaceId,\n authContext,\n baseUrl,\n });\n const status = data?.getSandbox?.status;\n const errorMessage = data?.getSandbox?.errorMessage as string | undefined;\n if (status === 'RUNNING') return;\n if (status === 'FAILED' || status === 'STOPPED' || status === 'EXPIRED') {\n throw new Error(\n errorMessage\n ? `Sandbox ${status.toLowerCase()}: ${errorMessage}`\n : `Sandbox ${status.toLowerCase()}`\n );\n }\n const elapsedSeconds = Math.max(1, Math.round((Date.now() - start) / 1000));\n onProgress?.(`Starting assistant environment... (${elapsedSeconds}s)`);\n await new Promise((r) => setTimeout(r, 2000));\n }\n throw new Error('Sandbox startup timed out');\n}\n\nasync function proxyToSandbox(\n sandboxId: string,\n workspaceId: string,\n path: string,\n method: string,\n body?: unknown,\n authContext?: AssistantSandboxAuthContext,\n baseUrl?: string\n): Promise<Record<string, unknown>> {\n const query = `\n mutation ProxySandboxRequest($input: ProxySandboxRequestInput!) {\n proxySandboxRequest(input: $input) {\n status\n body\n }\n }\n `;\n const data = await executeSandboxGraphQL<{\n proxySandboxRequest: { status: number; body?: Record<string, unknown> | null };\n }>({\n query,\n variables: {\n input: {\n sandboxId,\n path,\n method,\n body,\n context: buildSandboxContextInput(workspaceId, authContext),\n },\n },\n workspaceId,\n authContext,\n baseUrl,\n });\n\n const proxyResult = data.proxySandboxRequest;\n if (!proxyResult || proxyResult.status >= 400) {\n const errBody = proxyResult?.body as Record<string, unknown> | undefined;\n throw new Error(\n (errBody?.error as string) ?? `Proxy error: ${proxyResult?.status ?? 'unknown'}`\n );\n }\n\n return proxyResult.body ?? {};\n}\n\nexport async function waitForAssistantServiceReady(\n sandboxId: string,\n workspaceId: string,\n authContext?: AssistantSandboxAuthContext,\n baseUrl?: string,\n maxWaitMs = 90_000,\n onProgress?: (message: string) => void\n): Promise<void> {\n const startedAt = Date.now();\n while (Date.now() - startedAt < maxWaitMs) {\n try {\n await proxyToSandbox(\n sandboxId,\n workspaceId,\n '/health',\n 'GET',\n undefined,\n authContext,\n baseUrl\n );\n return;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (\n !/proxy error: 502|proxy error: 503|proxy error: 404|service not available/i.test(message)\n ) {\n throw error;\n }\n }\n const elapsedSeconds = Math.max(1, Math.round((Date.now() - startedAt) / 1000));\n onProgress?.(`Connecting to assistant... (${elapsedSeconds}s)`);\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n throw new Error('Assistant service did not become healthy before timeout');\n}\n\nexport async function createAssistantSession(\n sandboxId: string,\n workspaceId: string,\n mode: AssistantMode,\n authContext?: AssistantSandboxAuthContext,\n baseUrl?: string\n): Promise<{ sessionId: string }> {\n const body = await proxyToSandbox(\n sandboxId,\n workspaceId,\n '/sessions',\n 'POST',\n { mode },\n authContext,\n baseUrl\n );\n const session = body.session as Record<string, unknown>;\n return { sessionId: session.id as string };\n}\n\nexport async function sendAssistantPromptAsync(\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n prompt: string,\n mode: AssistantMode,\n pageContext?: PageContext,\n authContext?: AssistantSandboxAuthContext,\n baseUrl?: string\n): Promise<void> {\n const requestBody = {\n mode,\n prompt,\n pageContext: pageContext\n ? {\n currentUrl: pageContext.currentUrl,\n currentPage: pageContext.currentPage,\n entityType: pageContext.entityType,\n entityId: pageContext.entityId,\n platform: pageContext.platform,\n version: pageContext.version,\n viewportSize: pageContext.viewportSize,\n }\n : undefined,\n };\n\n await proxyToSandbox(\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/prompt-async`,\n 'POST',\n requestBody,\n authContext,\n baseUrl\n );\n}\n\nexport async function getAssistantMessages(\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n authContext?: AssistantSandboxAuthContext,\n baseUrl?: string,\n limit = 50\n): Promise<AssistantRawMessage[]> {\n const body = await proxyToSandbox(\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/messages?limit=${limit}`,\n 'GET',\n undefined,\n authContext,\n baseUrl\n );\n return (body.messages as AssistantRawMessage[] | undefined) ?? [];\n}\n\nexport async function extendAssistantSandboxTTL(\n sandboxId: string,\n workspaceId: string,\n additionalSeconds = 600,\n authContext?: AssistantSandboxAuthContext,\n baseUrl?: string\n): Promise<void> {\n const query = `\n mutation ExtendSandboxTtl($id: ID!, $additionalSeconds: Int!, $context: ContextInput!) {\n extendSandboxTTL(id: $id, additionalSeconds: $additionalSeconds, context: $context) {\n id\n expiresAt\n }\n }\n `;\n await executeSandboxGraphQL<{ extendSandboxTTL: { id: string } }>({\n query,\n variables: {\n id: sandboxId,\n additionalSeconds,\n context: buildSandboxContextInput(workspaceId, authContext),\n },\n workspaceId,\n authContext,\n baseUrl,\n });\n}\n\nexport async function getAssistantArtifacts(\n sandboxId: string,\n workspaceId: string,\n sessionId: string,\n authContext?: AssistantSandboxAuthContext,\n baseUrl?: string\n): Promise<AssistantArtifact[]> {\n const body = await proxyToSandbox(\n sandboxId,\n workspaceId,\n `/sessions/${sessionId}/artifacts`,\n 'GET',\n undefined,\n authContext,\n baseUrl\n );\n return ((body.artifacts as AssistantArtifact[] | undefined) ?? []).filter(\n (artifact) => !artifact.name.startsWith('.')\n );\n}\n"],"mappings":"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"}