@tutti-os/workspace-external-core 0.0.14 → 0.0.16

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,4 +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.
22
+ - `workspace.openFeature()` for user-activated host workspace navigation, such as opening the message center.
23
+ - `logs.write()` for fire-and-forget frontend diagnostics that append to the workspace app `web.log`.
@@ -18,10 +18,26 @@ var tuttiExternalManagedAiModelProviderIds = [
18
18
  "openai",
19
19
  "anthropic"
20
20
  ];
21
+ var tuttiExternalWorkspaceAgentProviders = [
22
+ "claude-code",
23
+ "codex",
24
+ "nexight",
25
+ "hermes",
26
+ "gemini",
27
+ "openclaw"
28
+ ];
29
+ var tuttiExternalLogLevels = [
30
+ "debug",
31
+ "info",
32
+ "warn",
33
+ "error"
34
+ ];
21
35
 
22
36
  export {
23
37
  TUTTI_EXTERNAL_AT_PROVIDER_IDS,
24
38
  tuttiExternalAtProviderIds,
25
- tuttiExternalManagedAiModelProviderIds
39
+ tuttiExternalManagedAiModelProviderIds,
40
+ tuttiExternalWorkspaceAgentProviders,
41
+ tuttiExternalLogLevels
26
42
  };
27
- //# sourceMappingURL=chunk-4L4Z627Q.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":[]}
@@ -0,0 +1,423 @@
1
+ import {
2
+ tuttiExternalAtProviderIds,
3
+ tuttiExternalManagedAiModelProviderIds,
4
+ tuttiExternalWorkspaceAgentProviders
5
+ } from "./chunk-J53NLKKO.js";
6
+
7
+ // src/core/index.ts
8
+ var tuttiExternalAtMaxResultsLimit = 50;
9
+ var tuttiExternalAtDefaultMaxResults = 20;
10
+ var tuttiExternalLogDiagnosticTextLimit = 8e3;
11
+ var tuttiExternalWorkspaceFeatures = [
12
+ "app-center",
13
+ "issue-manager",
14
+ "message-center",
15
+ "agent-connect",
16
+ "agent-chat"
17
+ ];
18
+ function limitDiagnosticText(value) {
19
+ const trimmed = value?.trim();
20
+ if (!trimmed) {
21
+ return void 0;
22
+ }
23
+ return trimmed.length > tuttiExternalLogDiagnosticTextLimit ? `${trimmed.slice(0, tuttiExternalLogDiagnosticTextLimit)}...` : trimmed;
24
+ }
25
+ function normalizeTuttiExternalLogInput(input) {
26
+ if (!isRecord(input)) {
27
+ throw new Error("logs.write input must be an object.");
28
+ }
29
+ const event = limitDiagnosticText(
30
+ normalizeRequiredString(input.event, "logs.write event")
31
+ );
32
+ if (!event) {
33
+ throw new Error("logs.write event is required.");
34
+ }
35
+ return {
36
+ event,
37
+ ...input.level !== void 0 && input.level !== null ? { level: normalizeTuttiExternalLogLevel(input.level) } : {},
38
+ ...input.details !== void 0 && input.details !== null ? { details: normalizeTuttiExternalLogDetails(input.details) } : {}
39
+ };
40
+ }
41
+ function normalizeTuttiExternalAtQueryInput(input) {
42
+ if (!isRecord(input)) {
43
+ throw new Error("at.query input must be an object.");
44
+ }
45
+ const keywordValue = input.keyword;
46
+ if (typeof keywordValue !== "string") {
47
+ throw new Error("at.query keyword is required.");
48
+ }
49
+ return {
50
+ keyword: keywordValue,
51
+ maxResults: normalizeMaxResults(input.maxResults),
52
+ providers: normalizeProviders(input.providers)
53
+ };
54
+ }
55
+ function normalizeTuttiExternalFileSelectInput(input) {
56
+ if (input === void 0 || input === null) {
57
+ return {};
58
+ }
59
+ if (!isRecord(input)) {
60
+ throw new Error("files.select input must be an object.");
61
+ }
62
+ return {
63
+ multiple: input.multiple === true
64
+ };
65
+ }
66
+ function normalizeTuttiExternalFileOpenInput(input) {
67
+ if (!isRecord(input)) {
68
+ throw new Error("files.open input must be an object.");
69
+ }
70
+ if (typeof input.path !== "string" || input.path.trim() === "") {
71
+ throw new Error("files.open path is required.");
72
+ }
73
+ const mode = normalizeFileOpenMode(input.mode);
74
+ return {
75
+ ...mode ? { mode } : {},
76
+ ...typeof input.mtimeMs === "number" || input.mtimeMs === null ? { mtimeMs: input.mtimeMs } : {},
77
+ ...typeof input.name === "string" && input.name.trim() !== "" ? { name: input.name.trim() } : {},
78
+ path: input.path.trim(),
79
+ ...typeof input.sizeBytes === "number" || input.sizeBytes === null ? { sizeBytes: input.sizeBytes } : {}
80
+ };
81
+ }
82
+ function normalizeTuttiExternalPermissionRequestInput(input) {
83
+ if (!isRecord(input)) {
84
+ throw new Error("permissions.request input must be an object.");
85
+ }
86
+ if (input.permission !== "managed-ai-models") {
87
+ throw new Error("permissions.request permission is unsupported.");
88
+ }
89
+ const nonce = normalizeRequiredString(
90
+ input.nonce,
91
+ "permissions.request nonce"
92
+ );
93
+ const state = normalizeRequiredString(
94
+ input.state,
95
+ "permissions.request state"
96
+ );
97
+ const scopes = normalizeRequiredStringList(
98
+ input.scopes,
99
+ "permissions.request scopes"
100
+ );
101
+ if (scopes.length === 0) {
102
+ throw new Error("permissions.request scopes must not be empty.");
103
+ }
104
+ return {
105
+ nonce,
106
+ permission: "managed-ai-models",
107
+ providers: normalizeManagedAiModelProviders(input.providers),
108
+ scopes,
109
+ state
110
+ };
111
+ }
112
+ function normalizeTuttiExternalSettingsOpenInput(input) {
113
+ if (input === void 0 || input === null) {
114
+ return {};
115
+ }
116
+ if (!isRecord(input)) {
117
+ throw new Error("settings.open input must be an object.");
118
+ }
119
+ if (input.tab !== void 0 && input.tab !== null && input.tab !== "" && input.tab !== "models") {
120
+ throw new Error("settings.open tab is unsupported.");
121
+ }
122
+ return {
123
+ ...input.provider !== void 0 && input.provider !== null ? { provider: normalizeManagedAiModelProvider(input.provider) } : {},
124
+ ...input.tab === "models" ? { tab: "models" } : {}
125
+ };
126
+ }
127
+ function normalizeTuttiExternalWorkspaceOpenFeatureInput(input) {
128
+ if (!isRecord(input)) {
129
+ throw new Error("workspace.openFeature input must be an object.");
130
+ }
131
+ const feature = input.feature;
132
+ if (!isTuttiExternalWorkspaceFeature(feature)) {
133
+ throw new Error("workspace.openFeature feature is unsupported.");
134
+ }
135
+ const draftPrompt = typeof input.draftPrompt === "string" ? input.draftPrompt.trim() : "";
136
+ return {
137
+ feature,
138
+ ...draftPrompt ? { draftPrompt } : {},
139
+ ...input.autoSubmit === true ? { autoSubmit: true } : {},
140
+ ...typeof input.provider === "string" && input.provider.trim() !== "" ? {
141
+ provider: normalizeTuttiExternalWorkspaceAgentProvider(input.provider)
142
+ } : {}
143
+ };
144
+ }
145
+ function normalizeTuttiExternalReferenceOpenInput(input) {
146
+ if (!isRecord(input)) {
147
+ throw new Error("references.open input must be an object.");
148
+ }
149
+ const href = normalizeRequiredString(input.href, "references.open href");
150
+ if (!href.toLowerCase().startsWith("mention://")) {
151
+ throw new Error("references.open href must be a mention URL.");
152
+ }
153
+ return { href };
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
+ }
209
+ function isTuttiExternalAtProviderId(value) {
210
+ return typeof value === "string" && tuttiExternalAtProviderIds.includes(value);
211
+ }
212
+ function isTuttiExternalManagedAiModelProviderId(value) {
213
+ return typeof value === "string" && tuttiExternalManagedAiModelProviderIds.includes(
214
+ value
215
+ );
216
+ }
217
+ function isTuttiExternalWorkspaceFeature(value) {
218
+ return typeof value === "string" && tuttiExternalWorkspaceFeatures.includes(
219
+ value
220
+ );
221
+ }
222
+ function isTuttiExternalWorkspaceAgentProvider(value) {
223
+ return typeof value === "string" && tuttiExternalWorkspaceAgentProviders.includes(
224
+ value
225
+ );
226
+ }
227
+ function normalizeTuttiExternalWorkspaceAgentProvider(value) {
228
+ const provider = typeof value === "string" ? value.trim() : value;
229
+ if (!isTuttiExternalWorkspaceAgentProvider(provider)) {
230
+ throw new Error("workspace.openFeature provider is unsupported.");
231
+ }
232
+ return provider;
233
+ }
234
+ function normalizeTuttiExternalLogLevel(value) {
235
+ if (value === "debug" || value === "info" || value === "warn" || value === "error") {
236
+ return value;
237
+ }
238
+ throw new Error("logs.write level is unsupported.");
239
+ }
240
+ function normalizeTuttiExternalLogDetails(value) {
241
+ if (!isRecord(value)) {
242
+ throw new Error("logs.write details must be an object.");
243
+ }
244
+ const details = {};
245
+ for (const [key, entry] of Object.entries(value)) {
246
+ details[key] = normalizeTuttiExternalLogDetailValue(entry);
247
+ }
248
+ return details;
249
+ }
250
+ function normalizeTuttiExternalLogDetailValue(value) {
251
+ if (typeof value === "string") {
252
+ return limitDiagnosticText(value) ?? "";
253
+ }
254
+ if (value instanceof Error) {
255
+ return {
256
+ message: limitDiagnosticText(value.message) ?? "",
257
+ name: value.name,
258
+ stack: limitDiagnosticText(value.stack)
259
+ };
260
+ }
261
+ if (Array.isArray(value)) {
262
+ return value.map((entry) => normalizeTuttiExternalLogDetailValue(entry));
263
+ }
264
+ if (isRecord(value)) {
265
+ return normalizeTuttiExternalLogDetails(value);
266
+ }
267
+ return value;
268
+ }
269
+ function normalizeMaxResults(value) {
270
+ if (value === void 0 || value === null) {
271
+ return tuttiExternalAtDefaultMaxResults;
272
+ }
273
+ if (typeof value !== "number" || !Number.isFinite(value)) {
274
+ throw new Error("at.query maxResults must be a finite number.");
275
+ }
276
+ const integer = Math.floor(value);
277
+ if (integer < 0) {
278
+ throw new Error("at.query maxResults must be greater than or equal to 0.");
279
+ }
280
+ return Math.min(integer, tuttiExternalAtMaxResultsLimit);
281
+ }
282
+ function normalizeProviders(value) {
283
+ if (value === void 0 || value === null) {
284
+ return void 0;
285
+ }
286
+ if (!Array.isArray(value)) {
287
+ throw new Error("at.query providers must be an array.");
288
+ }
289
+ const providers = [];
290
+ for (const provider of value) {
291
+ if (!isTuttiExternalAtProviderId(provider)) {
292
+ throw new Error("at.query providers contains an unsupported provider.");
293
+ }
294
+ if (!providers.includes(provider)) {
295
+ providers.push(provider);
296
+ }
297
+ }
298
+ return providers;
299
+ }
300
+ function normalizeManagedAiModelProviders(value) {
301
+ if (value === void 0 || value === null) {
302
+ return void 0;
303
+ }
304
+ if (!Array.isArray(value)) {
305
+ throw new Error("permissions.request providers must be an array.");
306
+ }
307
+ const providers = [];
308
+ for (const provider of value) {
309
+ const normalizedProvider = normalizeManagedAiModelProvider(provider);
310
+ if (!providers.includes(normalizedProvider)) {
311
+ providers.push(normalizedProvider);
312
+ }
313
+ }
314
+ return providers;
315
+ }
316
+ function normalizeManagedAiModelProvider(value) {
317
+ if (!isTuttiExternalManagedAiModelProviderId(value)) {
318
+ throw new Error("managed AI model provider is unsupported.");
319
+ }
320
+ return value;
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
+ }
364
+ function normalizeFileOpenMode(value) {
365
+ if (value === void 0 || value === null || value === "") {
366
+ return void 0;
367
+ }
368
+ if (value === "auto" || value === "preview" || value === "reveal") {
369
+ return value;
370
+ }
371
+ throw new Error("files.open mode is unsupported.");
372
+ }
373
+ function normalizeRequiredString(value, field) {
374
+ if (typeof value !== "string" || value.trim() === "") {
375
+ throw new Error(`${field} is required.`);
376
+ }
377
+ return value.trim();
378
+ }
379
+ function normalizeRequiredStringList(value, field) {
380
+ if (!Array.isArray(value)) {
381
+ throw new Error(`${field} must be an array.`);
382
+ }
383
+ const normalizedValues = [];
384
+ for (const item of value) {
385
+ if (typeof item !== "string" || item.trim() === "") {
386
+ throw new Error(`${field} contains an invalid value.`);
387
+ }
388
+ const normalizedItem = item.trim();
389
+ if (!normalizedValues.includes(normalizedItem)) {
390
+ normalizedValues.push(normalizedItem);
391
+ }
392
+ }
393
+ return normalizedValues;
394
+ }
395
+ function isRecord(value) {
396
+ return typeof value === "object" && value !== null && !Array.isArray(value);
397
+ }
398
+
399
+ export {
400
+ tuttiExternalAtMaxResultsLimit,
401
+ tuttiExternalAtDefaultMaxResults,
402
+ tuttiExternalLogDiagnosticTextLimit,
403
+ tuttiExternalWorkspaceFeatures,
404
+ limitDiagnosticText,
405
+ normalizeTuttiExternalLogInput,
406
+ normalizeTuttiExternalAtQueryInput,
407
+ normalizeTuttiExternalFileSelectInput,
408
+ normalizeTuttiExternalFileOpenInput,
409
+ normalizeTuttiExternalPermissionRequestInput,
410
+ normalizeTuttiExternalSettingsOpenInput,
411
+ normalizeTuttiExternalWorkspaceOpenFeatureInput,
412
+ normalizeTuttiExternalReferenceOpenInput,
413
+ normalizeTuttiExternalPdfPrintHtmlInput,
414
+ normalizeTuttiExternalUserProjectCreateInput,
415
+ normalizeTuttiExternalUserProjectPathInput,
416
+ normalizeTuttiExternalUserProjectRememberDefaultSelectionInput,
417
+ normalizeTuttiExternalUserProjectSelectionPreparationInput,
418
+ isTuttiExternalAtProviderId,
419
+ isTuttiExternalManagedAiModelProviderId,
420
+ isTuttiExternalWorkspaceFeature,
421
+ isTuttiExternalWorkspaceAgentProvider
422
+ };
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";
@@ -87,6 +88,51 @@ interface TuttiExternalSettingsOpenInput {
87
88
  provider?: TuttiExternalManagedAiModelProviderId;
88
89
  tab?: "models";
89
90
  }
91
+ type TuttiExternalWorkspaceFeature = "app-center" | "issue-manager" | "message-center" | "agent-connect" | "agent-chat";
92
+ declare const tuttiExternalWorkspaceAgentProviders: readonly ["claude-code", "codex", "nexight", "hermes", "gemini", "openclaw"];
93
+ type TuttiExternalWorkspaceAgentProvider = (typeof tuttiExternalWorkspaceAgentProviders)[number];
94
+ interface TuttiExternalWorkspaceOpenFeatureInput {
95
+ autoSubmit?: boolean;
96
+ draftPrompt?: string;
97
+ feature: TuttiExternalWorkspaceFeature;
98
+ provider?: TuttiExternalWorkspaceAgentProvider;
99
+ }
100
+ interface TuttiExternalReferenceOpenInput {
101
+ href: string;
102
+ }
103
+ interface TuttiExternalUserProjectCreateInput {
104
+ name: string;
105
+ }
106
+ interface TuttiExternalUserProjectPathInput {
107
+ path: string;
108
+ }
109
+ interface TuttiExternalUserProjectRememberDefaultSelectionInput {
110
+ path: string | null;
111
+ }
112
+ declare const tuttiExternalLogLevels: readonly ["debug", "info", "warn", "error"];
113
+ type TuttiExternalLogLevel = (typeof tuttiExternalLogLevels)[number];
114
+ interface TuttiExternalLogInput {
115
+ details?: Record<string, unknown>;
116
+ event: string;
117
+ level?: TuttiExternalLogLevel;
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
+ }
90
136
  interface TuttiExternalBridge {
91
137
  app: {
92
138
  getContext(): Promise<unknown>;
@@ -105,6 +151,39 @@ interface TuttiExternalBridge {
105
151
  settings: {
106
152
  open(input?: TuttiExternalSettingsOpenInput): Promise<void>;
107
153
  };
154
+ workspace: {
155
+ openFeature(input: TuttiExternalWorkspaceOpenFeatureInput): Promise<void>;
156
+ };
157
+ references: {
158
+ open(input: TuttiExternalReferenceOpenInput): Promise<void>;
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
+ };
184
+ logs: {
185
+ write(input: TuttiExternalLogInput): void;
186
+ };
108
187
  }
109
188
  type TuttiExternalRendererRequest = {
110
189
  appId: string;
@@ -130,6 +209,67 @@ type TuttiExternalRendererRequest = {
130
209
  operation: "settings.open";
131
210
  requestId: string;
132
211
  workspaceId: string;
212
+ } | {
213
+ appId: string;
214
+ input: TuttiExternalReferenceOpenInput;
215
+ operation: "references.open";
216
+ requestId: string;
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;
133
273
  };
134
274
 
135
- 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 TuttiExternalManagedAiModel, type TuttiExternalManagedAiModelProviderId, type TuttiExternalPermissionRequestInput, type TuttiExternalPermissionRequestResult, type TuttiExternalRendererRequest, type TuttiExternalSettingsOpenInput, tuttiExternalAtProviderIds, tuttiExternalManagedAiModelProviderIds };
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 };
@@ -1,11 +1,15 @@
1
1
  import {
2
2
  TUTTI_EXTERNAL_AT_PROVIDER_IDS,
3
3
  tuttiExternalAtProviderIds,
4
- tuttiExternalManagedAiModelProviderIds
5
- } from "../chunk-4L4Z627Q.js";
4
+ tuttiExternalLogLevels,
5
+ tuttiExternalManagedAiModelProviderIds,
6
+ tuttiExternalWorkspaceAgentProviders
7
+ } from "../chunk-J53NLKKO.js";
6
8
  export {
7
9
  TUTTI_EXTERNAL_AT_PROVIDER_IDS,
8
10
  tuttiExternalAtProviderIds,
9
- tuttiExternalManagedAiModelProviderIds
11
+ tuttiExternalLogLevels,
12
+ tuttiExternalManagedAiModelProviderIds,
13
+ tuttiExternalWorkspaceAgentProviders
10
14
  };
11
15
  //# sourceMappingURL=index.js.map
@@ -1,15 +1,29 @@
1
- import { TuttiExternalAtProviderId, TuttiExternalManagedAiModelProviderId, TuttiExternalAtQueryInput, TuttiExternalFileOpenInput, TuttiExternalFileSelectInput, TuttiExternalPermissionRequestInput, TuttiExternalSettingsOpenInput } from '../contracts/index.js';
2
- export { tuttiExternalAtProviderIds, tuttiExternalManagedAiModelProviderIds } 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
+ 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;
6
7
  declare const tuttiExternalAtDefaultMaxResults = 20;
8
+ declare const tuttiExternalLogDiagnosticTextLimit = 8000;
9
+ declare const tuttiExternalWorkspaceFeatures: readonly ["app-center", "issue-manager", "message-center", "agent-connect", "agent-chat"];
10
+ declare function limitDiagnosticText(value: string | undefined): string | undefined;
11
+ declare function normalizeTuttiExternalLogInput(input: unknown): TuttiExternalLogInput;
7
12
  declare function normalizeTuttiExternalAtQueryInput(input: unknown): TuttiExternalAtQueryInput;
8
13
  declare function normalizeTuttiExternalFileSelectInput(input: unknown): TuttiExternalFileSelectInput;
9
14
  declare function normalizeTuttiExternalFileOpenInput(input: unknown): TuttiExternalFileOpenInput;
10
15
  declare function normalizeTuttiExternalPermissionRequestInput(input: unknown): TuttiExternalPermissionRequestInput;
11
16
  declare function normalizeTuttiExternalSettingsOpenInput(input: unknown): TuttiExternalSettingsOpenInput;
17
+ declare function normalizeTuttiExternalWorkspaceOpenFeatureInput(input: unknown): TuttiExternalWorkspaceOpenFeatureInput;
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;
12
24
  declare function isTuttiExternalAtProviderId(value: unknown): value is TuttiExternalAtProviderId;
13
25
  declare function isTuttiExternalManagedAiModelProviderId(value: unknown): value is TuttiExternalManagedAiModelProviderId;
26
+ declare function isTuttiExternalWorkspaceFeature(value: unknown): value is TuttiExternalWorkspaceFeature;
27
+ declare function isTuttiExternalWorkspaceAgentProvider(value: unknown): value is TuttiExternalWorkspaceAgentProvider;
14
28
 
15
- export { isTuttiExternalAtProviderId, isTuttiExternalManagedAiModelProviderId, normalizeTuttiExternalAtQueryInput, normalizeTuttiExternalFileOpenInput, normalizeTuttiExternalFileSelectInput, normalizeTuttiExternalPermissionRequestInput, normalizeTuttiExternalSettingsOpenInput, tuttiExternalAtDefaultMaxResults, tuttiExternalAtMaxResultsLimit };
29
+ export { isTuttiExternalAtProviderId, isTuttiExternalManagedAiModelProviderId, isTuttiExternalWorkspaceAgentProvider, isTuttiExternalWorkspaceFeature, limitDiagnosticText, normalizeTuttiExternalAtQueryInput, normalizeTuttiExternalFileOpenInput, normalizeTuttiExternalFileSelectInput, normalizeTuttiExternalLogInput, normalizeTuttiExternalPdfPrintHtmlInput, normalizeTuttiExternalPermissionRequestInput, normalizeTuttiExternalReferenceOpenInput, normalizeTuttiExternalSettingsOpenInput, normalizeTuttiExternalUserProjectCreateInput, normalizeTuttiExternalUserProjectPathInput, normalizeTuttiExternalUserProjectRememberDefaultSelectionInput, normalizeTuttiExternalUserProjectSelectionPreparationInput, normalizeTuttiExternalWorkspaceOpenFeatureInput, tuttiExternalAtDefaultMaxResults, tuttiExternalAtMaxResultsLimit, tuttiExternalLogDiagnosticTextLimit, tuttiExternalWorkspaceFeatures };
@@ -1,29 +1,57 @@
1
1
  import {
2
2
  isTuttiExternalAtProviderId,
3
3
  isTuttiExternalManagedAiModelProviderId,
4
+ isTuttiExternalWorkspaceAgentProvider,
5
+ isTuttiExternalWorkspaceFeature,
6
+ limitDiagnosticText,
4
7
  normalizeTuttiExternalAtQueryInput,
5
8
  normalizeTuttiExternalFileOpenInput,
6
9
  normalizeTuttiExternalFileSelectInput,
10
+ normalizeTuttiExternalLogInput,
11
+ normalizeTuttiExternalPdfPrintHtmlInput,
7
12
  normalizeTuttiExternalPermissionRequestInput,
13
+ normalizeTuttiExternalReferenceOpenInput,
8
14
  normalizeTuttiExternalSettingsOpenInput,
15
+ normalizeTuttiExternalUserProjectCreateInput,
16
+ normalizeTuttiExternalUserProjectPathInput,
17
+ normalizeTuttiExternalUserProjectRememberDefaultSelectionInput,
18
+ normalizeTuttiExternalUserProjectSelectionPreparationInput,
19
+ normalizeTuttiExternalWorkspaceOpenFeatureInput,
9
20
  tuttiExternalAtDefaultMaxResults,
10
- tuttiExternalAtMaxResultsLimit
11
- } from "../chunk-DMYBA7AD.js";
21
+ tuttiExternalAtMaxResultsLimit,
22
+ tuttiExternalLogDiagnosticTextLimit,
23
+ tuttiExternalWorkspaceFeatures
24
+ } from "../chunk-LGELOEVW.js";
12
25
  import {
13
26
  tuttiExternalAtProviderIds,
14
- tuttiExternalManagedAiModelProviderIds
15
- } from "../chunk-4L4Z627Q.js";
27
+ tuttiExternalManagedAiModelProviderIds,
28
+ tuttiExternalWorkspaceAgentProviders
29
+ } from "../chunk-J53NLKKO.js";
16
30
  export {
17
31
  isTuttiExternalAtProviderId,
18
32
  isTuttiExternalManagedAiModelProviderId,
33
+ isTuttiExternalWorkspaceAgentProvider,
34
+ isTuttiExternalWorkspaceFeature,
35
+ limitDiagnosticText,
19
36
  normalizeTuttiExternalAtQueryInput,
20
37
  normalizeTuttiExternalFileOpenInput,
21
38
  normalizeTuttiExternalFileSelectInput,
39
+ normalizeTuttiExternalLogInput,
40
+ normalizeTuttiExternalPdfPrintHtmlInput,
22
41
  normalizeTuttiExternalPermissionRequestInput,
42
+ normalizeTuttiExternalReferenceOpenInput,
23
43
  normalizeTuttiExternalSettingsOpenInput,
44
+ normalizeTuttiExternalUserProjectCreateInput,
45
+ normalizeTuttiExternalUserProjectPathInput,
46
+ normalizeTuttiExternalUserProjectRememberDefaultSelectionInput,
47
+ normalizeTuttiExternalUserProjectSelectionPreparationInput,
48
+ normalizeTuttiExternalWorkspaceOpenFeatureInput,
24
49
  tuttiExternalAtDefaultMaxResults,
25
50
  tuttiExternalAtMaxResultsLimit,
26
51
  tuttiExternalAtProviderIds,
27
- tuttiExternalManagedAiModelProviderIds
52
+ tuttiExternalLogDiagnosticTextLimit,
53
+ tuttiExternalManagedAiModelProviderIds,
54
+ tuttiExternalWorkspaceAgentProviders,
55
+ tuttiExternalWorkspaceFeatures
28
56
  };
29
57
  //# sourceMappingURL=index.js.map
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, TuttiExternalManagedAiModel, TuttiExternalManagedAiModelProviderId, TuttiExternalPermissionRequestInput, TuttiExternalPermissionRequestResult, TuttiExternalRendererRequest, TuttiExternalSettingsOpenInput, tuttiExternalAtProviderIds, tuttiExternalManagedAiModelProviderIds } from './contracts/index.js';
2
- export { isTuttiExternalAtProviderId, isTuttiExternalManagedAiModelProviderId, normalizeTuttiExternalAtQueryInput, normalizeTuttiExternalFileOpenInput, normalizeTuttiExternalFileSelectInput, normalizeTuttiExternalPermissionRequestInput, normalizeTuttiExternalSettingsOpenInput, tuttiExternalAtDefaultMaxResults, tuttiExternalAtMaxResultsLimit } 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
@@ -1,29 +1,57 @@
1
1
  import {
2
2
  isTuttiExternalAtProviderId,
3
3
  isTuttiExternalManagedAiModelProviderId,
4
+ isTuttiExternalWorkspaceAgentProvider,
5
+ isTuttiExternalWorkspaceFeature,
6
+ limitDiagnosticText,
4
7
  normalizeTuttiExternalAtQueryInput,
5
8
  normalizeTuttiExternalFileOpenInput,
6
9
  normalizeTuttiExternalFileSelectInput,
10
+ normalizeTuttiExternalLogInput,
11
+ normalizeTuttiExternalPdfPrintHtmlInput,
7
12
  normalizeTuttiExternalPermissionRequestInput,
13
+ normalizeTuttiExternalReferenceOpenInput,
8
14
  normalizeTuttiExternalSettingsOpenInput,
15
+ normalizeTuttiExternalUserProjectCreateInput,
16
+ normalizeTuttiExternalUserProjectPathInput,
17
+ normalizeTuttiExternalUserProjectRememberDefaultSelectionInput,
18
+ normalizeTuttiExternalUserProjectSelectionPreparationInput,
19
+ normalizeTuttiExternalWorkspaceOpenFeatureInput,
9
20
  tuttiExternalAtDefaultMaxResults,
10
- tuttiExternalAtMaxResultsLimit
11
- } from "./chunk-DMYBA7AD.js";
21
+ tuttiExternalAtMaxResultsLimit,
22
+ tuttiExternalLogDiagnosticTextLimit,
23
+ tuttiExternalWorkspaceFeatures
24
+ } from "./chunk-LGELOEVW.js";
12
25
  import {
13
26
  tuttiExternalAtProviderIds,
14
- tuttiExternalManagedAiModelProviderIds
15
- } from "./chunk-4L4Z627Q.js";
27
+ tuttiExternalManagedAiModelProviderIds,
28
+ tuttiExternalWorkspaceAgentProviders
29
+ } from "./chunk-J53NLKKO.js";
16
30
  export {
17
31
  isTuttiExternalAtProviderId,
18
32
  isTuttiExternalManagedAiModelProviderId,
33
+ isTuttiExternalWorkspaceAgentProvider,
34
+ isTuttiExternalWorkspaceFeature,
35
+ limitDiagnosticText,
19
36
  normalizeTuttiExternalAtQueryInput,
20
37
  normalizeTuttiExternalFileOpenInput,
21
38
  normalizeTuttiExternalFileSelectInput,
39
+ normalizeTuttiExternalLogInput,
40
+ normalizeTuttiExternalPdfPrintHtmlInput,
22
41
  normalizeTuttiExternalPermissionRequestInput,
42
+ normalizeTuttiExternalReferenceOpenInput,
23
43
  normalizeTuttiExternalSettingsOpenInput,
44
+ normalizeTuttiExternalUserProjectCreateInput,
45
+ normalizeTuttiExternalUserProjectPathInput,
46
+ normalizeTuttiExternalUserProjectRememberDefaultSelectionInput,
47
+ normalizeTuttiExternalUserProjectSelectionPreparationInput,
48
+ normalizeTuttiExternalWorkspaceOpenFeatureInput,
24
49
  tuttiExternalAtDefaultMaxResults,
25
50
  tuttiExternalAtMaxResultsLimit,
26
51
  tuttiExternalAtProviderIds,
27
- tuttiExternalManagedAiModelProviderIds
52
+ tuttiExternalLogDiagnosticTextLimit,
53
+ tuttiExternalManagedAiModelProviderIds,
54
+ tuttiExternalWorkspaceAgentProviders,
55
+ tuttiExternalWorkspaceFeatures
28
56
  };
29
57
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tutti-os/workspace-external-core",
3
- "version": "0.0.14",
3
+ "version": "0.0.16",
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.14"
31
+ "@tutti-os/workspace-file-reference": "0.0.16",
32
+ "@tutti-os/workspace-user-project": "0.0.16"
32
33
  },
33
34
  "devDependencies": {
34
35
  "@types/node": "^24.0.1",
@@ -41,6 +42,6 @@
41
42
  "scripts": {
42
43
  "build": "tsup --config tsup.config.ts",
43
44
  "test": "node --test --experimental-strip-types \"./src/**/*.test.ts\"",
44
- "typecheck": "tsc --noEmit -p tsconfig.json"
45
+ "typecheck": "node ../../../tools/scripts/run-tsgo-typecheck.mjs"
45
46
  }
46
47
  }
@@ -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 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}\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"],"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;","names":[]}
@@ -1,202 +0,0 @@
1
- import {
2
- tuttiExternalAtProviderIds,
3
- tuttiExternalManagedAiModelProviderIds
4
- } from "./chunk-4L4Z627Q.js";
5
-
6
- // src/core/index.ts
7
- var tuttiExternalAtMaxResultsLimit = 50;
8
- var tuttiExternalAtDefaultMaxResults = 20;
9
- function normalizeTuttiExternalAtQueryInput(input) {
10
- if (!isRecord(input)) {
11
- throw new Error("at.query input must be an object.");
12
- }
13
- const keywordValue = input.keyword;
14
- if (typeof keywordValue !== "string") {
15
- throw new Error("at.query keyword is required.");
16
- }
17
- return {
18
- keyword: keywordValue,
19
- maxResults: normalizeMaxResults(input.maxResults),
20
- providers: normalizeProviders(input.providers)
21
- };
22
- }
23
- function normalizeTuttiExternalFileSelectInput(input) {
24
- if (input === void 0 || input === null) {
25
- return {};
26
- }
27
- if (!isRecord(input)) {
28
- throw new Error("files.select input must be an object.");
29
- }
30
- return {
31
- multiple: input.multiple === true
32
- };
33
- }
34
- function normalizeTuttiExternalFileOpenInput(input) {
35
- if (!isRecord(input)) {
36
- throw new Error("files.open input must be an object.");
37
- }
38
- if (typeof input.path !== "string" || input.path.trim() === "") {
39
- throw new Error("files.open path is required.");
40
- }
41
- const mode = normalizeFileOpenMode(input.mode);
42
- return {
43
- ...mode ? { mode } : {},
44
- ...typeof input.mtimeMs === "number" || input.mtimeMs === null ? { mtimeMs: input.mtimeMs } : {},
45
- ...typeof input.name === "string" && input.name.trim() !== "" ? { name: input.name.trim() } : {},
46
- path: input.path.trim(),
47
- ...typeof input.sizeBytes === "number" || input.sizeBytes === null ? { sizeBytes: input.sizeBytes } : {}
48
- };
49
- }
50
- function normalizeTuttiExternalPermissionRequestInput(input) {
51
- if (!isRecord(input)) {
52
- throw new Error("permissions.request input must be an object.");
53
- }
54
- if (input.permission !== "managed-ai-models") {
55
- throw new Error("permissions.request permission is unsupported.");
56
- }
57
- const nonce = normalizeRequiredString(
58
- input.nonce,
59
- "permissions.request nonce"
60
- );
61
- const state = normalizeRequiredString(
62
- input.state,
63
- "permissions.request state"
64
- );
65
- const scopes = normalizeRequiredStringList(
66
- input.scopes,
67
- "permissions.request scopes"
68
- );
69
- if (scopes.length === 0) {
70
- throw new Error("permissions.request scopes must not be empty.");
71
- }
72
- return {
73
- nonce,
74
- permission: "managed-ai-models",
75
- providers: normalizeManagedAiModelProviders(input.providers),
76
- scopes,
77
- state
78
- };
79
- }
80
- function normalizeTuttiExternalSettingsOpenInput(input) {
81
- if (input === void 0 || input === null) {
82
- return {};
83
- }
84
- if (!isRecord(input)) {
85
- throw new Error("settings.open input must be an object.");
86
- }
87
- if (input.tab !== void 0 && input.tab !== null && input.tab !== "" && input.tab !== "models") {
88
- throw new Error("settings.open tab is unsupported.");
89
- }
90
- return {
91
- ...input.provider !== void 0 && input.provider !== null ? { provider: normalizeManagedAiModelProvider(input.provider) } : {},
92
- ...input.tab === "models" ? { tab: "models" } : {}
93
- };
94
- }
95
- function isTuttiExternalAtProviderId(value) {
96
- return typeof value === "string" && tuttiExternalAtProviderIds.includes(value);
97
- }
98
- function isTuttiExternalManagedAiModelProviderId(value) {
99
- return typeof value === "string" && tuttiExternalManagedAiModelProviderIds.includes(
100
- value
101
- );
102
- }
103
- function normalizeMaxResults(value) {
104
- if (value === void 0 || value === null) {
105
- return tuttiExternalAtDefaultMaxResults;
106
- }
107
- if (typeof value !== "number" || !Number.isFinite(value)) {
108
- throw new Error("at.query maxResults must be a finite number.");
109
- }
110
- const integer = Math.floor(value);
111
- if (integer < 0) {
112
- throw new Error("at.query maxResults must be greater than or equal to 0.");
113
- }
114
- return Math.min(integer, tuttiExternalAtMaxResultsLimit);
115
- }
116
- function normalizeProviders(value) {
117
- if (value === void 0 || value === null) {
118
- return void 0;
119
- }
120
- if (!Array.isArray(value)) {
121
- throw new Error("at.query providers must be an array.");
122
- }
123
- const providers = [];
124
- for (const provider of value) {
125
- if (!isTuttiExternalAtProviderId(provider)) {
126
- throw new Error("at.query providers contains an unsupported provider.");
127
- }
128
- if (!providers.includes(provider)) {
129
- providers.push(provider);
130
- }
131
- }
132
- return providers;
133
- }
134
- function normalizeManagedAiModelProviders(value) {
135
- if (value === void 0 || value === null) {
136
- return void 0;
137
- }
138
- if (!Array.isArray(value)) {
139
- throw new Error("permissions.request providers must be an array.");
140
- }
141
- const providers = [];
142
- for (const provider of value) {
143
- const normalizedProvider = normalizeManagedAiModelProvider(provider);
144
- if (!providers.includes(normalizedProvider)) {
145
- providers.push(normalizedProvider);
146
- }
147
- }
148
- return providers;
149
- }
150
- function normalizeManagedAiModelProvider(value) {
151
- if (!isTuttiExternalManagedAiModelProviderId(value)) {
152
- throw new Error("managed AI model provider is unsupported.");
153
- }
154
- return value;
155
- }
156
- function normalizeFileOpenMode(value) {
157
- if (value === void 0 || value === null || value === "") {
158
- return void 0;
159
- }
160
- if (value === "auto" || value === "preview" || value === "reveal") {
161
- return value;
162
- }
163
- throw new Error("files.open mode is unsupported.");
164
- }
165
- function normalizeRequiredString(value, field) {
166
- if (typeof value !== "string" || value.trim() === "") {
167
- throw new Error(`${field} is required.`);
168
- }
169
- return value.trim();
170
- }
171
- function normalizeRequiredStringList(value, field) {
172
- if (!Array.isArray(value)) {
173
- throw new Error(`${field} must be an array.`);
174
- }
175
- const normalizedValues = [];
176
- for (const item of value) {
177
- if (typeof item !== "string" || item.trim() === "") {
178
- throw new Error(`${field} contains an invalid value.`);
179
- }
180
- const normalizedItem = item.trim();
181
- if (!normalizedValues.includes(normalizedItem)) {
182
- normalizedValues.push(normalizedItem);
183
- }
184
- }
185
- return normalizedValues;
186
- }
187
- function isRecord(value) {
188
- return typeof value === "object" && value !== null && !Array.isArray(value);
189
- }
190
-
191
- export {
192
- tuttiExternalAtMaxResultsLimit,
193
- tuttiExternalAtDefaultMaxResults,
194
- normalizeTuttiExternalAtQueryInput,
195
- normalizeTuttiExternalFileSelectInput,
196
- normalizeTuttiExternalFileOpenInput,
197
- normalizeTuttiExternalPermissionRequestInput,
198
- normalizeTuttiExternalSettingsOpenInput,
199
- isTuttiExternalAtProviderId,
200
- isTuttiExternalManagedAiModelProviderId
201
- };
202
- //# sourceMappingURL=chunk-DMYBA7AD.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/index.ts"],"sourcesContent":["import {\n tuttiExternalManagedAiModelProviderIds,\n tuttiExternalAtProviderIds,\n type TuttiExternalAtProviderId,\n type TuttiExternalAtQueryInput,\n type TuttiExternalFileOpenInput,\n type TuttiExternalFileSelectInput,\n type TuttiExternalManagedAiModelProviderId,\n type TuttiExternalPermissionRequestInput,\n type TuttiExternalSettingsOpenInput\n} from \"../contracts/index.ts\";\n\nexport {\n tuttiExternalAtProviderIds,\n tuttiExternalManagedAiModelProviderIds\n} from \"../contracts/index.ts\";\n\nexport const tuttiExternalAtMaxResultsLimit = 50;\nexport const tuttiExternalAtDefaultMaxResults = 20;\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 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\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":[]}