@theia/ai-external-api 1.76.0-next.33

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.
Files changed (72) hide show
  1. package/README.md +83 -0
  2. package/lib/browser/ai-external-api-frontend-contribution.d.ts +28 -0
  3. package/lib/browser/ai-external-api-frontend-contribution.d.ts.map +1 -0
  4. package/lib/browser/ai-external-api-frontend-contribution.js +88 -0
  5. package/lib/browser/ai-external-api-frontend-contribution.js.map +1 -0
  6. package/lib/browser/ai-external-api-frontend-contribution.spec.d.ts +2 -0
  7. package/lib/browser/ai-external-api-frontend-contribution.spec.d.ts.map +1 -0
  8. package/lib/browser/ai-external-api-frontend-contribution.spec.js +102 -0
  9. package/lib/browser/ai-external-api-frontend-contribution.spec.js.map +1 -0
  10. package/lib/browser/ai-external-api-frontend-module.d.ts +4 -0
  11. package/lib/browser/ai-external-api-frontend-module.d.ts.map +1 -0
  12. package/lib/browser/ai-external-api-frontend-module.js +47 -0
  13. package/lib/browser/ai-external-api-frontend-module.js.map +1 -0
  14. package/lib/browser/frontend-external-chat-session-provider.d.ts +63 -0
  15. package/lib/browser/frontend-external-chat-session-provider.d.ts.map +1 -0
  16. package/lib/browser/frontend-external-chat-session-provider.js +271 -0
  17. package/lib/browser/frontend-external-chat-session-provider.js.map +1 -0
  18. package/lib/browser/frontend-external-chat-session-provider.spec.d.ts +2 -0
  19. package/lib/browser/frontend-external-chat-session-provider.spec.d.ts.map +1 -0
  20. package/lib/browser/frontend-external-chat-session-provider.spec.js +421 -0
  21. package/lib/browser/frontend-external-chat-session-provider.spec.js.map +1 -0
  22. package/lib/browser/index.d.ts +3 -0
  23. package/lib/browser/index.d.ts.map +1 -0
  24. package/lib/browser/index.js +21 -0
  25. package/lib/browser/index.js.map +1 -0
  26. package/lib/common/external-chat-session-provider.d.ts +213 -0
  27. package/lib/common/external-chat-session-provider.d.ts.map +1 -0
  28. package/lib/common/external-chat-session-provider.js +147 -0
  29. package/lib/common/external-chat-session-provider.js.map +1 -0
  30. package/lib/common/index.d.ts +2 -0
  31. package/lib/common/index.d.ts.map +1 -0
  32. package/lib/common/index.js +20 -0
  33. package/lib/common/index.js.map +1 -0
  34. package/lib/node/ai-external-api-backend-module.d.ts +4 -0
  35. package/lib/node/ai-external-api-backend-module.d.ts.map +1 -0
  36. package/lib/node/ai-external-api-backend-module.js +38 -0
  37. package/lib/node/ai-external-api-backend-module.js.map +1 -0
  38. package/lib/node/ai-external-api-endpoint.d.ts +31 -0
  39. package/lib/node/ai-external-api-endpoint.d.ts.map +1 -0
  40. package/lib/node/ai-external-api-endpoint.js +189 -0
  41. package/lib/node/ai-external-api-endpoint.js.map +1 -0
  42. package/lib/node/ai-external-api-endpoint.spec.d.ts +2 -0
  43. package/lib/node/ai-external-api-endpoint.spec.d.ts.map +1 -0
  44. package/lib/node/ai-external-api-endpoint.spec.js +233 -0
  45. package/lib/node/ai-external-api-endpoint.spec.js.map +1 -0
  46. package/lib/node/external-chat-session-registry.d.ts +83 -0
  47. package/lib/node/external-chat-session-registry.d.ts.map +1 -0
  48. package/lib/node/external-chat-session-registry.js +266 -0
  49. package/lib/node/external-chat-session-registry.js.map +1 -0
  50. package/lib/node/external-chat-session-registry.spec.d.ts +2 -0
  51. package/lib/node/external-chat-session-registry.spec.d.ts.map +1 -0
  52. package/lib/node/external-chat-session-registry.spec.js +366 -0
  53. package/lib/node/external-chat-session-registry.spec.js.map +1 -0
  54. package/lib/node/index.d.ts +3 -0
  55. package/lib/node/index.d.ts.map +1 -0
  56. package/lib/node/index.js +21 -0
  57. package/lib/node/index.js.map +1 -0
  58. package/package.json +52 -0
  59. package/src/browser/ai-external-api-frontend-contribution.spec.ts +128 -0
  60. package/src/browser/ai-external-api-frontend-contribution.ts +90 -0
  61. package/src/browser/ai-external-api-frontend-module.ts +48 -0
  62. package/src/browser/frontend-external-chat-session-provider.spec.ts +491 -0
  63. package/src/browser/frontend-external-chat-session-provider.ts +277 -0
  64. package/src/browser/index.ts +18 -0
  65. package/src/common/external-chat-session-provider.ts +330 -0
  66. package/src/common/index.ts +17 -0
  67. package/src/node/ai-external-api-backend-module.ts +41 -0
  68. package/src/node/ai-external-api-endpoint.spec.ts +272 -0
  69. package/src/node/ai-external-api-endpoint.ts +195 -0
  70. package/src/node/external-chat-session-registry.spec.ts +413 -0
  71. package/src/node/external-chat-session-registry.ts +270 -0
  72. package/src/node/index.ts +18 -0
@@ -0,0 +1,213 @@
1
+ import { ChatSessionStatus } from '@theia/ai-chat/lib/common/chat-model';
2
+ import { IJSONSchema } from '@theia/core/lib/common/json-schema';
3
+ import { RestBodySchema } from '@theia/external-api/lib/common/rest-body-schema';
4
+ /** Base path of the external AI session HTTP API. */
5
+ export declare const AI_SESSIONS_API_PATH = "/api/ai/sessions";
6
+ /** RPC path on which each frontend registers its {@link ExternalChatSessionProvider} with the backend. */
7
+ export declare const EXTERNAL_CHAT_SESSION_PROVIDER_PATH = "/services/ai-external-api/session-provider";
8
+ /**
9
+ * Chat session summary as exposed by the external session list endpoint.
10
+ */
11
+ export interface ExternalChatSessionSummary {
12
+ id: string;
13
+ title?: string;
14
+ status: ChatSessionStatus;
15
+ /** Timestamp in milliseconds since epoch of the last interaction with the session. */
16
+ lastInteraction?: number;
17
+ /**
18
+ * URI of the workspace the session belongs to, or `undefined` if its frontend has no open
19
+ * workspace. Also `undefined` for not-restored sessions when sessions are persisted
20
+ * globally, as the global session store holds sessions saved from any workspace.
21
+ */
22
+ workspace?: string;
23
+ /** The last few lines of the conversation as plain text, or `undefined` for an empty conversation. */
24
+ preview?: string;
25
+ /** ID of the agent driving the session, or `undefined` if no agent is pinned to the session. */
26
+ agentId?: string;
27
+ /** Human-readable name of the agent driving the session, or `undefined` if no agent is pinned or the agent is not registered. */
28
+ agentName?: string;
29
+ /**
30
+ * ID of the session that delegated this one, or `undefined` for a top-level session.
31
+ * Delegated sessions are listed alongside top-level ones; use this to group them.
32
+ */
33
+ parentSessionId?: string;
34
+ /** ID of the topmost session of the delegation chain, or `undefined` for a top-level session. */
35
+ rootSessionId?: string;
36
+ /**
37
+ * Whether the session is restored (live) in a connected frontend. Sessions that are only
38
+ * persisted report metadata only: their status is reduced to `idle` or `failed` and they
39
+ * carry neither a preview nor messages until they are restored.
40
+ */
41
+ restored: boolean;
42
+ }
43
+ export declare namespace ExternalChatSessionSummary {
44
+ /** JSON Schema of {@link ExternalChatSessionSummary}, published in the OpenAPI document. */
45
+ const SCHEMA: IJSONSchema;
46
+ }
47
+ /**
48
+ * A single entry of the simplified conversation exposed by the external session detail endpoint.
49
+ *
50
+ * The conversation is reduced to plain text, similar to the message history sent to the language
51
+ * model for the next request: tool calls, thinking, and errors are rendered as text, while
52
+ * internal details such as content ids, branches, or serialization metadata are not exposed.
53
+ */
54
+ export interface ExternalChatMessage {
55
+ /** Author of the entry. */
56
+ actor: 'user' | 'ai';
57
+ /** Plain-text representation of the entry. */
58
+ text: string;
59
+ }
60
+ export declare namespace ExternalChatMessage {
61
+ /** JSON Schema of {@link ExternalChatMessage}, published in the OpenAPI document. */
62
+ const SCHEMA: IJSONSchema;
63
+ }
64
+ /**
65
+ * Chat session detail as exposed by the external session detail endpoint.
66
+ */
67
+ export interface ExternalChatSessionDetail extends ExternalChatSessionSummary {
68
+ /**
69
+ * The session's conversation reduced to plain-text messages, oldest first.
70
+ * Absent when the session is not restored (see {@link ExternalChatSessionSummary.restored}).
71
+ */
72
+ messages?: ExternalChatMessage[];
73
+ }
74
+ export declare namespace ExternalChatSessionDetail {
75
+ /** JSON Schema of {@link ExternalChatSessionDetail}, published in the OpenAPI document. */
76
+ const SCHEMA: IJSONSchema;
77
+ }
78
+ /**
79
+ * Prompt sent to an existing session through the external API.
80
+ */
81
+ export interface ExternalChatPrompt {
82
+ /** The prompt text, including optional `@agent` mentions and variable references. */
83
+ text: string;
84
+ /**
85
+ * Cancel an in-progress request (including pending tool calls) before sending.
86
+ * Without this flag, prompting a session whose status is in progress is rejected as busy.
87
+ */
88
+ interrupt?: boolean;
89
+ }
90
+ export declare namespace ExternalChatPrompt {
91
+ /** JSON Schema of {@link ExternalChatPrompt}; bodies of the prompt endpoint are validated against it. */
92
+ const SCHEMA: RestBodySchema<ExternalChatPrompt>;
93
+ }
94
+ /**
95
+ * Result of sending a prompt: the created request, or the reason the prompt was rejected.
96
+ *
97
+ * `busy` means a request was in progress and `interrupt` was not set; `noAgent` means no
98
+ * agent was available to handle the prompt (none mentioned, none pinned, no default configured).
99
+ */
100
+ export type ExternalChatPromptResult = {
101
+ sent: {
102
+ sessionId: string;
103
+ requestId: string;
104
+ };
105
+ } | {
106
+ failure: 'busy' | 'noAgent';
107
+ };
108
+ /**
109
+ * Session creation request as accepted by the external session creation endpoint.
110
+ */
111
+ export interface ExternalChatSessionCreateRequest {
112
+ /**
113
+ * URI of the workspace in which to create the session. The session is created in a
114
+ * frontend that has this workspace open. May be omitted when all connected frontends
115
+ * share the same workspace.
116
+ */
117
+ workspace?: string;
118
+ /** ID of the agent to pin to the session. When omitted, the default agent handles prompts. */
119
+ agentId?: string;
120
+ /** Initial prompt to send right after creation. */
121
+ prompt?: string;
122
+ /**
123
+ * Raise the chat view in the IDE. Note that the created session becomes the active
124
+ * session of its frontend in any case.
125
+ */
126
+ focus?: boolean;
127
+ }
128
+ export declare namespace ExternalChatSessionCreateRequest {
129
+ /** JSON Schema of {@link ExternalChatSessionCreateRequest}; bodies of the creation endpoint are validated against it. */
130
+ const SCHEMA: RestBodySchema<ExternalChatSessionCreateRequest>;
131
+ }
132
+ /**
133
+ * Result of a session creation: the created session, or the reason creation was rejected.
134
+ *
135
+ * `unknownAgent` means the requested agent id is not registered. `noAgent` means the initial
136
+ * prompt could not be handled because no agent was available (the session is not kept in that
137
+ * case). `noFrontend` means no connected frontend is available to create the session.
138
+ * `workspaceNotFound` means no connected frontend matches the requested workspace.
139
+ * `ambiguousWorkspace` means no workspace was given and the connected frontends have
140
+ * different workspaces open.
141
+ */
142
+ export type ExternalChatSessionCreateResult = {
143
+ created: {
144
+ session: ExternalChatSessionSummary;
145
+ requestId?: string;
146
+ };
147
+ } | {
148
+ failure: 'unknownAgent' | 'noAgent' | 'noFrontend' | 'workspaceNotFound' | 'ambiguousWorkspace';
149
+ };
150
+ export declare const ExternalChatSessionProvider: unique symbol;
151
+ /**
152
+ * Provides chat session information and session actions for the external API.
153
+ *
154
+ * Implemented by each frontend and registered with the backend over RPC. The backend
155
+ * queries the registered providers on demand when external clients call the HTTP API.
156
+ */
157
+ export interface ExternalChatSessionProvider {
158
+ /** Returns the URI of the workspace this frontend has opened, or `undefined` if none. */
159
+ getWorkspace(): Promise<string | undefined>;
160
+ /**
161
+ * Returns summaries of all sessions known to this frontend: sessions restored in memory
162
+ * as well as persisted sessions that have not been restored (reported with their
163
+ * persisted metadata and `restored: false`).
164
+ */
165
+ getSessions(): Promise<ExternalChatSessionSummary[]>;
166
+ /**
167
+ * Returns the summary of the given session, or `undefined` if the session is unknown to this
168
+ * frontend. Used to pick the frontend a session action is routed to, so it must stay cheap:
169
+ * unlike {@link getSession} it does not carry the conversation.
170
+ */
171
+ getSessionSummary(sessionId: string): Promise<ExternalChatSessionSummary | undefined>;
172
+ /**
173
+ * Returns the detail of the given session, or `undefined` if the session is unknown to this
174
+ * frontend. For persisted sessions that are not restored, the detail carries no messages.
175
+ */
176
+ getSession(sessionId: string): Promise<ExternalChatSessionDetail | undefined>;
177
+ /**
178
+ * Restores the given session if necessary and shows it in this frontend's chat view.
179
+ * Returns `false` if the session is unknown to this frontend.
180
+ */
181
+ openSession(sessionId: string): Promise<boolean>;
182
+ /**
183
+ * Restores the given session in this frontend without focusing it. Returns the detail of
184
+ * the restored session, or `undefined` if the session is unknown to this frontend.
185
+ */
186
+ restoreSession(sessionId: string): Promise<ExternalChatSessionDetail | undefined>;
187
+ /**
188
+ * Sends a prompt to the given session, restoring it first if necessary. Returns `undefined`
189
+ * if the session is unknown to this frontend.
190
+ */
191
+ sendPrompt(sessionId: string, prompt: ExternalChatPrompt): Promise<ExternalChatPromptResult | undefined>;
192
+ /**
193
+ * Creates a new session in this frontend and sends the initial prompt, if one is given.
194
+ * The created session becomes the frontend's active session. The request's `workspace` is
195
+ * ignored; routing to a matching frontend is the backend's responsibility.
196
+ */
197
+ createSession(request: ExternalChatSessionCreateRequest): Promise<ExternalChatSessionCreateResult>;
198
+ }
199
+ export declare const ExternalChatSessionBackendService: unique symbol;
200
+ /**
201
+ * Backend side of the {@link ExternalChatSessionProvider} connection.
202
+ *
203
+ * Invoked by each frontend to inform the backend about session changes so that the backend
204
+ * can push updates to external event stream clients.
205
+ */
206
+ export interface ExternalChatSessionBackendService {
207
+ /**
208
+ * Notifies the backend that the sessions of the calling frontend changed in a way visible
209
+ * to the external API (session created/deleted/renamed or session status changed).
210
+ */
211
+ notifySessionsChanged(): void;
212
+ }
213
+ //# sourceMappingURL=external-chat-session-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-chat-session-provider.d.ts","sourceRoot":"","sources":["../../src/common/external-chat-session-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 EclipseSource GmbH.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.ExternalChatSessionBackendService = exports.ExternalChatSessionProvider = exports.ExternalChatSessionCreateRequest = exports.ExternalChatPrompt = exports.ExternalChatSessionDetail = exports.ExternalChatMessage = exports.ExternalChatSessionSummary = exports.EXTERNAL_CHAT_SESSION_PROVIDER_PATH = exports.AI_SESSIONS_API_PATH = void 0;
19
+ const chat_model_1 = require("@theia/ai-chat/lib/common/chat-model");
20
+ /** Base path of the external AI session HTTP API. */
21
+ exports.AI_SESSIONS_API_PATH = '/api/ai/sessions';
22
+ /** RPC path on which each frontend registers its {@link ExternalChatSessionProvider} with the backend. */
23
+ exports.EXTERNAL_CHAT_SESSION_PROVIDER_PATH = '/services/ai-external-api/session-provider';
24
+ var ExternalChatSessionSummary;
25
+ (function (ExternalChatSessionSummary) {
26
+ /** JSON Schema of {@link ExternalChatSessionSummary}, published in the OpenAPI document. */
27
+ ExternalChatSessionSummary.SCHEMA = {
28
+ type: 'object',
29
+ required: ['id', 'status', 'restored'],
30
+ properties: {
31
+ id: { type: 'string', description: 'Unique session id.' },
32
+ title: { type: 'string', description: 'Session title, if one has been set or generated.' },
33
+ status: {
34
+ type: 'string',
35
+ enum: [...chat_model_1.ChatSessionStatus.VALUES],
36
+ description: 'Aggregated session status, derived from the state of the last request. '
37
+ + "'awaitingApproval' and 'awaitingInput' mean the session is blocked on the user."
38
+ },
39
+ lastInteraction: { type: 'number', description: 'Timestamp in milliseconds since epoch of the last interaction with the session.' },
40
+ workspace: {
41
+ type: 'string',
42
+ description: "URI of the workspace the session belongs to; absent when the session's frontend has no open workspace "
43
+ + 'and for not-restored sessions when sessions are persisted globally.'
44
+ },
45
+ preview: {
46
+ type: 'string',
47
+ description: 'The last few lines of the conversation as plain text; absent for an empty conversation and for sessions that are not restored.'
48
+ },
49
+ agentId: { type: 'string', description: 'ID of the agent driving the session; absent when no agent is pinned to the session.' },
50
+ agentName: { type: 'string', description: 'Human-readable name of the agent driving the session.' },
51
+ parentSessionId: {
52
+ type: 'string',
53
+ description: 'ID of the session that delegated this one; absent for a top-level session. '
54
+ + 'Delegated sessions are listed alongside top-level ones; use this to group them.'
55
+ },
56
+ rootSessionId: {
57
+ type: 'string',
58
+ description: 'ID of the topmost session of the delegation chain; absent for a top-level session.'
59
+ },
60
+ restored: {
61
+ type: 'boolean',
62
+ description: 'Whether the session is restored in a connected frontend. Sessions that are not restored report persisted metadata only.'
63
+ }
64
+ }
65
+ };
66
+ })(ExternalChatSessionSummary || (exports.ExternalChatSessionSummary = ExternalChatSessionSummary = {}));
67
+ var ExternalChatMessage;
68
+ (function (ExternalChatMessage) {
69
+ /** JSON Schema of {@link ExternalChatMessage}, published in the OpenAPI document. */
70
+ ExternalChatMessage.SCHEMA = {
71
+ type: 'object',
72
+ required: ['actor', 'text'],
73
+ properties: {
74
+ actor: { type: 'string', enum: ['user', 'ai'], description: 'Author of the entry.' },
75
+ text: { type: 'string', description: 'Plain-text representation of the entry.' }
76
+ }
77
+ };
78
+ })(ExternalChatMessage || (exports.ExternalChatMessage = ExternalChatMessage = {}));
79
+ var ExternalChatSessionDetail;
80
+ (function (ExternalChatSessionDetail) {
81
+ /** JSON Schema of {@link ExternalChatSessionDetail}, published in the OpenAPI document. */
82
+ ExternalChatSessionDetail.SCHEMA = {
83
+ ...ExternalChatSessionSummary.SCHEMA,
84
+ properties: {
85
+ ...ExternalChatSessionSummary.SCHEMA.properties,
86
+ messages: {
87
+ type: 'array',
88
+ items: ExternalChatMessage.SCHEMA,
89
+ description: "The session's conversation reduced to plain-text messages, oldest first. Absent when the session is not restored."
90
+ }
91
+ }
92
+ };
93
+ })(ExternalChatSessionDetail || (exports.ExternalChatSessionDetail = ExternalChatSessionDetail = {}));
94
+ var ExternalChatPrompt;
95
+ (function (ExternalChatPrompt) {
96
+ /** JSON Schema of {@link ExternalChatPrompt}; bodies of the prompt endpoint are validated against it. */
97
+ ExternalChatPrompt.SCHEMA = {
98
+ type: 'object',
99
+ required: ['text'],
100
+ additionalProperties: false,
101
+ properties: {
102
+ text: {
103
+ type: 'string',
104
+ pattern: '\\S',
105
+ description: 'The prompt text, including optional `@agent` mentions and variable references. Must not be blank.'
106
+ },
107
+ interrupt: {
108
+ type: 'boolean',
109
+ description: 'Cancel an in-progress request (including pending tool calls) before sending. '
110
+ + 'Without this flag, prompting a session whose status is in progress is rejected as busy.'
111
+ }
112
+ }
113
+ };
114
+ })(ExternalChatPrompt || (exports.ExternalChatPrompt = ExternalChatPrompt = {}));
115
+ var ExternalChatSessionCreateRequest;
116
+ (function (ExternalChatSessionCreateRequest) {
117
+ /** JSON Schema of {@link ExternalChatSessionCreateRequest}; bodies of the creation endpoint are validated against it. */
118
+ ExternalChatSessionCreateRequest.SCHEMA = {
119
+ type: 'object',
120
+ additionalProperties: false,
121
+ properties: {
122
+ workspace: {
123
+ type: 'string',
124
+ pattern: '\\S',
125
+ description: 'URI of the workspace in which to create the session. The session is created in a frontend that has this workspace open. '
126
+ + 'May be omitted when all connected frontends share the same workspace.'
127
+ },
128
+ agentId: {
129
+ type: 'string',
130
+ pattern: '\\S',
131
+ description: 'ID of the agent to pin to the session. When omitted, the default agent handles prompts.'
132
+ },
133
+ prompt: {
134
+ type: 'string',
135
+ pattern: '\\S',
136
+ description: 'Initial prompt to send right after creation. Must not be blank when given.'
137
+ },
138
+ focus: {
139
+ type: 'boolean',
140
+ description: 'Raise the chat view in the IDE. The created session becomes the active session of its frontend in any case.'
141
+ }
142
+ }
143
+ };
144
+ })(ExternalChatSessionCreateRequest || (exports.ExternalChatSessionCreateRequest = ExternalChatSessionCreateRequest = {}));
145
+ exports.ExternalChatSessionProvider = Symbol('ExternalChatSessionProvider');
146
+ exports.ExternalChatSessionBackendService = Symbol('ExternalChatSessionBackendService');
147
+ //# sourceMappingURL=external-chat-session-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-chat-session-provider.js","sourceRoot":"","sources":["../../src/common/external-chat-session-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './external-chat-session-provider';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":"AAgBA,cAAc,kCAAkC,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 EclipseSource GmbH.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const tslib_1 = require("tslib");
19
+ tslib_1.__exportStar(require("./external-chat-session-provider"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/common/index.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAEhF,2EAAiD"}
@@ -0,0 +1,4 @@
1
+ import { ContainerModule } from '@theia/core/shared/inversify';
2
+ declare const _default: ContainerModule;
3
+ export default _default;
4
+ //# sourceMappingURL=ai-external-api-backend-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-external-api-backend-module.d.ts","sourceRoot":"","sources":["../../src/node/ai-external-api-backend-module.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;;AAM/D,wBAiBG"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 EclipseSource GmbH.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const core_1 = require("@theia/core");
19
+ const inversify_1 = require("@theia/core/shared/inversify");
20
+ const external_api_contribution_1 = require("@theia/external-api/lib/node/external-api-contribution");
21
+ const external_chat_session_provider_1 = require("../common/external-chat-session-provider");
22
+ const ai_external_api_endpoint_1 = require("./ai-external-api-endpoint");
23
+ const external_chat_session_registry_1 = require("./external-chat-session-registry");
24
+ exports.default = new inversify_1.ContainerModule(bind => {
25
+ bind(external_chat_session_registry_1.ExternalChatSessionRegistry).toSelf().inSingletonScope();
26
+ bind(ai_external_api_endpoint_1.AIExternalApiEndpoint).toSelf().inSingletonScope();
27
+ bind(external_api_contribution_1.ExternalApiContribution).toService(ai_external_api_endpoint_1.AIExternalApiEndpoint);
28
+ bind(core_1.ConnectionHandler).toDynamicValue(ctx => new core_1.RpcConnectionHandler(external_chat_session_provider_1.EXTERNAL_CHAT_SESSION_PROVIDER_PATH, provider => {
29
+ const registry = ctx.container.get(external_chat_session_registry_1.ExternalChatSessionRegistry);
30
+ registry.addProvider(provider);
31
+ provider.onDidCloseConnection(() => registry.removeProvider(provider));
32
+ const backendService = {
33
+ notifySessionsChanged: () => registry.notifySessionsChanged()
34
+ };
35
+ return backendService;
36
+ })).inSingletonScope();
37
+ });
38
+ //# sourceMappingURL=ai-external-api-backend-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-external-api-backend-module.js","sourceRoot":"","sources":["../../src/node/ai-external-api-backend-module.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;AAEhF,sCAAsE;AACtE,4DAA+D;AAC/D,sGAAiG;AACjG,6FAA+J;AAC/J,yEAAmE;AACnE,qFAA+E;AAE/E,kBAAe,IAAI,2BAAe,CAAC,IAAI,CAAC,EAAE;IACtC,IAAI,CAAC,4DAA2B,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAE9D,IAAI,CAAC,gDAAqB,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACxD,IAAI,CAAC,mDAAuB,CAAC,CAAC,SAAS,CAAC,gDAAqB,CAAC,CAAC;IAE/D,IAAI,CAAC,wBAAiB,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CACzC,IAAI,2BAAoB,CAA8B,oEAAmC,EAAE,QAAQ,CAAC,EAAE;QAClG,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,4DAA2B,CAAC,CAAC;QAChE,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC/B,QAAQ,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvE,MAAM,cAAc,GAAsC;YACtD,qBAAqB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,qBAAqB,EAAE;SAChE,CAAC;QACF,OAAO,cAAc,CAAC;IAC1B,CAAC,CAAC,CACL,CAAC,gBAAgB,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { ExternalApiContribution, ExternalApiContributionDocumentation } from '@theia/external-api/lib/node/external-api-contribution';
2
+ import { ExternalApiRouter } from '@theia/external-api/lib/node/external-api-router';
3
+ import { RestResult } from '@theia/external-api/lib/node/rest-result';
4
+ import { ExternalChatPrompt, ExternalChatSessionCreateRequest } from '../common/external-chat-session-provider';
5
+ import { ExternalChatSessionRegistry } from './external-chat-session-registry';
6
+ /**
7
+ * Contributes the AI session API to the external API server:
8
+ * - `GET /api/ai/sessions` lists all sessions (restored and persisted) with id, title, status,
9
+ * agent, workspace, last interaction time, and a short plain-text preview of the conversation.
10
+ * - `POST /api/ai/sessions` creates a session in a frontend matching the requested workspace,
11
+ * optionally pinning an agent and sending an initial prompt.
12
+ * - `GET /api/ai/sessions/events` streams the session list as server-sent events, pushing an
13
+ * updated list whenever sessions change.
14
+ * - `GET /api/ai/sessions/:id` returns a single session including its conversation reduced to
15
+ * plain-text messages (persisted sessions report metadata only until restored).
16
+ * - `POST /api/ai/sessions/:id/open` shows the session in the chat view of a connected frontend.
17
+ * - `POST /api/ai/sessions/:id/restore` restores a persisted session and returns its detail.
18
+ * - `POST /api/ai/sessions/:id/prompt` sends a prompt to the session.
19
+ *
20
+ * The endpoints are served on the external API port and are token-protected when an
21
+ * external API token is configured (see `@theia/external-api`).
22
+ */
23
+ export declare class AIExternalApiEndpoint implements ExternalApiContribution {
24
+ readonly path = "/api/ai/sessions";
25
+ readonly documentation: ExternalApiContributionDocumentation;
26
+ protected readonly registry: ExternalChatSessionRegistry;
27
+ configure(router: ExternalApiRouter): void;
28
+ protected createSession(request: ExternalChatSessionCreateRequest): Promise<RestResult>;
29
+ protected sendPrompt(sessionId: string, prompt: ExternalChatPrompt): Promise<RestResult>;
30
+ }
31
+ //# sourceMappingURL=ai-external-api-endpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-external-api-endpoint.d.ts","sourceRoot":"","sources":["../../src/node/ai-external-api-endpoint.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,uBAAuB,EAAE,oCAAoC,EAAE,MAAM,wDAAwD,CAAC;AACvI,OAAO,EAAE,iBAAiB,EAA0B,MAAM,kDAAkD,CAAC;AAC7G,OAAO,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACtE,OAAO,EACmB,kBAAkB,EAAE,gCAAgC,EAC7E,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AA8B/E;;;;;;;;;;;;;;;;GAgBG;AACH,qBACa,qBAAsB,YAAW,uBAAuB;IAEjE,QAAQ,CAAC,IAAI,sBAAwB;IAErC,QAAQ,CAAC,aAAa,EAAE,oCAAoC,CAG1D;IAGF,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,2BAA2B,CAAC;IAEzD,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;cAiF1B,aAAa,CAAC,OAAO,EAAE,gCAAgC,GAAG,OAAO,CAAC,UAAU,CAAC;cAmB7E,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC;CAUjG"}