@tutti-os/workspace-external-core 0.0.25 → 0.0.26

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
@@ -25,3 +25,26 @@ trusted app APIs may read or update host workspace state directly.
25
25
  state.
26
26
  - `workspace.openFeature()` for user-activated host workspace navigation, such as opening the message center.
27
27
  - `logs.write()` for fire-and-forget frontend diagnostics that append to the workspace app `web.log`.
28
+
29
+ ## Rich Text At Providers
30
+
31
+ Workspace apps that use `@tutti-os/ui-rich-text` can adapt host mention
32
+ candidates from `window.tuttiExternal.at.query()` directly into rich-text trigger
33
+ providers:
34
+
35
+ ```ts
36
+ import { createTuttiExternalAtRichTextTriggerProviders } from "@tutti-os/workspace-external-core/rich-text";
37
+
38
+ const triggerProviders = createTuttiExternalAtRichTextTriggerProviders({
39
+ bridge: window.tuttiExternal,
40
+ providerIds: ["workspace-app", "agent-session", "agent-generated-file"]
41
+ });
42
+ ```
43
+
44
+ Each external at provider becomes one `RichTextTriggerProvider` with the same
45
+ provider id. This keeps rich-text categories and sections aligned with the host
46
+ contract, while the app still owns local-only mention sources, caching policy,
47
+ i18n labels, palette categories, row rendering, and insertion side effects.
48
+
49
+ See `@tutti-os/ui-rich-text` for the generic trigger-provider and at-panel
50
+ contracts.
@@ -0,0 +1,53 @@
1
+ import {
2
+ tuttiExternalAtProviderIds
3
+ } from "./chunk-WVMOSO4W.js";
4
+
5
+ // src/rich-text/index.ts
6
+ async function queryTuttiExternalAtRichTextTriggerItems(input) {
7
+ const bridge = input.bridge?.at;
8
+ if (!bridge) return [];
9
+ const providerIds = input.providerIds === void 0 ? tuttiExternalAtProviderIds : input.providerIds;
10
+ const results = await bridge.query({
11
+ keyword: input.keyword,
12
+ ...input.maxResults !== void 0 ? { maxResults: input.maxResults } : {},
13
+ providers: providerIds
14
+ });
15
+ const providerSet = new Set(providerIds);
16
+ return results.filter((item) => providerSet.has(item.providerId));
17
+ }
18
+ function createTuttiExternalAtRichTextTriggerProvider(input) {
19
+ return {
20
+ id: input.providerId,
21
+ trigger: "@",
22
+ async query(queryInput) {
23
+ return queryTuttiExternalAtRichTextTriggerItems({
24
+ bridge: input.bridge,
25
+ keyword: queryInput.keyword,
26
+ maxResults: queryInput.maxResults ?? input.maxResults,
27
+ providerIds: [input.providerId]
28
+ });
29
+ },
30
+ getItemKey: (item) => item.itemId,
31
+ getItemLabel: (item) => item.label,
32
+ getItemSubtitle: (item) => item.subtitle,
33
+ getItemIconUrl: (item) => item.thumbnailUrl ?? (item.insert.kind === "mention" ? item.insert.mention.presentation?.iconUrl ?? item.insert.mention.presentation?.thumbnailUrl ?? item.insert.mention.presentation?.agentIconUrl : void 0),
34
+ toInsertResult: (item) => item.insert
35
+ };
36
+ }
37
+ function createTuttiExternalAtRichTextTriggerProviders(input) {
38
+ const providerIds = input.providerIds === void 0 ? tuttiExternalAtProviderIds : input.providerIds;
39
+ return providerIds.map(
40
+ (providerId) => createTuttiExternalAtRichTextTriggerProvider({
41
+ bridge: input.bridge,
42
+ providerId,
43
+ maxResults: input.maxResults
44
+ })
45
+ );
46
+ }
47
+
48
+ export {
49
+ queryTuttiExternalAtRichTextTriggerItems,
50
+ createTuttiExternalAtRichTextTriggerProvider,
51
+ createTuttiExternalAtRichTextTriggerProviders
52
+ };
53
+ //# sourceMappingURL=chunk-B5XB2VL2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rich-text/index.ts"],"sourcesContent":["import {\n tuttiExternalAtProviderIds,\n type TuttiExternalAtProviderId,\n type TuttiExternalAtQueryInput,\n type TuttiExternalAtQueryResult\n} from \"../contracts/index.ts\";\nimport type {\n RichTextTriggerInsertResult,\n RichTextTriggerProvider\n} from \"@tutti-os/ui-rich-text/types\";\n\nexport interface TuttiExternalAtRichTextBridge {\n at?: {\n query(\n input: TuttiExternalAtQueryInput\n ):\n | Promise<readonly TuttiExternalAtQueryResult[]>\n | readonly TuttiExternalAtQueryResult[];\n };\n}\n\nexport interface CreateTuttiExternalAtRichTextTriggerProviderInput {\n bridge: TuttiExternalAtRichTextBridge | null | undefined;\n providerId: TuttiExternalAtProviderId;\n maxResults?: number;\n}\n\nexport interface CreateTuttiExternalAtRichTextTriggerProvidersInput {\n bridge: TuttiExternalAtRichTextBridge | null | undefined;\n providerIds?: readonly TuttiExternalAtProviderId[];\n maxResults?: number;\n}\n\nexport interface QueryTuttiExternalAtRichTextTriggerItemsInput {\n bridge: TuttiExternalAtRichTextBridge | null | undefined;\n keyword: string;\n providerIds?: readonly TuttiExternalAtProviderId[];\n maxResults?: number;\n}\n\nexport async function queryTuttiExternalAtRichTextTriggerItems(\n input: QueryTuttiExternalAtRichTextTriggerItemsInput\n): Promise<readonly TuttiExternalAtQueryResult[]> {\n const bridge = input.bridge?.at;\n if (!bridge) return [];\n\n const providerIds =\n input.providerIds === undefined\n ? tuttiExternalAtProviderIds\n : input.providerIds;\n const results = await bridge.query({\n keyword: input.keyword,\n ...(input.maxResults !== undefined ? { maxResults: input.maxResults } : {}),\n providers: providerIds\n });\n const providerSet = new Set<TuttiExternalAtProviderId>(providerIds);\n return results.filter((item) => providerSet.has(item.providerId));\n}\n\nexport function createTuttiExternalAtRichTextTriggerProvider(\n input: CreateTuttiExternalAtRichTextTriggerProviderInput\n): RichTextTriggerProvider<TuttiExternalAtQueryResult> {\n return {\n id: input.providerId,\n trigger: \"@\",\n async query(queryInput) {\n return queryTuttiExternalAtRichTextTriggerItems({\n bridge: input.bridge,\n keyword: queryInput.keyword,\n maxResults: queryInput.maxResults ?? input.maxResults,\n providerIds: [input.providerId]\n });\n },\n getItemKey: (item) => item.itemId,\n getItemLabel: (item) => item.label,\n getItemSubtitle: (item) => item.subtitle,\n getItemIconUrl: (item) =>\n item.thumbnailUrl ??\n (item.insert.kind === \"mention\"\n ? (item.insert.mention.presentation?.iconUrl ??\n item.insert.mention.presentation?.thumbnailUrl ??\n item.insert.mention.presentation?.agentIconUrl)\n : undefined),\n toInsertResult: (item) => item.insert as RichTextTriggerInsertResult\n };\n}\n\nexport function createTuttiExternalAtRichTextTriggerProviders(\n input: CreateTuttiExternalAtRichTextTriggerProvidersInput\n): readonly RichTextTriggerProvider<TuttiExternalAtQueryResult>[] {\n const providerIds =\n input.providerIds === undefined\n ? tuttiExternalAtProviderIds\n : input.providerIds;\n return providerIds.map((providerId) =>\n createTuttiExternalAtRichTextTriggerProvider({\n bridge: input.bridge,\n providerId,\n maxResults: input.maxResults\n })\n );\n}\n"],"mappings":";;;;;AAwCA,eAAsB,yCACpB,OACgD;AAChD,QAAM,SAAS,MAAM,QAAQ;AAC7B,MAAI,CAAC,OAAQ,QAAO,CAAC;AAErB,QAAM,cACJ,MAAM,gBAAgB,SAClB,6BACA,MAAM;AACZ,QAAM,UAAU,MAAM,OAAO,MAAM;AAAA,IACjC,SAAS,MAAM;AAAA,IACf,GAAI,MAAM,eAAe,SAAY,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;AAAA,IACzE,WAAW;AAAA,EACb,CAAC;AACD,QAAM,cAAc,IAAI,IAA+B,WAAW;AAClE,SAAO,QAAQ,OAAO,CAAC,SAAS,YAAY,IAAI,KAAK,UAAU,CAAC;AAClE;AAEO,SAAS,6CACd,OACqD;AACrD,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,SAAS;AAAA,IACT,MAAM,MAAM,YAAY;AACtB,aAAO,yCAAyC;AAAA,QAC9C,QAAQ,MAAM;AAAA,QACd,SAAS,WAAW;AAAA,QACpB,YAAY,WAAW,cAAc,MAAM;AAAA,QAC3C,aAAa,CAAC,MAAM,UAAU;AAAA,MAChC,CAAC;AAAA,IACH;AAAA,IACA,YAAY,CAAC,SAAS,KAAK;AAAA,IAC3B,cAAc,CAAC,SAAS,KAAK;AAAA,IAC7B,iBAAiB,CAAC,SAAS,KAAK;AAAA,IAChC,gBAAgB,CAAC,SACf,KAAK,iBACJ,KAAK,OAAO,SAAS,YACjB,KAAK,OAAO,QAAQ,cAAc,WACnC,KAAK,OAAO,QAAQ,cAAc,gBAClC,KAAK,OAAO,QAAQ,cAAc,eAClC;AAAA,IACN,gBAAgB,CAAC,SAAS,KAAK;AAAA,EACjC;AACF;AAEO,SAAS,8CACd,OACgE;AAChE,QAAM,cACJ,MAAM,gBAAgB,SAClB,6BACA,MAAM;AACZ,SAAO,YAAY;AAAA,IAAI,CAAC,eACtB,6CAA6C;AAAA,MAC3C,QAAQ,MAAM;AAAA,MACd;AAAA,MACA,YAAY,MAAM;AAAA,IACpB,CAAC;AAAA,EACH;AACF;","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export { TUTTI_EXTERNAL_AT_PROVIDER_IDS, TuttiExternalAtInsertResult, TuttiExternalAtMentionPresentation, TuttiExternalAtProviderId, TuttiExternalAtQueryInput, TuttiExternalAtQueryResult, TuttiExternalBridge, TuttiExternalFileOpenInput, TuttiExternalFileSelectInput, TuttiExternalFileSelectResult, TuttiExternalFileUploadInput, TuttiExternalFileUploadProgress, TuttiExternalLogInput, TuttiExternalLogLevel, TuttiExternalManagedAiModel, TuttiExternalManagedAiModelProviderId, TuttiExternalPdfMargin, TuttiExternalPdfPageSize, TuttiExternalPdfPrintHtmlInput, TuttiExternalPdfPrintHtmlResult, TuttiExternalPermissionRequestInput, TuttiExternalPermissionRequestResult, TuttiExternalReferenceOpenInput, TuttiExternalRendererRequest, TuttiExternalSettingsOpenInput, TuttiExternalUploadedFile, TuttiExternalUserProjectCreateInput, TuttiExternalUserProjectPathInput, TuttiExternalUserProjectRememberDefaultSelectionInput, TuttiExternalWorkspaceAgentProvider, TuttiExternalWorkspaceFeature, TuttiExternalWorkspaceOpenFeatureInput, tuttiExternalAtProviderIds, tuttiExternalLogLevels, tuttiExternalManagedAiModelProviderIds, tuttiExternalWorkspaceAgentProviders } from './contracts/index.js';
2
2
  export { isTuttiExternalAtProviderId, isTuttiExternalManagedAiModelProviderId, isTuttiExternalWorkspaceAgentProvider, isTuttiExternalWorkspaceFeature, limitDiagnosticText, normalizeTuttiExternalAtQueryInput, normalizeTuttiExternalFileOpenInput, normalizeTuttiExternalFileSelectInput, normalizeTuttiExternalFileUploadInput, normalizeTuttiExternalLogInput, normalizeTuttiExternalPdfPrintHtmlInput, normalizeTuttiExternalPermissionRequestInput, normalizeTuttiExternalReferenceOpenInput, normalizeTuttiExternalSettingsOpenInput, normalizeTuttiExternalUserProjectCreateInput, normalizeTuttiExternalUserProjectPathInput, normalizeTuttiExternalUserProjectRememberDefaultSelectionInput, normalizeTuttiExternalUserProjectSelectionPreparationInput, normalizeTuttiExternalWorkspaceOpenFeatureInput, tuttiExternalAtDefaultMaxResults, tuttiExternalAtMaxResultsLimit, tuttiExternalLogDiagnosticTextLimit, tuttiExternalWorkspaceFeatures } from './core/index.js';
3
+ export { CreateTuttiExternalAtRichTextTriggerProviderInput, CreateTuttiExternalAtRichTextTriggerProvidersInput, QueryTuttiExternalAtRichTextTriggerItemsInput, TuttiExternalAtRichTextBridge, createTuttiExternalAtRichTextTriggerProvider, createTuttiExternalAtRichTextTriggerProviders, queryTuttiExternalAtRichTextTriggerItems } from './rich-text/index.js';
3
4
  import '@tutti-os/workspace-file-reference/contracts';
4
5
  import '@tutti-os/workspace-user-project/contracts';
6
+ import '@tutti-os/ui-rich-text/types';
package/dist/index.js CHANGED
@@ -23,12 +23,19 @@ import {
23
23
  tuttiExternalLogDiagnosticTextLimit,
24
24
  tuttiExternalWorkspaceFeatures
25
25
  } from "./chunk-GQKGWQGE.js";
26
+ import {
27
+ createTuttiExternalAtRichTextTriggerProvider,
28
+ createTuttiExternalAtRichTextTriggerProviders,
29
+ queryTuttiExternalAtRichTextTriggerItems
30
+ } from "./chunk-B5XB2VL2.js";
26
31
  import {
27
32
  tuttiExternalAtProviderIds,
28
33
  tuttiExternalManagedAiModelProviderIds,
29
34
  tuttiExternalWorkspaceAgentProviders
30
35
  } from "./chunk-WVMOSO4W.js";
31
36
  export {
37
+ createTuttiExternalAtRichTextTriggerProvider,
38
+ createTuttiExternalAtRichTextTriggerProviders,
32
39
  isTuttiExternalAtProviderId,
33
40
  isTuttiExternalManagedAiModelProviderId,
34
41
  isTuttiExternalWorkspaceAgentProvider,
@@ -48,6 +55,7 @@ export {
48
55
  normalizeTuttiExternalUserProjectRememberDefaultSelectionInput,
49
56
  normalizeTuttiExternalUserProjectSelectionPreparationInput,
50
57
  normalizeTuttiExternalWorkspaceOpenFeatureInput,
58
+ queryTuttiExternalAtRichTextTriggerItems,
51
59
  tuttiExternalAtDefaultMaxResults,
52
60
  tuttiExternalAtMaxResultsLimit,
53
61
  tuttiExternalAtProviderIds,
@@ -0,0 +1,31 @@
1
+ import { TuttiExternalAtQueryInput, TuttiExternalAtQueryResult, TuttiExternalAtProviderId } from '../contracts/index.js';
2
+ import { RichTextTriggerProvider } from '@tutti-os/ui-rich-text/types';
3
+ import '@tutti-os/workspace-file-reference/contracts';
4
+ import '@tutti-os/workspace-user-project/contracts';
5
+
6
+ interface TuttiExternalAtRichTextBridge {
7
+ at?: {
8
+ query(input: TuttiExternalAtQueryInput): Promise<readonly TuttiExternalAtQueryResult[]> | readonly TuttiExternalAtQueryResult[];
9
+ };
10
+ }
11
+ interface CreateTuttiExternalAtRichTextTriggerProviderInput {
12
+ bridge: TuttiExternalAtRichTextBridge | null | undefined;
13
+ providerId: TuttiExternalAtProviderId;
14
+ maxResults?: number;
15
+ }
16
+ interface CreateTuttiExternalAtRichTextTriggerProvidersInput {
17
+ bridge: TuttiExternalAtRichTextBridge | null | undefined;
18
+ providerIds?: readonly TuttiExternalAtProviderId[];
19
+ maxResults?: number;
20
+ }
21
+ interface QueryTuttiExternalAtRichTextTriggerItemsInput {
22
+ bridge: TuttiExternalAtRichTextBridge | null | undefined;
23
+ keyword: string;
24
+ providerIds?: readonly TuttiExternalAtProviderId[];
25
+ maxResults?: number;
26
+ }
27
+ declare function queryTuttiExternalAtRichTextTriggerItems(input: QueryTuttiExternalAtRichTextTriggerItemsInput): Promise<readonly TuttiExternalAtQueryResult[]>;
28
+ declare function createTuttiExternalAtRichTextTriggerProvider(input: CreateTuttiExternalAtRichTextTriggerProviderInput): RichTextTriggerProvider<TuttiExternalAtQueryResult>;
29
+ declare function createTuttiExternalAtRichTextTriggerProviders(input: CreateTuttiExternalAtRichTextTriggerProvidersInput): readonly RichTextTriggerProvider<TuttiExternalAtQueryResult>[];
30
+
31
+ export { type CreateTuttiExternalAtRichTextTriggerProviderInput, type CreateTuttiExternalAtRichTextTriggerProvidersInput, type QueryTuttiExternalAtRichTextTriggerItemsInput, type TuttiExternalAtRichTextBridge, createTuttiExternalAtRichTextTriggerProvider, createTuttiExternalAtRichTextTriggerProviders, queryTuttiExternalAtRichTextTriggerItems };
@@ -0,0 +1,12 @@
1
+ import {
2
+ createTuttiExternalAtRichTextTriggerProvider,
3
+ createTuttiExternalAtRichTextTriggerProviders,
4
+ queryTuttiExternalAtRichTextTriggerItems
5
+ } from "../chunk-B5XB2VL2.js";
6
+ import "../chunk-WVMOSO4W.js";
7
+ export {
8
+ createTuttiExternalAtRichTextTriggerProvider,
9
+ createTuttiExternalAtRichTextTriggerProviders,
10
+ queryTuttiExternalAtRichTextTriggerItems
11
+ };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tutti-os/workspace-external-core",
3
- "version": "0.0.25",
3
+ "version": "0.0.26",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -16,6 +16,10 @@
16
16
  "./core": {
17
17
  "types": "./dist/core/index.d.ts",
18
18
  "import": "./dist/core/index.js"
19
+ },
20
+ "./rich-text": {
21
+ "types": "./dist/rich-text/index.d.ts",
22
+ "import": "./dist/rich-text/index.js"
19
23
  }
20
24
  },
21
25
  "files": [
@@ -28,8 +32,9 @@
28
32
  "directory": "packages/workspace/external-core"
29
33
  },
30
34
  "dependencies": {
31
- "@tutti-os/workspace-file-reference": "0.0.25",
32
- "@tutti-os/workspace-user-project": "0.0.25"
35
+ "@tutti-os/ui-rich-text": "0.0.26",
36
+ "@tutti-os/workspace-file-reference": "0.0.26",
37
+ "@tutti-os/workspace-user-project": "0.0.26"
33
38
  },
34
39
  "devDependencies": {
35
40
  "@types/node": "^24.0.1",
@@ -43,5 +48,18 @@
43
48
  "build": "tsup --config tsup.config.ts",
44
49
  "test": "node --test --experimental-strip-types \"./src/**/*.test.ts\"",
45
50
  "typecheck": "node ../../../tools/scripts/run-tsgo-typecheck.mjs"
51
+ },
52
+ "typesVersions": {
53
+ "*": {
54
+ "contracts": [
55
+ "./dist/contracts/index.d.ts"
56
+ ],
57
+ "core": [
58
+ "./dist/core/index.d.ts"
59
+ ],
60
+ "rich-text": [
61
+ "./dist/rich-text/index.d.ts"
62
+ ]
63
+ }
46
64
  }
47
65
  }