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

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
@@ -10,3 +10,5 @@ Contracts and host-agnostic helpers for the workspace app external bridge.
10
10
  - `files.open()` for user-activated host opening/revealing of a known workspace file path.
11
11
  - `permissions.request()` for user-activated host permission grants such as managed AI model access.
12
12
  - `settings.open()` for user-activated host settings navigation, including the managed models tab.
13
+ - `workspace.openFeature()` for user-activated host workspace navigation, such as opening the message center.
14
+ - `logs.write()` for fire-and-forget frontend diagnostics that append to the workspace app `web.log`.
@@ -1,11 +1,43 @@
1
1
  import {
2
2
  tuttiExternalAtProviderIds,
3
- tuttiExternalManagedAiModelProviderIds
4
- } from "./chunk-4L4Z627Q.js";
3
+ tuttiExternalManagedAiModelProviderIds,
4
+ tuttiExternalWorkspaceAgentProviders
5
+ } from "./chunk-TXIBT45W.js";
5
6
 
6
7
  // src/core/index.ts
7
8
  var tuttiExternalAtMaxResultsLimit = 50;
8
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
+ }
9
41
  function normalizeTuttiExternalAtQueryInput(input) {
10
42
  if (!isRecord(input)) {
11
43
  throw new Error("at.query input must be an object.");
@@ -92,6 +124,34 @@ function normalizeTuttiExternalSettingsOpenInput(input) {
92
124
  ...input.tab === "models" ? { tab: "models" } : {}
93
125
  };
94
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
+ }
95
155
  function isTuttiExternalAtProviderId(value) {
96
156
  return typeof value === "string" && tuttiExternalAtProviderIds.includes(value);
97
157
  }
@@ -100,6 +160,58 @@ function isTuttiExternalManagedAiModelProviderId(value) {
100
160
  value
101
161
  );
102
162
  }
163
+ function isTuttiExternalWorkspaceFeature(value) {
164
+ return typeof value === "string" && tuttiExternalWorkspaceFeatures.includes(
165
+ value
166
+ );
167
+ }
168
+ function isTuttiExternalWorkspaceAgentProvider(value) {
169
+ return typeof value === "string" && tuttiExternalWorkspaceAgentProviders.includes(
170
+ value
171
+ );
172
+ }
173
+ function normalizeTuttiExternalWorkspaceAgentProvider(value) {
174
+ const provider = typeof value === "string" ? value.trim() : value;
175
+ if (!isTuttiExternalWorkspaceAgentProvider(provider)) {
176
+ throw new Error("workspace.openFeature provider is unsupported.");
177
+ }
178
+ return provider;
179
+ }
180
+ function normalizeTuttiExternalLogLevel(value) {
181
+ if (value === "debug" || value === "info" || value === "warn" || value === "error") {
182
+ return value;
183
+ }
184
+ throw new Error("logs.write level is unsupported.");
185
+ }
186
+ function normalizeTuttiExternalLogDetails(value) {
187
+ if (!isRecord(value)) {
188
+ throw new Error("logs.write details must be an object.");
189
+ }
190
+ const details = {};
191
+ for (const [key, entry] of Object.entries(value)) {
192
+ details[key] = normalizeTuttiExternalLogDetailValue(entry);
193
+ }
194
+ return details;
195
+ }
196
+ function normalizeTuttiExternalLogDetailValue(value) {
197
+ if (typeof value === "string") {
198
+ return limitDiagnosticText(value) ?? "";
199
+ }
200
+ if (value instanceof Error) {
201
+ return {
202
+ message: limitDiagnosticText(value.message) ?? "",
203
+ name: value.name,
204
+ stack: limitDiagnosticText(value.stack)
205
+ };
206
+ }
207
+ if (Array.isArray(value)) {
208
+ return value.map((entry) => normalizeTuttiExternalLogDetailValue(entry));
209
+ }
210
+ if (isRecord(value)) {
211
+ return normalizeTuttiExternalLogDetails(value);
212
+ }
213
+ return value;
214
+ }
103
215
  function normalizeMaxResults(value) {
104
216
  if (value === void 0 || value === null) {
105
217
  return tuttiExternalAtDefaultMaxResults;
@@ -191,12 +303,20 @@ function isRecord(value) {
191
303
  export {
192
304
  tuttiExternalAtMaxResultsLimit,
193
305
  tuttiExternalAtDefaultMaxResults,
306
+ tuttiExternalLogDiagnosticTextLimit,
307
+ tuttiExternalWorkspaceFeatures,
308
+ limitDiagnosticText,
309
+ normalizeTuttiExternalLogInput,
194
310
  normalizeTuttiExternalAtQueryInput,
195
311
  normalizeTuttiExternalFileSelectInput,
196
312
  normalizeTuttiExternalFileOpenInput,
197
313
  normalizeTuttiExternalPermissionRequestInput,
198
314
  normalizeTuttiExternalSettingsOpenInput,
315
+ normalizeTuttiExternalWorkspaceOpenFeatureInput,
316
+ normalizeTuttiExternalReferenceOpenInput,
199
317
  isTuttiExternalAtProviderId,
200
- isTuttiExternalManagedAiModelProviderId
318
+ isTuttiExternalManagedAiModelProviderId,
319
+ isTuttiExternalWorkspaceFeature,
320
+ isTuttiExternalWorkspaceAgentProvider
201
321
  };
202
- //# sourceMappingURL=chunk-DMYBA7AD.js.map
322
+ //# sourceMappingURL=chunk-JKLKTSUO.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 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":[]}
@@ -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-TXIBT45W.js.map
@@ -1 +1 @@
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
+ {"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":[]}
@@ -87,6 +87,25 @@ interface TuttiExternalSettingsOpenInput {
87
87
  provider?: TuttiExternalManagedAiModelProviderId;
88
88
  tab?: "models";
89
89
  }
90
+ type TuttiExternalWorkspaceFeature = "app-center" | "issue-manager" | "message-center" | "agent-connect" | "agent-chat";
91
+ declare const tuttiExternalWorkspaceAgentProviders: readonly ["claude-code", "codex", "nexight", "hermes", "gemini", "openclaw"];
92
+ type TuttiExternalWorkspaceAgentProvider = (typeof tuttiExternalWorkspaceAgentProviders)[number];
93
+ interface TuttiExternalWorkspaceOpenFeatureInput {
94
+ autoSubmit?: boolean;
95
+ draftPrompt?: string;
96
+ feature: TuttiExternalWorkspaceFeature;
97
+ provider?: TuttiExternalWorkspaceAgentProvider;
98
+ }
99
+ interface TuttiExternalReferenceOpenInput {
100
+ href: string;
101
+ }
102
+ declare const tuttiExternalLogLevels: readonly ["debug", "info", "warn", "error"];
103
+ type TuttiExternalLogLevel = (typeof tuttiExternalLogLevels)[number];
104
+ interface TuttiExternalLogInput {
105
+ details?: Record<string, unknown>;
106
+ event: string;
107
+ level?: TuttiExternalLogLevel;
108
+ }
90
109
  interface TuttiExternalBridge {
91
110
  app: {
92
111
  getContext(): Promise<unknown>;
@@ -105,6 +124,15 @@ interface TuttiExternalBridge {
105
124
  settings: {
106
125
  open(input?: TuttiExternalSettingsOpenInput): Promise<void>;
107
126
  };
127
+ workspace: {
128
+ openFeature(input: TuttiExternalWorkspaceOpenFeatureInput): Promise<void>;
129
+ };
130
+ references: {
131
+ open(input: TuttiExternalReferenceOpenInput): Promise<void>;
132
+ };
133
+ logs: {
134
+ write(input: TuttiExternalLogInput): void;
135
+ };
108
136
  }
109
137
  type TuttiExternalRendererRequest = {
110
138
  appId: string;
@@ -130,6 +158,12 @@ type TuttiExternalRendererRequest = {
130
158
  operation: "settings.open";
131
159
  requestId: string;
132
160
  workspaceId: string;
161
+ } | {
162
+ appId: string;
163
+ input: TuttiExternalReferenceOpenInput;
164
+ operation: "references.open";
165
+ requestId: string;
166
+ workspaceId: string;
133
167
  };
134
168
 
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 };
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 };
@@ -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-TXIBT45W.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,23 @@
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, TuttiExternalPermissionRequestInput, TuttiExternalReferenceOpenInput, TuttiExternalSettingsOpenInput, TuttiExternalWorkspaceOpenFeatureInput } from '../contracts/index.js';
2
+ export { tuttiExternalAtProviderIds, tuttiExternalManagedAiModelProviderIds, tuttiExternalWorkspaceAgentProviders } from '../contracts/index.js';
3
3
  import '@tutti-os/workspace-file-reference/contracts';
4
4
 
5
5
  declare const tuttiExternalAtMaxResultsLimit = 50;
6
6
  declare const tuttiExternalAtDefaultMaxResults = 20;
7
+ declare const tuttiExternalLogDiagnosticTextLimit = 8000;
8
+ declare const tuttiExternalWorkspaceFeatures: readonly ["app-center", "issue-manager", "message-center", "agent-connect", "agent-chat"];
9
+ declare function limitDiagnosticText(value: string | undefined): string | undefined;
10
+ declare function normalizeTuttiExternalLogInput(input: unknown): TuttiExternalLogInput;
7
11
  declare function normalizeTuttiExternalAtQueryInput(input: unknown): TuttiExternalAtQueryInput;
8
12
  declare function normalizeTuttiExternalFileSelectInput(input: unknown): TuttiExternalFileSelectInput;
9
13
  declare function normalizeTuttiExternalFileOpenInput(input: unknown): TuttiExternalFileOpenInput;
10
14
  declare function normalizeTuttiExternalPermissionRequestInput(input: unknown): TuttiExternalPermissionRequestInput;
11
15
  declare function normalizeTuttiExternalSettingsOpenInput(input: unknown): TuttiExternalSettingsOpenInput;
16
+ declare function normalizeTuttiExternalWorkspaceOpenFeatureInput(input: unknown): TuttiExternalWorkspaceOpenFeatureInput;
17
+ declare function normalizeTuttiExternalReferenceOpenInput(input: unknown): TuttiExternalReferenceOpenInput;
12
18
  declare function isTuttiExternalAtProviderId(value: unknown): value is TuttiExternalAtProviderId;
13
19
  declare function isTuttiExternalManagedAiModelProviderId(value: unknown): value is TuttiExternalManagedAiModelProviderId;
20
+ declare function isTuttiExternalWorkspaceFeature(value: unknown): value is TuttiExternalWorkspaceFeature;
21
+ declare function isTuttiExternalWorkspaceAgentProvider(value: unknown): value is TuttiExternalWorkspaceAgentProvider;
14
22
 
15
- export { isTuttiExternalAtProviderId, isTuttiExternalManagedAiModelProviderId, normalizeTuttiExternalAtQueryInput, normalizeTuttiExternalFileOpenInput, normalizeTuttiExternalFileSelectInput, normalizeTuttiExternalPermissionRequestInput, normalizeTuttiExternalSettingsOpenInput, tuttiExternalAtDefaultMaxResults, tuttiExternalAtMaxResultsLimit };
23
+ export { isTuttiExternalAtProviderId, isTuttiExternalManagedAiModelProviderId, isTuttiExternalWorkspaceAgentProvider, isTuttiExternalWorkspaceFeature, limitDiagnosticText, normalizeTuttiExternalAtQueryInput, normalizeTuttiExternalFileOpenInput, normalizeTuttiExternalFileSelectInput, normalizeTuttiExternalLogInput, normalizeTuttiExternalPermissionRequestInput, normalizeTuttiExternalReferenceOpenInput, normalizeTuttiExternalSettingsOpenInput, normalizeTuttiExternalWorkspaceOpenFeatureInput, tuttiExternalAtDefaultMaxResults, tuttiExternalAtMaxResultsLimit, tuttiExternalLogDiagnosticTextLimit, tuttiExternalWorkspaceFeatures };
@@ -1,29 +1,47 @@
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,
7
11
  normalizeTuttiExternalPermissionRequestInput,
12
+ normalizeTuttiExternalReferenceOpenInput,
8
13
  normalizeTuttiExternalSettingsOpenInput,
14
+ normalizeTuttiExternalWorkspaceOpenFeatureInput,
9
15
  tuttiExternalAtDefaultMaxResults,
10
- tuttiExternalAtMaxResultsLimit
11
- } from "../chunk-DMYBA7AD.js";
16
+ tuttiExternalAtMaxResultsLimit,
17
+ tuttiExternalLogDiagnosticTextLimit,
18
+ tuttiExternalWorkspaceFeatures
19
+ } from "../chunk-JKLKTSUO.js";
12
20
  import {
13
21
  tuttiExternalAtProviderIds,
14
- tuttiExternalManagedAiModelProviderIds
15
- } from "../chunk-4L4Z627Q.js";
22
+ tuttiExternalManagedAiModelProviderIds,
23
+ tuttiExternalWorkspaceAgentProviders
24
+ } from "../chunk-TXIBT45W.js";
16
25
  export {
17
26
  isTuttiExternalAtProviderId,
18
27
  isTuttiExternalManagedAiModelProviderId,
28
+ isTuttiExternalWorkspaceAgentProvider,
29
+ isTuttiExternalWorkspaceFeature,
30
+ limitDiagnosticText,
19
31
  normalizeTuttiExternalAtQueryInput,
20
32
  normalizeTuttiExternalFileOpenInput,
21
33
  normalizeTuttiExternalFileSelectInput,
34
+ normalizeTuttiExternalLogInput,
22
35
  normalizeTuttiExternalPermissionRequestInput,
36
+ normalizeTuttiExternalReferenceOpenInput,
23
37
  normalizeTuttiExternalSettingsOpenInput,
38
+ normalizeTuttiExternalWorkspaceOpenFeatureInput,
24
39
  tuttiExternalAtDefaultMaxResults,
25
40
  tuttiExternalAtMaxResultsLimit,
26
41
  tuttiExternalAtProviderIds,
27
- tuttiExternalManagedAiModelProviderIds
42
+ tuttiExternalLogDiagnosticTextLimit,
43
+ tuttiExternalManagedAiModelProviderIds,
44
+ tuttiExternalWorkspaceAgentProviders,
45
+ tuttiExternalWorkspaceFeatures
28
46
  };
29
47
  //# sourceMappingURL=index.js.map
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
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, 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';
3
3
  import '@tutti-os/workspace-file-reference/contracts';
package/dist/index.js CHANGED
@@ -1,29 +1,47 @@
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,
7
11
  normalizeTuttiExternalPermissionRequestInput,
12
+ normalizeTuttiExternalReferenceOpenInput,
8
13
  normalizeTuttiExternalSettingsOpenInput,
14
+ normalizeTuttiExternalWorkspaceOpenFeatureInput,
9
15
  tuttiExternalAtDefaultMaxResults,
10
- tuttiExternalAtMaxResultsLimit
11
- } from "./chunk-DMYBA7AD.js";
16
+ tuttiExternalAtMaxResultsLimit,
17
+ tuttiExternalLogDiagnosticTextLimit,
18
+ tuttiExternalWorkspaceFeatures
19
+ } from "./chunk-JKLKTSUO.js";
12
20
  import {
13
21
  tuttiExternalAtProviderIds,
14
- tuttiExternalManagedAiModelProviderIds
15
- } from "./chunk-4L4Z627Q.js";
22
+ tuttiExternalManagedAiModelProviderIds,
23
+ tuttiExternalWorkspaceAgentProviders
24
+ } from "./chunk-TXIBT45W.js";
16
25
  export {
17
26
  isTuttiExternalAtProviderId,
18
27
  isTuttiExternalManagedAiModelProviderId,
28
+ isTuttiExternalWorkspaceAgentProvider,
29
+ isTuttiExternalWorkspaceFeature,
30
+ limitDiagnosticText,
19
31
  normalizeTuttiExternalAtQueryInput,
20
32
  normalizeTuttiExternalFileOpenInput,
21
33
  normalizeTuttiExternalFileSelectInput,
34
+ normalizeTuttiExternalLogInput,
22
35
  normalizeTuttiExternalPermissionRequestInput,
36
+ normalizeTuttiExternalReferenceOpenInput,
23
37
  normalizeTuttiExternalSettingsOpenInput,
38
+ normalizeTuttiExternalWorkspaceOpenFeatureInput,
24
39
  tuttiExternalAtDefaultMaxResults,
25
40
  tuttiExternalAtMaxResultsLimit,
26
41
  tuttiExternalAtProviderIds,
27
- tuttiExternalManagedAiModelProviderIds
42
+ tuttiExternalLogDiagnosticTextLimit,
43
+ tuttiExternalManagedAiModelProviderIds,
44
+ tuttiExternalWorkspaceAgentProviders,
45
+ tuttiExternalWorkspaceFeatures
28
46
  };
29
47
  //# 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.13",
3
+ "version": "0.0.15",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -28,7 +28,7 @@
28
28
  "directory": "packages/workspace/external-core"
29
29
  },
30
30
  "dependencies": {
31
- "@tutti-os/workspace-file-reference": "0.0.13"
31
+ "@tutti-os/workspace-file-reference": "0.0.15"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/node": "^24.0.1",
@@ -41,6 +41,6 @@
41
41
  "scripts": {
42
42
  "build": "tsup --config tsup.config.ts",
43
43
  "test": "node --test --experimental-strip-types \"./src/**/*.test.ts\"",
44
- "typecheck": "tsc --noEmit -p tsconfig.json"
44
+ "typecheck": "node ../../../tools/scripts/run-tsgo-typecheck.mjs"
45
45
  }
46
46
  }
@@ -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":[]}