@tutti-os/workspace-external-core 0.0.15 → 0.0.17

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/README.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  Contracts and host-agnostic helpers for the workspace app external bridge.
4
4
 
5
+ Workspace apps are trusted installed app packages. The external bridge is a
6
+ privileged host integration surface, not a web-style permission sandbox. User
7
+ activation gates disruptive host UI such as dialogs and navigation, while
8
+ trusted app APIs may read or update host workspace state directly.
9
+
5
10
  `window.tuttiExternal` currently exposes:
6
11
 
7
12
  - `app.getContext()` and `app.subscribe()` for host workspace/app context.
@@ -9,6 +14,10 @@ Contracts and host-agnostic helpers for the workspace app external bridge.
9
14
  - `files.select()` for user-activated workspace file picking.
10
15
  - `files.open()` for user-activated host opening/revealing of a known workspace file path.
11
16
  - `permissions.request()` for user-activated host permission grants such as managed AI model access.
17
+ - `pdf.printHtmlToPdf()` for user-activated host PDF generation from print-ready HTML.
12
18
  - `settings.open()` for user-activated host settings navigation, including the managed models tab.
19
+ - `userProjects.*` for trusted app access to local user project paths, default
20
+ project selection, project directory creation, and recently used project
21
+ state.
13
22
  - `workspace.openFeature()` for user-activated host workspace navigation, such as opening the message center.
14
23
  - `logs.write()` for fire-and-forget frontend diagnostics that append to the workspace app `web.log`.
@@ -40,4 +40,4 @@ export {
40
40
  tuttiExternalWorkspaceAgentProviders,
41
41
  tuttiExternalLogLevels
42
42
  };
43
- //# sourceMappingURL=chunk-TXIBT45W.js.map
43
+ //# sourceMappingURL=chunk-J53NLKKO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contracts/index.ts"],"sourcesContent":["import type { WorkspaceFileReference } from \"@tutti-os/workspace-file-reference/contracts\";\nimport type {\n WorkspaceUserProject,\n WorkspaceUserProjectDefaultSelection,\n WorkspaceUserProjectPathCheck,\n WorkspaceUserProjectSelectionPreparation,\n WorkspaceUserProjectSelectionPreparationInput,\n WorkspaceUserProjectServiceSnapshot\n} from \"@tutti-os/workspace-user-project/contracts\";\n\nexport const TUTTI_EXTERNAL_AT_PROVIDER_IDS = {\n agentGeneratedFile: \"agent-generated-file\",\n agentSession: \"agent-session\",\n file: \"file\",\n workspaceApp: \"workspace-app\",\n workspaceIssue: \"workspace-issue\"\n} as const;\n\nexport type TuttiExternalAtProviderId =\n (typeof TUTTI_EXTERNAL_AT_PROVIDER_IDS)[keyof typeof TUTTI_EXTERNAL_AT_PROVIDER_IDS];\n\nexport const tuttiExternalAtProviderIds = [\n TUTTI_EXTERNAL_AT_PROVIDER_IDS.file,\n TUTTI_EXTERNAL_AT_PROVIDER_IDS.workspaceIssue,\n TUTTI_EXTERNAL_AT_PROVIDER_IDS.workspaceApp,\n TUTTI_EXTERNAL_AT_PROVIDER_IDS.agentSession,\n TUTTI_EXTERNAL_AT_PROVIDER_IDS.agentGeneratedFile\n] as const satisfies readonly TuttiExternalAtProviderId[];\n\nexport interface TuttiExternalAtQueryInput {\n keyword: string;\n maxResults?: number;\n providers?: readonly TuttiExternalAtProviderId[];\n}\n\nexport interface TuttiExternalAtQueryResult {\n providerId: TuttiExternalAtProviderId;\n itemId: string;\n label: string;\n subtitle?: string;\n thumbnailUrl?: string | null;\n insert: TuttiExternalAtInsertResult;\n}\n\nexport interface TuttiExternalAtMentionPresentation {\n agentProviderId?: string;\n agentIconUrl?: string;\n iconUrl?: string;\n thumbnailUrl?: string;\n subtitle?: string;\n description?: string;\n participant?: string;\n status?: string;\n statusDataStatus?: string;\n statusLabel?: string;\n statusPulse?: string;\n userAvatarPlaceholderUrl?: string;\n}\n\nexport type TuttiExternalAtInsertResult =\n | {\n kind: \"mention\";\n mention: {\n entityId: string;\n label: string;\n scope?: Record<string, string>;\n presentation?: TuttiExternalAtMentionPresentation;\n };\n }\n | {\n kind: \"markdown-link\";\n label: string;\n href: string;\n }\n | {\n kind: \"text\";\n text: string;\n };\n\nexport interface TuttiExternalFileSelectInput {\n multiple?: boolean;\n}\n\nexport type TuttiExternalFileSelectResult = WorkspaceFileReference[];\n\nexport interface TuttiExternalFileOpenInput {\n mode?: \"auto\" | \"preview\" | \"reveal\";\n mtimeMs?: number | null;\n name?: string;\n path: string;\n sizeBytes?: number | null;\n}\n\nexport const tuttiExternalManagedAiModelProviderIds = [\n \"agnes\",\n \"openai\",\n \"anthropic\"\n] as const;\n\nexport type TuttiExternalManagedAiModelProviderId =\n (typeof tuttiExternalManagedAiModelProviderIds)[number];\n\nexport interface TuttiExternalManagedAiModel {\n id: string;\n name?: string;\n provider: TuttiExternalManagedAiModelProviderId;\n}\n\nexport interface TuttiExternalPermissionRequestInput {\n permission: \"managed-ai-models\";\n nonce: string;\n providers?: readonly TuttiExternalManagedAiModelProviderId[];\n scopes: readonly string[];\n state: string;\n}\n\nexport interface TuttiExternalPermissionRequestResult {\n code: string;\n expiresAt?: string;\n models?: readonly TuttiExternalManagedAiModel[];\n providers?: readonly TuttiExternalManagedAiModelProviderId[];\n}\n\nexport interface TuttiExternalSettingsOpenInput {\n provider?: TuttiExternalManagedAiModelProviderId;\n tab?: \"models\";\n}\n\nexport type TuttiExternalWorkspaceFeature =\n | \"app-center\"\n | \"issue-manager\"\n | \"message-center\"\n | \"agent-connect\"\n | \"agent-chat\";\n\nexport const tuttiExternalWorkspaceAgentProviders = [\n \"claude-code\",\n \"codex\",\n \"nexight\",\n \"hermes\",\n \"gemini\",\n \"openclaw\"\n] as const;\n\nexport type TuttiExternalWorkspaceAgentProvider =\n (typeof tuttiExternalWorkspaceAgentProviders)[number];\n\nexport interface TuttiExternalWorkspaceOpenFeatureInput {\n autoSubmit?: boolean;\n draftPrompt?: string;\n feature: TuttiExternalWorkspaceFeature;\n provider?: TuttiExternalWorkspaceAgentProvider;\n}\n\nexport interface TuttiExternalReferenceOpenInput {\n href: string;\n}\n\nexport interface TuttiExternalUserProjectCreateInput {\n name: string;\n}\n\nexport interface TuttiExternalUserProjectPathInput {\n path: string;\n}\n\nexport interface TuttiExternalUserProjectRememberDefaultSelectionInput {\n path: string | null;\n}\n\nexport const tuttiExternalLogLevels = [\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n] as const;\n\nexport type TuttiExternalLogLevel = (typeof tuttiExternalLogLevels)[number];\n\nexport interface TuttiExternalLogInput {\n details?: Record<string, unknown>;\n event: string;\n level?: TuttiExternalLogLevel;\n}\n\nexport interface TuttiExternalPdfMargin {\n bottom?: string;\n left?: string;\n right?: string;\n top?: string;\n}\n\nexport interface TuttiExternalPdfPrintHtmlInput {\n baseUrl?: string;\n html: string;\n margin?: TuttiExternalPdfMargin;\n pageSize?: \"A4\" | \"Letter\";\n printBackground?: boolean;\n title?: string;\n}\n\nexport interface TuttiExternalPdfPrintHtmlResult {\n bytes: Uint8Array;\n}\n\nexport interface TuttiExternalBridge {\n app: {\n getContext(): Promise<unknown>;\n subscribe(listener: (context: unknown) => void): () => void;\n };\n at: {\n query(\n input: TuttiExternalAtQueryInput\n ): Promise<TuttiExternalAtQueryResult[]>;\n };\n files: {\n select(\n input?: TuttiExternalFileSelectInput\n ): Promise<TuttiExternalFileSelectResult>;\n open(input: TuttiExternalFileOpenInput): Promise<void>;\n };\n permissions: {\n request(\n input: TuttiExternalPermissionRequestInput\n ): Promise<TuttiExternalPermissionRequestResult>;\n };\n settings: {\n open(input?: TuttiExternalSettingsOpenInput): Promise<void>;\n };\n workspace: {\n openFeature(input: TuttiExternalWorkspaceOpenFeatureInput): Promise<void>;\n };\n references: {\n open(input: TuttiExternalReferenceOpenInput): Promise<void>;\n };\n pdf: {\n printHtmlToPdf(\n input: TuttiExternalPdfPrintHtmlInput\n ): Promise<TuttiExternalPdfPrintHtmlResult>;\n };\n userProjects: {\n checkPath(\n input: TuttiExternalUserProjectPathInput\n ): Promise<WorkspaceUserProjectPathCheck>;\n create(\n input: TuttiExternalUserProjectCreateInput\n ): Promise<WorkspaceUserProject>;\n getDefaultSelection(): Promise<WorkspaceUserProjectDefaultSelection | null>;\n getSnapshot(): Promise<WorkspaceUserProjectServiceSnapshot>;\n list(): Promise<{ projects: WorkspaceUserProject[] }>;\n prepareSelection(\n input: WorkspaceUserProjectSelectionPreparationInput\n ): Promise<WorkspaceUserProjectSelectionPreparation>;\n refresh(): Promise<WorkspaceUserProjectServiceSnapshot>;\n rememberDefaultSelection(\n input: TuttiExternalUserProjectRememberDefaultSelectionInput\n ): Promise<void>;\n selectDirectory(): Promise<{ path: string } | null>;\n /**\n * Subscribes to user-project snapshots. Implementations replay the latest\n * known snapshot after registration, then emit future snapshots.\n */\n subscribe(\n listener: (snapshot: WorkspaceUserProjectServiceSnapshot) => void\n ): () => void;\n use(\n input: TuttiExternalUserProjectPathInput\n ): Promise<WorkspaceUserProject>;\n };\n logs: {\n write(input: TuttiExternalLogInput): void;\n };\n}\n\nexport type TuttiExternalRendererRequest =\n | {\n appId: string;\n input: TuttiExternalAtQueryInput;\n operation: \"at.query\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n input: TuttiExternalFileSelectInput;\n operation: \"files.select\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n input: TuttiExternalFileOpenInput;\n operation: \"files.open\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n input: TuttiExternalSettingsOpenInput;\n operation: \"settings.open\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n input: TuttiExternalReferenceOpenInput;\n operation: \"references.open\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n input: TuttiExternalUserProjectPathInput;\n operation: \"userProjects.checkPath\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n input: TuttiExternalUserProjectCreateInput;\n operation: \"userProjects.create\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n operation: \"userProjects.getDefaultSelection\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n operation: \"userProjects.getSnapshot\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n operation: \"userProjects.list\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n input: WorkspaceUserProjectSelectionPreparationInput;\n operation: \"userProjects.prepareSelection\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n operation: \"userProjects.refresh\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n input: TuttiExternalUserProjectRememberDefaultSelectionInput;\n operation: \"userProjects.rememberDefaultSelection\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n operation: \"userProjects.selectDirectory\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n input: TuttiExternalUserProjectPathInput;\n operation: \"userProjects.use\";\n requestId: string;\n workspaceId: string;\n };\n"],"mappings":";AAUO,IAAM,iCAAiC;AAAA,EAC5C,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,MAAM;AAAA,EACN,cAAc;AAAA,EACd,gBAAgB;AAClB;AAKO,IAAM,6BAA6B;AAAA,EACxC,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,+BAA+B;AACjC;AAkEO,IAAM,yCAAyC;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AACF;AAsCO,IAAM,uCAAuC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA4BO,IAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  tuttiExternalAtProviderIds,
3
3
  tuttiExternalManagedAiModelProviderIds,
4
4
  tuttiExternalWorkspaceAgentProviders
5
- } from "./chunk-TXIBT45W.js";
5
+ } from "./chunk-J53NLKKO.js";
6
6
 
7
7
  // src/core/index.ts
8
8
  var tuttiExternalAtMaxResultsLimit = 50;
@@ -152,6 +152,60 @@ function normalizeTuttiExternalReferenceOpenInput(input) {
152
152
  }
153
153
  return { href };
154
154
  }
155
+ function normalizeTuttiExternalPdfPrintHtmlInput(input) {
156
+ if (!isRecord(input)) {
157
+ throw new Error("pdf.printHtmlToPdf input must be an object.");
158
+ }
159
+ const html = normalizeRequiredString(input.html, "pdf.printHtmlToPdf html");
160
+ const title = typeof input.title === "string" && input.title.trim() !== "" ? input.title.trim().slice(0, 200) : void 0;
161
+ const baseUrl = typeof input.baseUrl === "string" && input.baseUrl.trim() !== "" ? normalizePdfBaseUrl(input.baseUrl) : void 0;
162
+ return {
163
+ html,
164
+ ...baseUrl ? { baseUrl } : {},
165
+ ...title ? { title } : {},
166
+ ...input.printBackground === false ? { printBackground: false } : {},
167
+ ...input.pageSize !== void 0 && input.pageSize !== null ? { pageSize: normalizePdfPageSize(input.pageSize) } : {},
168
+ ...input.margin !== void 0 && input.margin !== null ? { margin: normalizePdfMargin(input.margin) } : {}
169
+ };
170
+ }
171
+ function normalizeTuttiExternalUserProjectCreateInput(input) {
172
+ if (!isRecord(input)) {
173
+ throw new Error("userProjects.create input must be an object.");
174
+ }
175
+ return {
176
+ name: normalizeRequiredString(input.name, "userProjects.create name")
177
+ };
178
+ }
179
+ function normalizeTuttiExternalUserProjectPathInput(input, operation) {
180
+ if (!isRecord(input)) {
181
+ throw new Error(`userProjects.${operation} input must be an object.`);
182
+ }
183
+ return {
184
+ path: normalizeRequiredString(input.path, `userProjects.${operation} path`)
185
+ };
186
+ }
187
+ function normalizeTuttiExternalUserProjectRememberDefaultSelectionInput(input) {
188
+ if (!isRecord(input)) {
189
+ throw new Error(
190
+ "userProjects.rememberDefaultSelection input must be an object."
191
+ );
192
+ }
193
+ if (input.path === null || input.path === void 0) {
194
+ return { path: null };
195
+ }
196
+ const path = typeof input.path === "string" ? input.path.trim() : "";
197
+ return { path: path || null };
198
+ }
199
+ function normalizeTuttiExternalUserProjectSelectionPreparationInput(input) {
200
+ if (!isRecord(input)) {
201
+ throw new Error("userProjects.prepareSelection input must be an object.");
202
+ }
203
+ const selectedPath = typeof input.selectedPath === "string" ? input.selectedPath.trim() : "";
204
+ return {
205
+ projectLocked: input.projectLocked === true,
206
+ selectedPath: selectedPath || null
207
+ };
208
+ }
155
209
  function isTuttiExternalAtProviderId(value) {
156
210
  return typeof value === "string" && tuttiExternalAtProviderIds.includes(value);
157
211
  }
@@ -265,6 +319,48 @@ function normalizeManagedAiModelProvider(value) {
265
319
  }
266
320
  return value;
267
321
  }
322
+ function normalizePdfBaseUrl(value) {
323
+ let url;
324
+ try {
325
+ url = new URL(value.trim());
326
+ } catch {
327
+ throw new Error("pdf.printHtmlToPdf baseUrl must be a valid URL.");
328
+ }
329
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
330
+ throw new Error("pdf.printHtmlToPdf baseUrl protocol is unsupported.");
331
+ }
332
+ return url.toString();
333
+ }
334
+ function normalizePdfPageSize(value) {
335
+ if (value === "A4" || value === "Letter") {
336
+ return value;
337
+ }
338
+ throw new Error("pdf.printHtmlToPdf pageSize is unsupported.");
339
+ }
340
+ function normalizePdfMargin(value) {
341
+ if (!isRecord(value)) {
342
+ throw new Error("pdf.printHtmlToPdf margin must be an object.");
343
+ }
344
+ return {
345
+ ...normalizePdfMarginSide(value.top, "top"),
346
+ ...normalizePdfMarginSide(value.right, "right"),
347
+ ...normalizePdfMarginSide(value.bottom, "bottom"),
348
+ ...normalizePdfMarginSide(value.left, "left")
349
+ };
350
+ }
351
+ function normalizePdfMarginSide(value, side) {
352
+ if (value === void 0 || value === null || value === "") {
353
+ return {};
354
+ }
355
+ if (typeof value !== "string" || value.trim() === "") {
356
+ throw new Error(`pdf.printHtmlToPdf margin ${side} must be a string.`);
357
+ }
358
+ const normalized = value.trim();
359
+ if (!/^\d+(?:\.\d+)?(?:px|in|cm|mm)$/u.test(normalized)) {
360
+ throw new Error(`pdf.printHtmlToPdf margin ${side} unit is unsupported.`);
361
+ }
362
+ return { [side]: normalized };
363
+ }
268
364
  function normalizeFileOpenMode(value) {
269
365
  if (value === void 0 || value === null || value === "") {
270
366
  return void 0;
@@ -314,9 +410,14 @@ export {
314
410
  normalizeTuttiExternalSettingsOpenInput,
315
411
  normalizeTuttiExternalWorkspaceOpenFeatureInput,
316
412
  normalizeTuttiExternalReferenceOpenInput,
413
+ normalizeTuttiExternalPdfPrintHtmlInput,
414
+ normalizeTuttiExternalUserProjectCreateInput,
415
+ normalizeTuttiExternalUserProjectPathInput,
416
+ normalizeTuttiExternalUserProjectRememberDefaultSelectionInput,
417
+ normalizeTuttiExternalUserProjectSelectionPreparationInput,
317
418
  isTuttiExternalAtProviderId,
318
419
  isTuttiExternalManagedAiModelProviderId,
319
420
  isTuttiExternalWorkspaceFeature,
320
421
  isTuttiExternalWorkspaceAgentProvider
321
422
  };
322
- //# sourceMappingURL=chunk-JKLKTSUO.js.map
423
+ //# sourceMappingURL=chunk-LGELOEVW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/index.ts"],"sourcesContent":["import {\n tuttiExternalManagedAiModelProviderIds,\n tuttiExternalAtProviderIds,\n tuttiExternalWorkspaceAgentProviders,\n type TuttiExternalAtProviderId,\n type TuttiExternalAtQueryInput,\n type TuttiExternalFileOpenInput,\n type TuttiExternalFileSelectInput,\n type TuttiExternalLogInput,\n type TuttiExternalLogLevel,\n type TuttiExternalManagedAiModelProviderId,\n type TuttiExternalPermissionRequestInput,\n type TuttiExternalPdfMargin,\n type TuttiExternalPdfPrintHtmlInput,\n type TuttiExternalReferenceOpenInput,\n type TuttiExternalSettingsOpenInput,\n type TuttiExternalUserProjectCreateInput,\n type TuttiExternalUserProjectPathInput,\n type TuttiExternalUserProjectRememberDefaultSelectionInput,\n type TuttiExternalWorkspaceAgentProvider,\n type TuttiExternalWorkspaceFeature,\n type TuttiExternalWorkspaceOpenFeatureInput\n} from \"../contracts/index.ts\";\nimport type { WorkspaceUserProjectSelectionPreparationInput } from \"@tutti-os/workspace-user-project/contracts\";\n\nexport {\n tuttiExternalAtProviderIds,\n tuttiExternalManagedAiModelProviderIds,\n tuttiExternalWorkspaceAgentProviders\n} from \"../contracts/index.ts\";\n\nexport const tuttiExternalAtMaxResultsLimit = 50;\nexport const tuttiExternalAtDefaultMaxResults = 20;\nexport const tuttiExternalLogDiagnosticTextLimit = 8_000;\nexport const tuttiExternalWorkspaceFeatures = [\n \"app-center\",\n \"issue-manager\",\n \"message-center\",\n \"agent-connect\",\n \"agent-chat\"\n] as const satisfies readonly TuttiExternalWorkspaceFeature[];\n\nexport function limitDiagnosticText(\n value: string | undefined\n): string | undefined {\n const trimmed = value?.trim();\n if (!trimmed) {\n return undefined;\n }\n return trimmed.length > tuttiExternalLogDiagnosticTextLimit\n ? `${trimmed.slice(0, tuttiExternalLogDiagnosticTextLimit)}...`\n : trimmed;\n}\n\nexport function normalizeTuttiExternalLogInput(\n input: unknown\n): TuttiExternalLogInput {\n if (!isRecord(input)) {\n throw new Error(\"logs.write input must be an object.\");\n }\n\n const event = limitDiagnosticText(\n normalizeRequiredString(input.event, \"logs.write event\")\n );\n if (!event) {\n throw new Error(\"logs.write event is required.\");\n }\n\n return {\n event,\n ...(input.level !== undefined && input.level !== null\n ? { level: normalizeTuttiExternalLogLevel(input.level) }\n : {}),\n ...(input.details !== undefined && input.details !== null\n ? { details: normalizeTuttiExternalLogDetails(input.details) }\n : {})\n };\n}\n\nexport function normalizeTuttiExternalAtQueryInput(\n input: unknown\n): TuttiExternalAtQueryInput {\n if (!isRecord(input)) {\n throw new Error(\"at.query input must be an object.\");\n }\n\n const keywordValue = input.keyword;\n if (typeof keywordValue !== \"string\") {\n throw new Error(\"at.query keyword is required.\");\n }\n\n return {\n keyword: keywordValue,\n maxResults: normalizeMaxResults(input.maxResults),\n providers: normalizeProviders(input.providers)\n };\n}\n\nexport function normalizeTuttiExternalFileSelectInput(\n input: unknown\n): TuttiExternalFileSelectInput {\n if (input === undefined || input === null) {\n return {};\n }\n if (!isRecord(input)) {\n throw new Error(\"files.select input must be an object.\");\n }\n return {\n multiple: input.multiple === true\n };\n}\n\nexport function normalizeTuttiExternalFileOpenInput(\n input: unknown\n): TuttiExternalFileOpenInput {\n if (!isRecord(input)) {\n throw new Error(\"files.open input must be an object.\");\n }\n if (typeof input.path !== \"string\" || input.path.trim() === \"\") {\n throw new Error(\"files.open path is required.\");\n }\n const mode = normalizeFileOpenMode(input.mode);\n return {\n ...(mode ? { mode } : {}),\n ...(typeof input.mtimeMs === \"number\" || input.mtimeMs === null\n ? { mtimeMs: input.mtimeMs }\n : {}),\n ...(typeof input.name === \"string\" && input.name.trim() !== \"\"\n ? { name: input.name.trim() }\n : {}),\n path: input.path.trim(),\n ...(typeof input.sizeBytes === \"number\" || input.sizeBytes === null\n ? { sizeBytes: input.sizeBytes }\n : {})\n };\n}\n\nexport function normalizeTuttiExternalPermissionRequestInput(\n input: unknown\n): TuttiExternalPermissionRequestInput {\n if (!isRecord(input)) {\n throw new Error(\"permissions.request input must be an object.\");\n }\n if (input.permission !== \"managed-ai-models\") {\n throw new Error(\"permissions.request permission is unsupported.\");\n }\n const nonce = normalizeRequiredString(\n input.nonce,\n \"permissions.request nonce\"\n );\n const state = normalizeRequiredString(\n input.state,\n \"permissions.request state\"\n );\n const scopes = normalizeRequiredStringList(\n input.scopes,\n \"permissions.request scopes\"\n );\n if (scopes.length === 0) {\n throw new Error(\"permissions.request scopes must not be empty.\");\n }\n\n return {\n nonce,\n permission: \"managed-ai-models\",\n providers: normalizeManagedAiModelProviders(input.providers),\n scopes,\n state\n };\n}\n\nexport function normalizeTuttiExternalSettingsOpenInput(\n input: unknown\n): TuttiExternalSettingsOpenInput {\n if (input === undefined || input === null) {\n return {};\n }\n if (!isRecord(input)) {\n throw new Error(\"settings.open input must be an object.\");\n }\n if (\n input.tab !== undefined &&\n input.tab !== null &&\n input.tab !== \"\" &&\n input.tab !== \"models\"\n ) {\n throw new Error(\"settings.open tab is unsupported.\");\n }\n return {\n ...(input.provider !== undefined && input.provider !== null\n ? { provider: normalizeManagedAiModelProvider(input.provider) }\n : {}),\n ...(input.tab === \"models\" ? { tab: \"models\" as const } : {})\n };\n}\n\nexport function normalizeTuttiExternalWorkspaceOpenFeatureInput(\n input: unknown\n): TuttiExternalWorkspaceOpenFeatureInput {\n if (!isRecord(input)) {\n throw new Error(\"workspace.openFeature input must be an object.\");\n }\n const feature = input.feature;\n if (!isTuttiExternalWorkspaceFeature(feature)) {\n throw new Error(\"workspace.openFeature feature is unsupported.\");\n }\n const draftPrompt =\n typeof input.draftPrompt === \"string\" ? input.draftPrompt.trim() : \"\";\n return {\n feature,\n ...(draftPrompt ? { draftPrompt } : {}),\n ...(input.autoSubmit === true ? { autoSubmit: true } : {}),\n ...(typeof input.provider === \"string\" && input.provider.trim() !== \"\"\n ? {\n provider: normalizeTuttiExternalWorkspaceAgentProvider(input.provider)\n }\n : {})\n };\n}\n\nexport function normalizeTuttiExternalReferenceOpenInput(\n input: unknown\n): TuttiExternalReferenceOpenInput {\n if (!isRecord(input)) {\n throw new Error(\"references.open input must be an object.\");\n }\n const href = normalizeRequiredString(input.href, \"references.open href\");\n if (!href.toLowerCase().startsWith(\"mention://\")) {\n throw new Error(\"references.open href must be a mention URL.\");\n }\n return { href };\n}\n\nexport function normalizeTuttiExternalPdfPrintHtmlInput(\n input: unknown\n): TuttiExternalPdfPrintHtmlInput {\n if (!isRecord(input)) {\n throw new Error(\"pdf.printHtmlToPdf input must be an object.\");\n }\n const html = normalizeRequiredString(input.html, \"pdf.printHtmlToPdf html\");\n const title =\n typeof input.title === \"string\" && input.title.trim() !== \"\"\n ? input.title.trim().slice(0, 200)\n : undefined;\n const baseUrl =\n typeof input.baseUrl === \"string\" && input.baseUrl.trim() !== \"\"\n ? normalizePdfBaseUrl(input.baseUrl)\n : undefined;\n return {\n html,\n ...(baseUrl ? { baseUrl } : {}),\n ...(title ? { title } : {}),\n ...(input.printBackground === false ? { printBackground: false } : {}),\n ...(input.pageSize !== undefined && input.pageSize !== null\n ? { pageSize: normalizePdfPageSize(input.pageSize) }\n : {}),\n ...(input.margin !== undefined && input.margin !== null\n ? { margin: normalizePdfMargin(input.margin) }\n : {})\n };\n}\n\nexport function normalizeTuttiExternalUserProjectCreateInput(\n input: unknown\n): TuttiExternalUserProjectCreateInput {\n if (!isRecord(input)) {\n throw new Error(\"userProjects.create input must be an object.\");\n }\n return {\n name: normalizeRequiredString(input.name, \"userProjects.create name\")\n };\n}\n\nexport function normalizeTuttiExternalUserProjectPathInput(\n input: unknown,\n operation: \"checkPath\" | \"use\"\n): TuttiExternalUserProjectPathInput {\n if (!isRecord(input)) {\n throw new Error(`userProjects.${operation} input must be an object.`);\n }\n return {\n path: normalizeRequiredString(input.path, `userProjects.${operation} path`)\n };\n}\n\nexport function normalizeTuttiExternalUserProjectRememberDefaultSelectionInput(\n input: unknown\n): TuttiExternalUserProjectRememberDefaultSelectionInput {\n if (!isRecord(input)) {\n throw new Error(\n \"userProjects.rememberDefaultSelection input must be an object.\"\n );\n }\n if (input.path === null || input.path === undefined) {\n return { path: null };\n }\n const path = typeof input.path === \"string\" ? input.path.trim() : \"\";\n return { path: path || null };\n}\n\nexport function normalizeTuttiExternalUserProjectSelectionPreparationInput(\n input: unknown\n): WorkspaceUserProjectSelectionPreparationInput {\n if (!isRecord(input)) {\n throw new Error(\"userProjects.prepareSelection input must be an object.\");\n }\n const selectedPath =\n typeof input.selectedPath === \"string\" ? input.selectedPath.trim() : \"\";\n return {\n projectLocked: input.projectLocked === true,\n selectedPath: selectedPath || null\n };\n}\n\nexport function isTuttiExternalAtProviderId(\n value: unknown\n): value is TuttiExternalAtProviderId {\n return (\n typeof value === \"string\" &&\n tuttiExternalAtProviderIds.includes(value as TuttiExternalAtProviderId)\n );\n}\n\nexport function isTuttiExternalManagedAiModelProviderId(\n value: unknown\n): value is TuttiExternalManagedAiModelProviderId {\n return (\n typeof value === \"string\" &&\n tuttiExternalManagedAiModelProviderIds.includes(\n value as TuttiExternalManagedAiModelProviderId\n )\n );\n}\n\nexport function isTuttiExternalWorkspaceFeature(\n value: unknown\n): value is TuttiExternalWorkspaceFeature {\n return (\n typeof value === \"string\" &&\n tuttiExternalWorkspaceFeatures.includes(\n value as TuttiExternalWorkspaceFeature\n )\n );\n}\n\nexport function isTuttiExternalWorkspaceAgentProvider(\n value: unknown\n): value is TuttiExternalWorkspaceAgentProvider {\n return (\n typeof value === \"string\" &&\n tuttiExternalWorkspaceAgentProviders.includes(\n value as TuttiExternalWorkspaceAgentProvider\n )\n );\n}\n\nfunction normalizeTuttiExternalWorkspaceAgentProvider(\n value: unknown\n): TuttiExternalWorkspaceAgentProvider {\n const provider = typeof value === \"string\" ? value.trim() : value;\n if (!isTuttiExternalWorkspaceAgentProvider(provider)) {\n throw new Error(\"workspace.openFeature provider is unsupported.\");\n }\n return provider;\n}\n\nfunction normalizeTuttiExternalLogLevel(value: unknown): TuttiExternalLogLevel {\n if (\n value === \"debug\" ||\n value === \"info\" ||\n value === \"warn\" ||\n value === \"error\"\n ) {\n return value;\n }\n throw new Error(\"logs.write level is unsupported.\");\n}\n\nfunction normalizeTuttiExternalLogDetails(\n value: unknown\n): Record<string, unknown> {\n if (!isRecord(value)) {\n throw new Error(\"logs.write details must be an object.\");\n }\n\n const details: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n details[key] = normalizeTuttiExternalLogDetailValue(entry);\n }\n return details;\n}\n\nfunction normalizeTuttiExternalLogDetailValue(value: unknown): unknown {\n if (typeof value === \"string\") {\n return limitDiagnosticText(value) ?? \"\";\n }\n if (value instanceof Error) {\n return {\n message: limitDiagnosticText(value.message) ?? \"\",\n name: value.name,\n stack: limitDiagnosticText(value.stack)\n };\n }\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeTuttiExternalLogDetailValue(entry));\n }\n if (isRecord(value)) {\n return normalizeTuttiExternalLogDetails(value);\n }\n return value;\n}\n\nfunction normalizeMaxResults(value: unknown): number {\n if (value === undefined || value === null) {\n return tuttiExternalAtDefaultMaxResults;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(\"at.query maxResults must be a finite number.\");\n }\n const integer = Math.floor(value);\n if (integer < 0) {\n throw new Error(\"at.query maxResults must be greater than or equal to 0.\");\n }\n return Math.min(integer, tuttiExternalAtMaxResultsLimit);\n}\n\nfunction normalizeProviders(\n value: unknown\n): readonly TuttiExternalAtProviderId[] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n throw new Error(\"at.query providers must be an array.\");\n }\n const providers: TuttiExternalAtProviderId[] = [];\n for (const provider of value) {\n if (!isTuttiExternalAtProviderId(provider)) {\n throw new Error(\"at.query providers contains an unsupported provider.\");\n }\n if (!providers.includes(provider)) {\n providers.push(provider);\n }\n }\n return providers;\n}\n\nfunction normalizeManagedAiModelProviders(\n value: unknown\n): readonly TuttiExternalManagedAiModelProviderId[] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n throw new Error(\"permissions.request providers must be an array.\");\n }\n const providers: TuttiExternalManagedAiModelProviderId[] = [];\n for (const provider of value) {\n const normalizedProvider = normalizeManagedAiModelProvider(provider);\n if (!providers.includes(normalizedProvider)) {\n providers.push(normalizedProvider);\n }\n }\n return providers;\n}\n\nfunction normalizeManagedAiModelProvider(\n value: unknown\n): TuttiExternalManagedAiModelProviderId {\n if (!isTuttiExternalManagedAiModelProviderId(value)) {\n throw new Error(\"managed AI model provider is unsupported.\");\n }\n return value;\n}\n\nfunction normalizePdfBaseUrl(value: string): string {\n let url: URL;\n try {\n url = new URL(value.trim());\n } catch {\n throw new Error(\"pdf.printHtmlToPdf baseUrl must be a valid URL.\");\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new Error(\"pdf.printHtmlToPdf baseUrl protocol is unsupported.\");\n }\n return url.toString();\n}\n\nfunction normalizePdfPageSize(value: unknown): \"A4\" | \"Letter\" {\n if (value === \"A4\" || value === \"Letter\") {\n return value;\n }\n throw new Error(\"pdf.printHtmlToPdf pageSize is unsupported.\");\n}\n\nfunction normalizePdfMargin(value: unknown): TuttiExternalPdfMargin {\n if (!isRecord(value)) {\n throw new Error(\"pdf.printHtmlToPdf margin must be an object.\");\n }\n return {\n ...normalizePdfMarginSide(value.top, \"top\"),\n ...normalizePdfMarginSide(value.right, \"right\"),\n ...normalizePdfMarginSide(value.bottom, \"bottom\"),\n ...normalizePdfMarginSide(value.left, \"left\")\n };\n}\n\nfunction normalizePdfMarginSide(\n value: unknown,\n side: keyof TuttiExternalPdfMargin\n): TuttiExternalPdfMargin {\n if (value === undefined || value === null || value === \"\") {\n return {};\n }\n if (typeof value !== \"string\" || value.trim() === \"\") {\n throw new Error(`pdf.printHtmlToPdf margin ${side} must be a string.`);\n }\n const normalized = value.trim();\n if (!/^\\d+(?:\\.\\d+)?(?:px|in|cm|mm)$/u.test(normalized)) {\n throw new Error(`pdf.printHtmlToPdf margin ${side} unit is unsupported.`);\n }\n return { [side]: normalized };\n}\n\nfunction normalizeFileOpenMode(\n value: unknown\n): TuttiExternalFileOpenInput[\"mode\"] | undefined {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n if (value === \"auto\" || value === \"preview\" || value === \"reveal\") {\n return value;\n }\n throw new Error(\"files.open mode is unsupported.\");\n}\n\nfunction normalizeRequiredString(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim() === \"\") {\n throw new Error(`${field} is required.`);\n }\n return value.trim();\n}\n\nfunction normalizeRequiredStringList(value: unknown, field: string): string[] {\n if (!Array.isArray(value)) {\n throw new Error(`${field} must be an array.`);\n }\n const normalizedValues: string[] = [];\n for (const item of value) {\n if (typeof item !== \"string\" || item.trim() === \"\") {\n throw new Error(`${field} contains an invalid value.`);\n }\n const normalizedItem = item.trim();\n if (!normalizedValues.includes(normalizedItem)) {\n normalizedValues.push(normalizedItem);\n }\n }\n return normalizedValues;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":[]}
@@ -1,4 +1,5 @@
1
1
  import { WorkspaceFileReference } from '@tutti-os/workspace-file-reference/contracts';
2
+ import { WorkspaceUserProjectPathCheck, WorkspaceUserProject, WorkspaceUserProjectDefaultSelection, WorkspaceUserProjectServiceSnapshot, WorkspaceUserProjectSelectionPreparationInput, WorkspaceUserProjectSelectionPreparation } from '@tutti-os/workspace-user-project/contracts';
2
3
 
3
4
  declare const TUTTI_EXTERNAL_AT_PROVIDER_IDS: {
4
5
  readonly agentGeneratedFile: "agent-generated-file";
@@ -99,6 +100,15 @@ interface TuttiExternalWorkspaceOpenFeatureInput {
99
100
  interface TuttiExternalReferenceOpenInput {
100
101
  href: string;
101
102
  }
103
+ interface TuttiExternalUserProjectCreateInput {
104
+ name: string;
105
+ }
106
+ interface TuttiExternalUserProjectPathInput {
107
+ path: string;
108
+ }
109
+ interface TuttiExternalUserProjectRememberDefaultSelectionInput {
110
+ path: string | null;
111
+ }
102
112
  declare const tuttiExternalLogLevels: readonly ["debug", "info", "warn", "error"];
103
113
  type TuttiExternalLogLevel = (typeof tuttiExternalLogLevels)[number];
104
114
  interface TuttiExternalLogInput {
@@ -106,6 +116,23 @@ interface TuttiExternalLogInput {
106
116
  event: string;
107
117
  level?: TuttiExternalLogLevel;
108
118
  }
119
+ interface TuttiExternalPdfMargin {
120
+ bottom?: string;
121
+ left?: string;
122
+ right?: string;
123
+ top?: string;
124
+ }
125
+ interface TuttiExternalPdfPrintHtmlInput {
126
+ baseUrl?: string;
127
+ html: string;
128
+ margin?: TuttiExternalPdfMargin;
129
+ pageSize?: "A4" | "Letter";
130
+ printBackground?: boolean;
131
+ title?: string;
132
+ }
133
+ interface TuttiExternalPdfPrintHtmlResult {
134
+ bytes: Uint8Array;
135
+ }
109
136
  interface TuttiExternalBridge {
110
137
  app: {
111
138
  getContext(): Promise<unknown>;
@@ -130,6 +157,30 @@ interface TuttiExternalBridge {
130
157
  references: {
131
158
  open(input: TuttiExternalReferenceOpenInput): Promise<void>;
132
159
  };
160
+ pdf: {
161
+ printHtmlToPdf(input: TuttiExternalPdfPrintHtmlInput): Promise<TuttiExternalPdfPrintHtmlResult>;
162
+ };
163
+ userProjects: {
164
+ checkPath(input: TuttiExternalUserProjectPathInput): Promise<WorkspaceUserProjectPathCheck>;
165
+ create(input: TuttiExternalUserProjectCreateInput): Promise<WorkspaceUserProject>;
166
+ getDefaultSelection(): Promise<WorkspaceUserProjectDefaultSelection | null>;
167
+ getSnapshot(): Promise<WorkspaceUserProjectServiceSnapshot>;
168
+ list(): Promise<{
169
+ projects: WorkspaceUserProject[];
170
+ }>;
171
+ prepareSelection(input: WorkspaceUserProjectSelectionPreparationInput): Promise<WorkspaceUserProjectSelectionPreparation>;
172
+ refresh(): Promise<WorkspaceUserProjectServiceSnapshot>;
173
+ rememberDefaultSelection(input: TuttiExternalUserProjectRememberDefaultSelectionInput): Promise<void>;
174
+ selectDirectory(): Promise<{
175
+ path: string;
176
+ } | null>;
177
+ /**
178
+ * Subscribes to user-project snapshots. Implementations replay the latest
179
+ * known snapshot after registration, then emit future snapshots.
180
+ */
181
+ subscribe(listener: (snapshot: WorkspaceUserProjectServiceSnapshot) => void): () => void;
182
+ use(input: TuttiExternalUserProjectPathInput): Promise<WorkspaceUserProject>;
183
+ };
133
184
  logs: {
134
185
  write(input: TuttiExternalLogInput): void;
135
186
  };
@@ -164,6 +215,61 @@ type TuttiExternalRendererRequest = {
164
215
  operation: "references.open";
165
216
  requestId: string;
166
217
  workspaceId: string;
218
+ } | {
219
+ appId: string;
220
+ input: TuttiExternalUserProjectPathInput;
221
+ operation: "userProjects.checkPath";
222
+ requestId: string;
223
+ workspaceId: string;
224
+ } | {
225
+ appId: string;
226
+ input: TuttiExternalUserProjectCreateInput;
227
+ operation: "userProjects.create";
228
+ requestId: string;
229
+ workspaceId: string;
230
+ } | {
231
+ appId: string;
232
+ operation: "userProjects.getDefaultSelection";
233
+ requestId: string;
234
+ workspaceId: string;
235
+ } | {
236
+ appId: string;
237
+ operation: "userProjects.getSnapshot";
238
+ requestId: string;
239
+ workspaceId: string;
240
+ } | {
241
+ appId: string;
242
+ operation: "userProjects.list";
243
+ requestId: string;
244
+ workspaceId: string;
245
+ } | {
246
+ appId: string;
247
+ input: WorkspaceUserProjectSelectionPreparationInput;
248
+ operation: "userProjects.prepareSelection";
249
+ requestId: string;
250
+ workspaceId: string;
251
+ } | {
252
+ appId: string;
253
+ operation: "userProjects.refresh";
254
+ requestId: string;
255
+ workspaceId: string;
256
+ } | {
257
+ appId: string;
258
+ input: TuttiExternalUserProjectRememberDefaultSelectionInput;
259
+ operation: "userProjects.rememberDefaultSelection";
260
+ requestId: string;
261
+ workspaceId: string;
262
+ } | {
263
+ appId: string;
264
+ operation: "userProjects.selectDirectory";
265
+ requestId: string;
266
+ workspaceId: string;
267
+ } | {
268
+ appId: string;
269
+ input: TuttiExternalUserProjectPathInput;
270
+ operation: "userProjects.use";
271
+ requestId: string;
272
+ workspaceId: string;
167
273
  };
168
274
 
169
- export { TUTTI_EXTERNAL_AT_PROVIDER_IDS, type TuttiExternalAtInsertResult, type TuttiExternalAtMentionPresentation, type TuttiExternalAtProviderId, type TuttiExternalAtQueryInput, type TuttiExternalAtQueryResult, type TuttiExternalBridge, type TuttiExternalFileOpenInput, type TuttiExternalFileSelectInput, type TuttiExternalFileSelectResult, type TuttiExternalLogInput, type TuttiExternalLogLevel, type TuttiExternalManagedAiModel, type TuttiExternalManagedAiModelProviderId, type TuttiExternalPermissionRequestInput, type TuttiExternalPermissionRequestResult, type TuttiExternalReferenceOpenInput, type TuttiExternalRendererRequest, type TuttiExternalSettingsOpenInput, type TuttiExternalWorkspaceAgentProvider, type TuttiExternalWorkspaceFeature, type TuttiExternalWorkspaceOpenFeatureInput, tuttiExternalAtProviderIds, tuttiExternalLogLevels, tuttiExternalManagedAiModelProviderIds, tuttiExternalWorkspaceAgentProviders };
275
+ export { TUTTI_EXTERNAL_AT_PROVIDER_IDS, type TuttiExternalAtInsertResult, type TuttiExternalAtMentionPresentation, type TuttiExternalAtProviderId, type TuttiExternalAtQueryInput, type TuttiExternalAtQueryResult, type TuttiExternalBridge, type TuttiExternalFileOpenInput, type TuttiExternalFileSelectInput, type TuttiExternalFileSelectResult, type TuttiExternalLogInput, type TuttiExternalLogLevel, type TuttiExternalManagedAiModel, type TuttiExternalManagedAiModelProviderId, type TuttiExternalPdfMargin, type TuttiExternalPdfPrintHtmlInput, type TuttiExternalPdfPrintHtmlResult, type TuttiExternalPermissionRequestInput, type TuttiExternalPermissionRequestResult, type TuttiExternalReferenceOpenInput, type TuttiExternalRendererRequest, type TuttiExternalSettingsOpenInput, type TuttiExternalUserProjectCreateInput, type TuttiExternalUserProjectPathInput, type TuttiExternalUserProjectRememberDefaultSelectionInput, type TuttiExternalWorkspaceAgentProvider, type TuttiExternalWorkspaceFeature, type TuttiExternalWorkspaceOpenFeatureInput, tuttiExternalAtProviderIds, tuttiExternalLogLevels, tuttiExternalManagedAiModelProviderIds, tuttiExternalWorkspaceAgentProviders };
@@ -4,7 +4,7 @@ import {
4
4
  tuttiExternalLogLevels,
5
5
  tuttiExternalManagedAiModelProviderIds,
6
6
  tuttiExternalWorkspaceAgentProviders
7
- } from "../chunk-TXIBT45W.js";
7
+ } from "../chunk-J53NLKKO.js";
8
8
  export {
9
9
  TUTTI_EXTERNAL_AT_PROVIDER_IDS,
10
10
  tuttiExternalAtProviderIds,
@@ -1,5 +1,6 @@
1
- import { TuttiExternalAtProviderId, TuttiExternalManagedAiModelProviderId, TuttiExternalWorkspaceAgentProvider, TuttiExternalWorkspaceFeature, TuttiExternalAtQueryInput, TuttiExternalFileOpenInput, TuttiExternalFileSelectInput, TuttiExternalLogInput, TuttiExternalPermissionRequestInput, TuttiExternalReferenceOpenInput, TuttiExternalSettingsOpenInput, TuttiExternalWorkspaceOpenFeatureInput } from '../contracts/index.js';
1
+ import { TuttiExternalAtProviderId, TuttiExternalManagedAiModelProviderId, TuttiExternalWorkspaceAgentProvider, TuttiExternalWorkspaceFeature, TuttiExternalAtQueryInput, TuttiExternalFileOpenInput, TuttiExternalFileSelectInput, TuttiExternalLogInput, TuttiExternalPdfPrintHtmlInput, TuttiExternalPermissionRequestInput, TuttiExternalReferenceOpenInput, TuttiExternalSettingsOpenInput, TuttiExternalUserProjectCreateInput, TuttiExternalUserProjectPathInput, TuttiExternalUserProjectRememberDefaultSelectionInput, TuttiExternalWorkspaceOpenFeatureInput } from '../contracts/index.js';
2
2
  export { tuttiExternalAtProviderIds, tuttiExternalManagedAiModelProviderIds, tuttiExternalWorkspaceAgentProviders } from '../contracts/index.js';
3
+ import { WorkspaceUserProjectSelectionPreparationInput } from '@tutti-os/workspace-user-project/contracts';
3
4
  import '@tutti-os/workspace-file-reference/contracts';
4
5
 
5
6
  declare const tuttiExternalAtMaxResultsLimit = 50;
@@ -15,9 +16,14 @@ declare function normalizeTuttiExternalPermissionRequestInput(input: unknown): T
15
16
  declare function normalizeTuttiExternalSettingsOpenInput(input: unknown): TuttiExternalSettingsOpenInput;
16
17
  declare function normalizeTuttiExternalWorkspaceOpenFeatureInput(input: unknown): TuttiExternalWorkspaceOpenFeatureInput;
17
18
  declare function normalizeTuttiExternalReferenceOpenInput(input: unknown): TuttiExternalReferenceOpenInput;
19
+ declare function normalizeTuttiExternalPdfPrintHtmlInput(input: unknown): TuttiExternalPdfPrintHtmlInput;
20
+ declare function normalizeTuttiExternalUserProjectCreateInput(input: unknown): TuttiExternalUserProjectCreateInput;
21
+ declare function normalizeTuttiExternalUserProjectPathInput(input: unknown, operation: "checkPath" | "use"): TuttiExternalUserProjectPathInput;
22
+ declare function normalizeTuttiExternalUserProjectRememberDefaultSelectionInput(input: unknown): TuttiExternalUserProjectRememberDefaultSelectionInput;
23
+ declare function normalizeTuttiExternalUserProjectSelectionPreparationInput(input: unknown): WorkspaceUserProjectSelectionPreparationInput;
18
24
  declare function isTuttiExternalAtProviderId(value: unknown): value is TuttiExternalAtProviderId;
19
25
  declare function isTuttiExternalManagedAiModelProviderId(value: unknown): value is TuttiExternalManagedAiModelProviderId;
20
26
  declare function isTuttiExternalWorkspaceFeature(value: unknown): value is TuttiExternalWorkspaceFeature;
21
27
  declare function isTuttiExternalWorkspaceAgentProvider(value: unknown): value is TuttiExternalWorkspaceAgentProvider;
22
28
 
23
- export { isTuttiExternalAtProviderId, isTuttiExternalManagedAiModelProviderId, isTuttiExternalWorkspaceAgentProvider, isTuttiExternalWorkspaceFeature, limitDiagnosticText, normalizeTuttiExternalAtQueryInput, normalizeTuttiExternalFileOpenInput, normalizeTuttiExternalFileSelectInput, normalizeTuttiExternalLogInput, normalizeTuttiExternalPermissionRequestInput, normalizeTuttiExternalReferenceOpenInput, normalizeTuttiExternalSettingsOpenInput, normalizeTuttiExternalWorkspaceOpenFeatureInput, tuttiExternalAtDefaultMaxResults, tuttiExternalAtMaxResultsLimit, tuttiExternalLogDiagnosticTextLimit, tuttiExternalWorkspaceFeatures };
29
+ export { isTuttiExternalAtProviderId, isTuttiExternalManagedAiModelProviderId, isTuttiExternalWorkspaceAgentProvider, isTuttiExternalWorkspaceFeature, limitDiagnosticText, normalizeTuttiExternalAtQueryInput, normalizeTuttiExternalFileOpenInput, normalizeTuttiExternalFileSelectInput, normalizeTuttiExternalLogInput, normalizeTuttiExternalPdfPrintHtmlInput, normalizeTuttiExternalPermissionRequestInput, normalizeTuttiExternalReferenceOpenInput, normalizeTuttiExternalSettingsOpenInput, normalizeTuttiExternalUserProjectCreateInput, normalizeTuttiExternalUserProjectPathInput, normalizeTuttiExternalUserProjectRememberDefaultSelectionInput, normalizeTuttiExternalUserProjectSelectionPreparationInput, normalizeTuttiExternalWorkspaceOpenFeatureInput, tuttiExternalAtDefaultMaxResults, tuttiExternalAtMaxResultsLimit, tuttiExternalLogDiagnosticTextLimit, tuttiExternalWorkspaceFeatures };
@@ -8,20 +8,25 @@ import {
8
8
  normalizeTuttiExternalFileOpenInput,
9
9
  normalizeTuttiExternalFileSelectInput,
10
10
  normalizeTuttiExternalLogInput,
11
+ normalizeTuttiExternalPdfPrintHtmlInput,
11
12
  normalizeTuttiExternalPermissionRequestInput,
12
13
  normalizeTuttiExternalReferenceOpenInput,
13
14
  normalizeTuttiExternalSettingsOpenInput,
15
+ normalizeTuttiExternalUserProjectCreateInput,
16
+ normalizeTuttiExternalUserProjectPathInput,
17
+ normalizeTuttiExternalUserProjectRememberDefaultSelectionInput,
18
+ normalizeTuttiExternalUserProjectSelectionPreparationInput,
14
19
  normalizeTuttiExternalWorkspaceOpenFeatureInput,
15
20
  tuttiExternalAtDefaultMaxResults,
16
21
  tuttiExternalAtMaxResultsLimit,
17
22
  tuttiExternalLogDiagnosticTextLimit,
18
23
  tuttiExternalWorkspaceFeatures
19
- } from "../chunk-JKLKTSUO.js";
24
+ } from "../chunk-LGELOEVW.js";
20
25
  import {
21
26
  tuttiExternalAtProviderIds,
22
27
  tuttiExternalManagedAiModelProviderIds,
23
28
  tuttiExternalWorkspaceAgentProviders
24
- } from "../chunk-TXIBT45W.js";
29
+ } from "../chunk-J53NLKKO.js";
25
30
  export {
26
31
  isTuttiExternalAtProviderId,
27
32
  isTuttiExternalManagedAiModelProviderId,
@@ -32,9 +37,14 @@ export {
32
37
  normalizeTuttiExternalFileOpenInput,
33
38
  normalizeTuttiExternalFileSelectInput,
34
39
  normalizeTuttiExternalLogInput,
40
+ normalizeTuttiExternalPdfPrintHtmlInput,
35
41
  normalizeTuttiExternalPermissionRequestInput,
36
42
  normalizeTuttiExternalReferenceOpenInput,
37
43
  normalizeTuttiExternalSettingsOpenInput,
44
+ normalizeTuttiExternalUserProjectCreateInput,
45
+ normalizeTuttiExternalUserProjectPathInput,
46
+ normalizeTuttiExternalUserProjectRememberDefaultSelectionInput,
47
+ normalizeTuttiExternalUserProjectSelectionPreparationInput,
38
48
  normalizeTuttiExternalWorkspaceOpenFeatureInput,
39
49
  tuttiExternalAtDefaultMaxResults,
40
50
  tuttiExternalAtMaxResultsLimit,
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
- export { TUTTI_EXTERNAL_AT_PROVIDER_IDS, TuttiExternalAtInsertResult, TuttiExternalAtMentionPresentation, TuttiExternalAtProviderId, TuttiExternalAtQueryInput, TuttiExternalAtQueryResult, TuttiExternalBridge, TuttiExternalFileOpenInput, TuttiExternalFileSelectInput, TuttiExternalFileSelectResult, TuttiExternalLogInput, TuttiExternalLogLevel, TuttiExternalManagedAiModel, TuttiExternalManagedAiModelProviderId, TuttiExternalPermissionRequestInput, TuttiExternalPermissionRequestResult, TuttiExternalReferenceOpenInput, TuttiExternalRendererRequest, TuttiExternalSettingsOpenInput, TuttiExternalWorkspaceAgentProvider, TuttiExternalWorkspaceFeature, TuttiExternalWorkspaceOpenFeatureInput, tuttiExternalAtProviderIds, tuttiExternalLogLevels, tuttiExternalManagedAiModelProviderIds, tuttiExternalWorkspaceAgentProviders } from './contracts/index.js';
2
- export { isTuttiExternalAtProviderId, isTuttiExternalManagedAiModelProviderId, isTuttiExternalWorkspaceAgentProvider, isTuttiExternalWorkspaceFeature, limitDiagnosticText, normalizeTuttiExternalAtQueryInput, normalizeTuttiExternalFileOpenInput, normalizeTuttiExternalFileSelectInput, normalizeTuttiExternalLogInput, normalizeTuttiExternalPermissionRequestInput, normalizeTuttiExternalReferenceOpenInput, normalizeTuttiExternalSettingsOpenInput, normalizeTuttiExternalWorkspaceOpenFeatureInput, tuttiExternalAtDefaultMaxResults, tuttiExternalAtMaxResultsLimit, tuttiExternalLogDiagnosticTextLimit, tuttiExternalWorkspaceFeatures } from './core/index.js';
1
+ export { TUTTI_EXTERNAL_AT_PROVIDER_IDS, TuttiExternalAtInsertResult, TuttiExternalAtMentionPresentation, TuttiExternalAtProviderId, TuttiExternalAtQueryInput, TuttiExternalAtQueryResult, TuttiExternalBridge, TuttiExternalFileOpenInput, TuttiExternalFileSelectInput, TuttiExternalFileSelectResult, TuttiExternalLogInput, TuttiExternalLogLevel, TuttiExternalManagedAiModel, TuttiExternalManagedAiModelProviderId, TuttiExternalPdfMargin, TuttiExternalPdfPrintHtmlInput, TuttiExternalPdfPrintHtmlResult, TuttiExternalPermissionRequestInput, TuttiExternalPermissionRequestResult, TuttiExternalReferenceOpenInput, TuttiExternalRendererRequest, TuttiExternalSettingsOpenInput, TuttiExternalUserProjectCreateInput, TuttiExternalUserProjectPathInput, TuttiExternalUserProjectRememberDefaultSelectionInput, TuttiExternalWorkspaceAgentProvider, TuttiExternalWorkspaceFeature, TuttiExternalWorkspaceOpenFeatureInput, tuttiExternalAtProviderIds, tuttiExternalLogLevels, tuttiExternalManagedAiModelProviderIds, tuttiExternalWorkspaceAgentProviders } from './contracts/index.js';
2
+ export { isTuttiExternalAtProviderId, isTuttiExternalManagedAiModelProviderId, isTuttiExternalWorkspaceAgentProvider, isTuttiExternalWorkspaceFeature, limitDiagnosticText, normalizeTuttiExternalAtQueryInput, normalizeTuttiExternalFileOpenInput, normalizeTuttiExternalFileSelectInput, normalizeTuttiExternalLogInput, normalizeTuttiExternalPdfPrintHtmlInput, normalizeTuttiExternalPermissionRequestInput, normalizeTuttiExternalReferenceOpenInput, normalizeTuttiExternalSettingsOpenInput, normalizeTuttiExternalUserProjectCreateInput, normalizeTuttiExternalUserProjectPathInput, normalizeTuttiExternalUserProjectRememberDefaultSelectionInput, normalizeTuttiExternalUserProjectSelectionPreparationInput, normalizeTuttiExternalWorkspaceOpenFeatureInput, tuttiExternalAtDefaultMaxResults, tuttiExternalAtMaxResultsLimit, tuttiExternalLogDiagnosticTextLimit, tuttiExternalWorkspaceFeatures } from './core/index.js';
3
3
  import '@tutti-os/workspace-file-reference/contracts';
4
+ import '@tutti-os/workspace-user-project/contracts';
package/dist/index.js CHANGED
@@ -8,20 +8,25 @@ import {
8
8
  normalizeTuttiExternalFileOpenInput,
9
9
  normalizeTuttiExternalFileSelectInput,
10
10
  normalizeTuttiExternalLogInput,
11
+ normalizeTuttiExternalPdfPrintHtmlInput,
11
12
  normalizeTuttiExternalPermissionRequestInput,
12
13
  normalizeTuttiExternalReferenceOpenInput,
13
14
  normalizeTuttiExternalSettingsOpenInput,
15
+ normalizeTuttiExternalUserProjectCreateInput,
16
+ normalizeTuttiExternalUserProjectPathInput,
17
+ normalizeTuttiExternalUserProjectRememberDefaultSelectionInput,
18
+ normalizeTuttiExternalUserProjectSelectionPreparationInput,
14
19
  normalizeTuttiExternalWorkspaceOpenFeatureInput,
15
20
  tuttiExternalAtDefaultMaxResults,
16
21
  tuttiExternalAtMaxResultsLimit,
17
22
  tuttiExternalLogDiagnosticTextLimit,
18
23
  tuttiExternalWorkspaceFeatures
19
- } from "./chunk-JKLKTSUO.js";
24
+ } from "./chunk-LGELOEVW.js";
20
25
  import {
21
26
  tuttiExternalAtProviderIds,
22
27
  tuttiExternalManagedAiModelProviderIds,
23
28
  tuttiExternalWorkspaceAgentProviders
24
- } from "./chunk-TXIBT45W.js";
29
+ } from "./chunk-J53NLKKO.js";
25
30
  export {
26
31
  isTuttiExternalAtProviderId,
27
32
  isTuttiExternalManagedAiModelProviderId,
@@ -32,9 +37,14 @@ export {
32
37
  normalizeTuttiExternalFileOpenInput,
33
38
  normalizeTuttiExternalFileSelectInput,
34
39
  normalizeTuttiExternalLogInput,
40
+ normalizeTuttiExternalPdfPrintHtmlInput,
35
41
  normalizeTuttiExternalPermissionRequestInput,
36
42
  normalizeTuttiExternalReferenceOpenInput,
37
43
  normalizeTuttiExternalSettingsOpenInput,
44
+ normalizeTuttiExternalUserProjectCreateInput,
45
+ normalizeTuttiExternalUserProjectPathInput,
46
+ normalizeTuttiExternalUserProjectRememberDefaultSelectionInput,
47
+ normalizeTuttiExternalUserProjectSelectionPreparationInput,
38
48
  normalizeTuttiExternalWorkspaceOpenFeatureInput,
39
49
  tuttiExternalAtDefaultMaxResults,
40
50
  tuttiExternalAtMaxResultsLimit,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tutti-os/workspace-external-core",
3
- "version": "0.0.15",
3
+ "version": "0.0.17",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -28,7 +28,8 @@
28
28
  "directory": "packages/workspace/external-core"
29
29
  },
30
30
  "dependencies": {
31
- "@tutti-os/workspace-file-reference": "0.0.15"
31
+ "@tutti-os/workspace-file-reference": "0.0.17",
32
+ "@tutti-os/workspace-user-project": "0.0.17"
32
33
  },
33
34
  "devDependencies": {
34
35
  "@types/node": "^24.0.1",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/index.ts"],"sourcesContent":["import {\n tuttiExternalManagedAiModelProviderIds,\n tuttiExternalAtProviderIds,\n tuttiExternalWorkspaceAgentProviders,\n type TuttiExternalAtProviderId,\n type TuttiExternalAtQueryInput,\n type TuttiExternalFileOpenInput,\n type TuttiExternalFileSelectInput,\n type TuttiExternalLogInput,\n type TuttiExternalLogLevel,\n type TuttiExternalManagedAiModelProviderId,\n type TuttiExternalPermissionRequestInput,\n type TuttiExternalReferenceOpenInput,\n type TuttiExternalSettingsOpenInput,\n type TuttiExternalWorkspaceAgentProvider,\n type TuttiExternalWorkspaceFeature,\n type TuttiExternalWorkspaceOpenFeatureInput\n} from \"../contracts/index.ts\";\n\nexport {\n tuttiExternalAtProviderIds,\n tuttiExternalManagedAiModelProviderIds,\n tuttiExternalWorkspaceAgentProviders\n} from \"../contracts/index.ts\";\n\nexport const tuttiExternalAtMaxResultsLimit = 50;\nexport const tuttiExternalAtDefaultMaxResults = 20;\nexport const tuttiExternalLogDiagnosticTextLimit = 8_000;\nexport const tuttiExternalWorkspaceFeatures = [\n \"app-center\",\n \"issue-manager\",\n \"message-center\",\n \"agent-connect\",\n \"agent-chat\"\n] as const satisfies readonly TuttiExternalWorkspaceFeature[];\n\nexport function limitDiagnosticText(\n value: string | undefined\n): string | undefined {\n const trimmed = value?.trim();\n if (!trimmed) {\n return undefined;\n }\n return trimmed.length > tuttiExternalLogDiagnosticTextLimit\n ? `${trimmed.slice(0, tuttiExternalLogDiagnosticTextLimit)}...`\n : trimmed;\n}\n\nexport function normalizeTuttiExternalLogInput(\n input: unknown\n): TuttiExternalLogInput {\n if (!isRecord(input)) {\n throw new Error(\"logs.write input must be an object.\");\n }\n\n const event = limitDiagnosticText(\n normalizeRequiredString(input.event, \"logs.write event\")\n );\n if (!event) {\n throw new Error(\"logs.write event is required.\");\n }\n\n return {\n event,\n ...(input.level !== undefined && input.level !== null\n ? { level: normalizeTuttiExternalLogLevel(input.level) }\n : {}),\n ...(input.details !== undefined && input.details !== null\n ? { details: normalizeTuttiExternalLogDetails(input.details) }\n : {})\n };\n}\n\nexport function normalizeTuttiExternalAtQueryInput(\n input: unknown\n): TuttiExternalAtQueryInput {\n if (!isRecord(input)) {\n throw new Error(\"at.query input must be an object.\");\n }\n\n const keywordValue = input.keyword;\n if (typeof keywordValue !== \"string\") {\n throw new Error(\"at.query keyword is required.\");\n }\n\n return {\n keyword: keywordValue,\n maxResults: normalizeMaxResults(input.maxResults),\n providers: normalizeProviders(input.providers)\n };\n}\n\nexport function normalizeTuttiExternalFileSelectInput(\n input: unknown\n): TuttiExternalFileSelectInput {\n if (input === undefined || input === null) {\n return {};\n }\n if (!isRecord(input)) {\n throw new Error(\"files.select input must be an object.\");\n }\n return {\n multiple: input.multiple === true\n };\n}\n\nexport function normalizeTuttiExternalFileOpenInput(\n input: unknown\n): TuttiExternalFileOpenInput {\n if (!isRecord(input)) {\n throw new Error(\"files.open input must be an object.\");\n }\n if (typeof input.path !== \"string\" || input.path.trim() === \"\") {\n throw new Error(\"files.open path is required.\");\n }\n const mode = normalizeFileOpenMode(input.mode);\n return {\n ...(mode ? { mode } : {}),\n ...(typeof input.mtimeMs === \"number\" || input.mtimeMs === null\n ? { mtimeMs: input.mtimeMs }\n : {}),\n ...(typeof input.name === \"string\" && input.name.trim() !== \"\"\n ? { name: input.name.trim() }\n : {}),\n path: input.path.trim(),\n ...(typeof input.sizeBytes === \"number\" || input.sizeBytes === null\n ? { sizeBytes: input.sizeBytes }\n : {})\n };\n}\n\nexport function normalizeTuttiExternalPermissionRequestInput(\n input: unknown\n): TuttiExternalPermissionRequestInput {\n if (!isRecord(input)) {\n throw new Error(\"permissions.request input must be an object.\");\n }\n if (input.permission !== \"managed-ai-models\") {\n throw new Error(\"permissions.request permission is unsupported.\");\n }\n const nonce = normalizeRequiredString(\n input.nonce,\n \"permissions.request nonce\"\n );\n const state = normalizeRequiredString(\n input.state,\n \"permissions.request state\"\n );\n const scopes = normalizeRequiredStringList(\n input.scopes,\n \"permissions.request scopes\"\n );\n if (scopes.length === 0) {\n throw new Error(\"permissions.request scopes must not be empty.\");\n }\n\n return {\n nonce,\n permission: \"managed-ai-models\",\n providers: normalizeManagedAiModelProviders(input.providers),\n scopes,\n state\n };\n}\n\nexport function normalizeTuttiExternalSettingsOpenInput(\n input: unknown\n): TuttiExternalSettingsOpenInput {\n if (input === undefined || input === null) {\n return {};\n }\n if (!isRecord(input)) {\n throw new Error(\"settings.open input must be an object.\");\n }\n if (\n input.tab !== undefined &&\n input.tab !== null &&\n input.tab !== \"\" &&\n input.tab !== \"models\"\n ) {\n throw new Error(\"settings.open tab is unsupported.\");\n }\n return {\n ...(input.provider !== undefined && input.provider !== null\n ? { provider: normalizeManagedAiModelProvider(input.provider) }\n : {}),\n ...(input.tab === \"models\" ? { tab: \"models\" as const } : {})\n };\n}\n\nexport function normalizeTuttiExternalWorkspaceOpenFeatureInput(\n input: unknown\n): TuttiExternalWorkspaceOpenFeatureInput {\n if (!isRecord(input)) {\n throw new Error(\"workspace.openFeature input must be an object.\");\n }\n const feature = input.feature;\n if (!isTuttiExternalWorkspaceFeature(feature)) {\n throw new Error(\"workspace.openFeature feature is unsupported.\");\n }\n const draftPrompt =\n typeof input.draftPrompt === \"string\" ? input.draftPrompt.trim() : \"\";\n return {\n feature,\n ...(draftPrompt ? { draftPrompt } : {}),\n ...(input.autoSubmit === true ? { autoSubmit: true } : {}),\n ...(typeof input.provider === \"string\" && input.provider.trim() !== \"\"\n ? {\n provider: normalizeTuttiExternalWorkspaceAgentProvider(input.provider)\n }\n : {})\n };\n}\n\nexport function normalizeTuttiExternalReferenceOpenInput(\n input: unknown\n): TuttiExternalReferenceOpenInput {\n if (!isRecord(input)) {\n throw new Error(\"references.open input must be an object.\");\n }\n const href = normalizeRequiredString(input.href, \"references.open href\");\n if (!href.toLowerCase().startsWith(\"mention://\")) {\n throw new Error(\"references.open href must be a mention URL.\");\n }\n return { href };\n}\n\nexport function isTuttiExternalAtProviderId(\n value: unknown\n): value is TuttiExternalAtProviderId {\n return (\n typeof value === \"string\" &&\n tuttiExternalAtProviderIds.includes(value as TuttiExternalAtProviderId)\n );\n}\n\nexport function isTuttiExternalManagedAiModelProviderId(\n value: unknown\n): value is TuttiExternalManagedAiModelProviderId {\n return (\n typeof value === \"string\" &&\n tuttiExternalManagedAiModelProviderIds.includes(\n value as TuttiExternalManagedAiModelProviderId\n )\n );\n}\n\nexport function isTuttiExternalWorkspaceFeature(\n value: unknown\n): value is TuttiExternalWorkspaceFeature {\n return (\n typeof value === \"string\" &&\n tuttiExternalWorkspaceFeatures.includes(\n value as TuttiExternalWorkspaceFeature\n )\n );\n}\n\nexport function isTuttiExternalWorkspaceAgentProvider(\n value: unknown\n): value is TuttiExternalWorkspaceAgentProvider {\n return (\n typeof value === \"string\" &&\n tuttiExternalWorkspaceAgentProviders.includes(\n value as TuttiExternalWorkspaceAgentProvider\n )\n );\n}\n\nfunction normalizeTuttiExternalWorkspaceAgentProvider(\n value: unknown\n): TuttiExternalWorkspaceAgentProvider {\n const provider = typeof value === \"string\" ? value.trim() : value;\n if (!isTuttiExternalWorkspaceAgentProvider(provider)) {\n throw new Error(\"workspace.openFeature provider is unsupported.\");\n }\n return provider;\n}\n\nfunction normalizeTuttiExternalLogLevel(value: unknown): TuttiExternalLogLevel {\n if (\n value === \"debug\" ||\n value === \"info\" ||\n value === \"warn\" ||\n value === \"error\"\n ) {\n return value;\n }\n throw new Error(\"logs.write level is unsupported.\");\n}\n\nfunction normalizeTuttiExternalLogDetails(\n value: unknown\n): Record<string, unknown> {\n if (!isRecord(value)) {\n throw new Error(\"logs.write details must be an object.\");\n }\n\n const details: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n details[key] = normalizeTuttiExternalLogDetailValue(entry);\n }\n return details;\n}\n\nfunction normalizeTuttiExternalLogDetailValue(value: unknown): unknown {\n if (typeof value === \"string\") {\n return limitDiagnosticText(value) ?? \"\";\n }\n if (value instanceof Error) {\n return {\n message: limitDiagnosticText(value.message) ?? \"\",\n name: value.name,\n stack: limitDiagnosticText(value.stack)\n };\n }\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeTuttiExternalLogDetailValue(entry));\n }\n if (isRecord(value)) {\n return normalizeTuttiExternalLogDetails(value);\n }\n return value;\n}\n\nfunction normalizeMaxResults(value: unknown): number {\n if (value === undefined || value === null) {\n return tuttiExternalAtDefaultMaxResults;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(\"at.query maxResults must be a finite number.\");\n }\n const integer = Math.floor(value);\n if (integer < 0) {\n throw new Error(\"at.query maxResults must be greater than or equal to 0.\");\n }\n return Math.min(integer, tuttiExternalAtMaxResultsLimit);\n}\n\nfunction normalizeProviders(\n value: unknown\n): readonly TuttiExternalAtProviderId[] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n throw new Error(\"at.query providers must be an array.\");\n }\n const providers: TuttiExternalAtProviderId[] = [];\n for (const provider of value) {\n if (!isTuttiExternalAtProviderId(provider)) {\n throw new Error(\"at.query providers contains an unsupported provider.\");\n }\n if (!providers.includes(provider)) {\n providers.push(provider);\n }\n }\n return providers;\n}\n\nfunction normalizeManagedAiModelProviders(\n value: unknown\n): readonly TuttiExternalManagedAiModelProviderId[] | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (!Array.isArray(value)) {\n throw new Error(\"permissions.request providers must be an array.\");\n }\n const providers: TuttiExternalManagedAiModelProviderId[] = [];\n for (const provider of value) {\n const normalizedProvider = normalizeManagedAiModelProvider(provider);\n if (!providers.includes(normalizedProvider)) {\n providers.push(normalizedProvider);\n }\n }\n return providers;\n}\n\nfunction normalizeManagedAiModelProvider(\n value: unknown\n): TuttiExternalManagedAiModelProviderId {\n if (!isTuttiExternalManagedAiModelProviderId(value)) {\n throw new Error(\"managed AI model provider is unsupported.\");\n }\n return value;\n}\n\nfunction normalizeFileOpenMode(\n value: unknown\n): TuttiExternalFileOpenInput[\"mode\"] | undefined {\n if (value === undefined || value === null || value === \"\") {\n return undefined;\n }\n if (value === \"auto\" || value === \"preview\" || value === \"reveal\") {\n return value;\n }\n throw new Error(\"files.open mode is unsupported.\");\n}\n\nfunction normalizeRequiredString(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim() === \"\") {\n throw new Error(`${field} is required.`);\n }\n return value.trim();\n}\n\nfunction normalizeRequiredStringList(value: unknown, field: string): string[] {\n if (!Array.isArray(value)) {\n throw new Error(`${field} must be an array.`);\n }\n const normalizedValues: string[] = [];\n for (const item of value) {\n if (typeof item !== \"string\" || item.trim() === \"\") {\n throw new Error(`${field} contains an invalid value.`);\n }\n const normalizedItem = item.trim();\n if (!normalizedValues.includes(normalizedItem)) {\n normalizedValues.push(normalizedItem);\n }\n }\n return normalizedValues;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/contracts/index.ts"],"sourcesContent":["import type { WorkspaceFileReference } from \"@tutti-os/workspace-file-reference/contracts\";\n\nexport const TUTTI_EXTERNAL_AT_PROVIDER_IDS = {\n agentGeneratedFile: \"agent-generated-file\",\n agentSession: \"agent-session\",\n file: \"file\",\n workspaceApp: \"workspace-app\",\n workspaceIssue: \"workspace-issue\"\n} as const;\n\nexport type TuttiExternalAtProviderId =\n (typeof TUTTI_EXTERNAL_AT_PROVIDER_IDS)[keyof typeof TUTTI_EXTERNAL_AT_PROVIDER_IDS];\n\nexport const tuttiExternalAtProviderIds = [\n TUTTI_EXTERNAL_AT_PROVIDER_IDS.file,\n TUTTI_EXTERNAL_AT_PROVIDER_IDS.workspaceIssue,\n TUTTI_EXTERNAL_AT_PROVIDER_IDS.workspaceApp,\n TUTTI_EXTERNAL_AT_PROVIDER_IDS.agentSession,\n TUTTI_EXTERNAL_AT_PROVIDER_IDS.agentGeneratedFile\n] as const satisfies readonly TuttiExternalAtProviderId[];\n\nexport interface TuttiExternalAtQueryInput {\n keyword: string;\n maxResults?: number;\n providers?: readonly TuttiExternalAtProviderId[];\n}\n\nexport interface TuttiExternalAtQueryResult {\n providerId: TuttiExternalAtProviderId;\n itemId: string;\n label: string;\n subtitle?: string;\n thumbnailUrl?: string | null;\n insert: TuttiExternalAtInsertResult;\n}\n\nexport interface TuttiExternalAtMentionPresentation {\n agentProviderId?: string;\n agentIconUrl?: string;\n iconUrl?: string;\n thumbnailUrl?: string;\n subtitle?: string;\n description?: string;\n participant?: string;\n status?: string;\n statusDataStatus?: string;\n statusLabel?: string;\n statusPulse?: string;\n userAvatarPlaceholderUrl?: string;\n}\n\nexport type TuttiExternalAtInsertResult =\n | {\n kind: \"mention\";\n mention: {\n entityId: string;\n label: string;\n scope?: Record<string, string>;\n presentation?: TuttiExternalAtMentionPresentation;\n };\n }\n | {\n kind: \"markdown-link\";\n label: string;\n href: string;\n }\n | {\n kind: \"text\";\n text: string;\n };\n\nexport interface TuttiExternalFileSelectInput {\n multiple?: boolean;\n}\n\nexport type TuttiExternalFileSelectResult = WorkspaceFileReference[];\n\nexport interface TuttiExternalFileOpenInput {\n mode?: \"auto\" | \"preview\" | \"reveal\";\n mtimeMs?: number | null;\n name?: string;\n path: string;\n sizeBytes?: number | null;\n}\n\nexport const tuttiExternalManagedAiModelProviderIds = [\n \"agnes\",\n \"openai\",\n \"anthropic\"\n] as const;\n\nexport type TuttiExternalManagedAiModelProviderId =\n (typeof tuttiExternalManagedAiModelProviderIds)[number];\n\nexport interface TuttiExternalManagedAiModel {\n id: string;\n name?: string;\n provider: TuttiExternalManagedAiModelProviderId;\n}\n\nexport interface TuttiExternalPermissionRequestInput {\n permission: \"managed-ai-models\";\n nonce: string;\n providers?: readonly TuttiExternalManagedAiModelProviderId[];\n scopes: readonly string[];\n state: string;\n}\n\nexport interface TuttiExternalPermissionRequestResult {\n code: string;\n expiresAt?: string;\n models?: readonly TuttiExternalManagedAiModel[];\n providers?: readonly TuttiExternalManagedAiModelProviderId[];\n}\n\nexport interface TuttiExternalSettingsOpenInput {\n provider?: TuttiExternalManagedAiModelProviderId;\n tab?: \"models\";\n}\n\nexport type TuttiExternalWorkspaceFeature =\n | \"app-center\"\n | \"issue-manager\"\n | \"message-center\"\n | \"agent-connect\"\n | \"agent-chat\";\n\nexport const tuttiExternalWorkspaceAgentProviders = [\n \"claude-code\",\n \"codex\",\n \"nexight\",\n \"hermes\",\n \"gemini\",\n \"openclaw\"\n] as const;\n\nexport type TuttiExternalWorkspaceAgentProvider =\n (typeof tuttiExternalWorkspaceAgentProviders)[number];\n\nexport interface TuttiExternalWorkspaceOpenFeatureInput {\n autoSubmit?: boolean;\n draftPrompt?: string;\n feature: TuttiExternalWorkspaceFeature;\n provider?: TuttiExternalWorkspaceAgentProvider;\n}\n\nexport interface TuttiExternalReferenceOpenInput {\n href: string;\n}\n\nexport const tuttiExternalLogLevels = [\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n] as const;\n\nexport type TuttiExternalLogLevel = (typeof tuttiExternalLogLevels)[number];\n\nexport interface TuttiExternalLogInput {\n details?: Record<string, unknown>;\n event: string;\n level?: TuttiExternalLogLevel;\n}\n\nexport interface TuttiExternalBridge {\n app: {\n getContext(): Promise<unknown>;\n subscribe(listener: (context: unknown) => void): () => void;\n };\n at: {\n query(\n input: TuttiExternalAtQueryInput\n ): Promise<TuttiExternalAtQueryResult[]>;\n };\n files: {\n select(\n input?: TuttiExternalFileSelectInput\n ): Promise<TuttiExternalFileSelectResult>;\n open(input: TuttiExternalFileOpenInput): Promise<void>;\n };\n permissions: {\n request(\n input: TuttiExternalPermissionRequestInput\n ): Promise<TuttiExternalPermissionRequestResult>;\n };\n settings: {\n open(input?: TuttiExternalSettingsOpenInput): Promise<void>;\n };\n workspace: {\n openFeature(input: TuttiExternalWorkspaceOpenFeatureInput): Promise<void>;\n };\n references: {\n open(input: TuttiExternalReferenceOpenInput): Promise<void>;\n };\n logs: {\n write(input: TuttiExternalLogInput): void;\n };\n}\n\nexport type TuttiExternalRendererRequest =\n | {\n appId: string;\n input: TuttiExternalAtQueryInput;\n operation: \"at.query\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n input: TuttiExternalFileSelectInput;\n operation: \"files.select\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n input: TuttiExternalFileOpenInput;\n operation: \"files.open\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n input: TuttiExternalSettingsOpenInput;\n operation: \"settings.open\";\n requestId: string;\n workspaceId: string;\n }\n | {\n appId: string;\n input: TuttiExternalReferenceOpenInput;\n operation: \"references.open\";\n requestId: string;\n workspaceId: string;\n };\n"],"mappings":";AAEO,IAAM,iCAAiC;AAAA,EAC5C,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,MAAM;AAAA,EACN,cAAc;AAAA,EACd,gBAAgB;AAClB;AAKO,IAAM,6BAA6B;AAAA,EACxC,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,+BAA+B;AACjC;AAkEO,IAAM,yCAAyC;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AACF;AAsCO,IAAM,uCAAuC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAgBO,IAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;","names":[]}