@astram/frontend-core 0.10.0 → 0.12.0

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 (41) hide show
  1. package/dist/agent/agentReducer.d.ts +27 -0
  2. package/dist/agent/agentReducer.d.ts.map +1 -0
  3. package/dist/agent/agentReducer.js +286 -0
  4. package/dist/agent/agentReducer.js.map +1 -0
  5. package/dist/agent/agentService.d.ts +136 -0
  6. package/dist/agent/agentService.d.ts.map +1 -0
  7. package/dist/agent/agentService.js +308 -0
  8. package/dist/agent/agentService.js.map +1 -0
  9. package/dist/agent/index.d.ts +14 -0
  10. package/dist/agent/index.d.ts.map +1 -0
  11. package/dist/agent/index.js +10 -0
  12. package/dist/agent/index.js.map +1 -0
  13. package/dist/agent/scriptedTransport.d.ts +20 -0
  14. package/dist/agent/scriptedTransport.d.ts.map +1 -0
  15. package/dist/agent/scriptedTransport.js +122 -0
  16. package/dist/agent/scriptedTransport.js.map +1 -0
  17. package/dist/agent/sseParser.d.ts +45 -0
  18. package/dist/agent/sseParser.d.ts.map +1 -0
  19. package/dist/agent/sseParser.js +216 -0
  20. package/dist/agent/sseParser.js.map +1 -0
  21. package/dist/agent/types.d.ts +201 -0
  22. package/dist/agent/types.d.ts.map +1 -0
  23. package/dist/agent/types.js +5 -0
  24. package/dist/agent/types.js.map +1 -0
  25. package/dist/auth/index.d.ts +2 -1
  26. package/dist/auth/index.d.ts.map +1 -1
  27. package/dist/auth/index.js +1 -0
  28. package/dist/auth/index.js.map +1 -1
  29. package/dist/auth/notificationService.d.ts +51 -1
  30. package/dist/auth/notificationService.d.ts.map +1 -1
  31. package/dist/auth/notificationService.js +102 -2
  32. package/dist/auth/notificationService.js.map +1 -1
  33. package/dist/http/refreshingHttp.d.ts +28 -1
  34. package/dist/http/refreshingHttp.d.ts.map +1 -1
  35. package/dist/http/refreshingHttp.js +19 -0
  36. package/dist/http/refreshingHttp.js.map +1 -1
  37. package/dist/index.d.ts +2 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +2 -0
  40. package/dist/index.js.map +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,27 @@
1
+ /**
2
+ * agentReducer — pure fold of agent stream events into task state (SPEC
3
+ * `docs/features/agent-read-capabilities/SPEC.md` §3 B, F; §5 frontend-core).
4
+ *
5
+ * `seq` is task-wide (§3 B): an event with `seq ≤ lastSeq` is a duplicate and changes nothing (a
6
+ * replay snapshot is merged by `seq`); a jump past `lastSeq + 1`, or a `replay.truncated` whose
7
+ * `firstRetainedSeq − 1` is beyond `lastSeq`, sets `truncated` (events were missed). An event of
8
+ * another task is ignored. Payloads are read defensively: a malformed part is skipped, never shown raw.
9
+ *
10
+ * The state shows the latest run: `task.started` clears steps, tools, answer, questions, error and
11
+ * usage. Terminal events: `done` (`completed` ⇒ `done`, `awaiting_clarification`) and `error`.
12
+ * Client inputs (`local.*`) mark the stream opened/closed, a lost connection (watchdog or a stream
13
+ * that ended with no terminal event) and a refusal before the first byte (§3 D).
14
+ */
15
+ import type { AgentLocalEvent, AgentStreamEvent, AgentTaskState } from './types.js';
16
+ /** The empty state of a task not yet opened. */
17
+ export declare const INITIAL_AGENT_STATE: AgentTaskState;
18
+ /**
19
+ * Fixed display text for an agent error code (never server text). An unknown code falls back to
20
+ * the HTTP status text when a status is given, else a generic line.
21
+ */
22
+ export declare function agentErrorText(code: string | null, status?: number): string;
23
+ /** Pure: the next state for one server event or client input. Never throws, never mutates. */
24
+ export declare function agentReducer(state: AgentTaskState, event: AgentStreamEvent | AgentLocalEvent): AgentTaskState;
25
+ /** `true` when the state ended its run (`done`, `awaiting_clarification` or `error`). */
26
+ export declare function isAgentTerminal(state: AgentTaskState): boolean;
27
+ //# sourceMappingURL=agentReducer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentReducer.d.ts","sourceRoot":"","sources":["../../src/agent/agentReducer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAIV,eAAe,EAKf,gBAAgB,EAEhB,cAAc,EAKf,MAAM,YAAY,CAAC;AAEpB,gDAAgD;AAChD,eAAO,MAAM,mBAAmB,EAAE,cAahC,CAAC;AAiDH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ3E;AAuND,8FAA8F;AAC9F,wBAAgB,YAAY,CAC1B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,gBAAgB,GAAG,eAAe,GACxC,cAAc,CAKhB;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAI9D"}
@@ -0,0 +1,286 @@
1
+ /** The empty state of a task not yet opened. */
2
+ export const INITIAL_AGENT_STATE = Object.freeze({
3
+ taskId: null,
4
+ status: 'idle',
5
+ run: 0,
6
+ steps: Object.freeze([]),
7
+ tools: Object.freeze({}),
8
+ answer: null,
9
+ questions: null,
10
+ error: null,
11
+ usage: null,
12
+ lastSeq: 0,
13
+ live: false,
14
+ truncated: false,
15
+ });
16
+ /** Fixed text per error code (§3 D, SSE `error` codes, the client's `connection_lost`). */
17
+ const CODE_TEXT = {
18
+ connection_lost: 'Connection lost — the task was stopped.',
19
+ invalid_request: 'The request was not accepted.',
20
+ session_required: 'The assistant needs a signed-in user session.',
21
+ agent_disabled: 'The assistant is not enabled for this company.',
22
+ task_not_found: 'That task was not found.',
23
+ task_busy: 'This task is still running. Try again when it has finished.',
24
+ task_closed: 'This task is closed. Start a new one.',
25
+ task_expired: 'This task has expired. Start a new one.',
26
+ payload_too_large: 'The message is too long.',
27
+ too_many_tasks: 'Too many tasks are running. Wait for one to finish and try again.',
28
+ agent_unavailable: 'The assistant is temporarily unavailable. Try again shortly.',
29
+ limit_reached: 'The task reached its limit and was stopped.',
30
+ timeout: 'The task took too long and was stopped.',
31
+ model_unavailable: 'The model is unavailable right now. Try again shortly.',
32
+ model_refused: 'The model declined this request.',
33
+ invalid_tool_call: 'The assistant made an invalid request and was stopped.',
34
+ answer_too_long: 'The answer was too long.',
35
+ provider_mismatch: 'The assistant is not set up correctly.',
36
+ internal: 'Something went wrong in the assistant.',
37
+ cancelled: 'The task was cancelled.',
38
+ protocol_error: 'The assistant stopped unexpectedly.',
39
+ runtime_unavailable: 'The assistant is unavailable right now. Try again shortly.',
40
+ session_ended: 'Your session ended, so the task was stopped.',
41
+ access_revoked: 'Your access changed, so the task was stopped.',
42
+ egress_denied: 'This data may not be sent to the model, so the task was stopped.',
43
+ unsupported_claim: 'The answer could not be matched to the data. Try again.',
44
+ record_failed: 'The task could not be recorded, so it was stopped.',
45
+ unavailable: 'The assistant is temporarily unavailable. Try again shortly.',
46
+ };
47
+ /** Fixed text per HTTP status when the code is unknown (R-7). */
48
+ const STATUS_TEXT = {
49
+ 0: 'Could not reach the server. Check your connection and try again.',
50
+ 400: 'The request was not accepted.',
51
+ 401: 'Please sign in again.',
52
+ 403: 'You do not have access to the assistant.',
53
+ 404: 'That task was not found.',
54
+ 409: 'This task cannot take that request now.',
55
+ 413: 'The message is too long.',
56
+ 429: 'Too many tasks are running. Wait for one to finish and try again.',
57
+ 503: 'The assistant is temporarily unavailable. Try again shortly.',
58
+ };
59
+ const GENERIC_TEXT = 'The assistant could not complete the task.';
60
+ /**
61
+ * Fixed display text for an agent error code (never server text). An unknown code falls back to
62
+ * the HTTP status text when a status is given, else a generic line.
63
+ */
64
+ export function agentErrorText(code, status) {
65
+ if (code !== null && Object.prototype.hasOwnProperty.call(CODE_TEXT, code)) {
66
+ return CODE_TEXT[code];
67
+ }
68
+ if (status !== undefined && Object.prototype.hasOwnProperty.call(STATUS_TEXT, status)) {
69
+ return STATUS_TEXT[status];
70
+ }
71
+ return GENERIC_TEXT;
72
+ }
73
+ function taskError(code, retryable, status) {
74
+ return { code, retryable, message: agentErrorText(code, status) };
75
+ }
76
+ const isObj = (v) => v !== null && typeof v === 'object' && !Array.isArray(v);
77
+ const isStr = (v) => typeof v === 'string';
78
+ const isCount = (v) => Number.isSafeInteger(v) && v >= 0;
79
+ const isNum = (v) => v === null || (typeof v === 'number' && Number.isFinite(v)) || typeof v === 'string';
80
+ const TOOL_STATUSES = ['ok', 'denied', 'invalid', 'failed', 'timeout'];
81
+ function readPartial(v) {
82
+ if (!isObj(v) || !isCount(v.shown))
83
+ return null;
84
+ if (v.total !== null && !isCount(v.total))
85
+ return null;
86
+ return { shown: v.shown, total: v.total };
87
+ }
88
+ /** Evidence of a known kind with the expected fields, else null (never passed on raw). */
89
+ function readEvidence(v) {
90
+ if (!isObj(v))
91
+ return null;
92
+ const opt = (k) => isStr(v[k]) ? { [k]: v[k] } : {};
93
+ switch (v.kind) {
94
+ case 'metric':
95
+ if (!isStr(v.label) || !isNum(v.value))
96
+ return null;
97
+ return { kind: 'metric', label: v.label, value: v.value, ...opt('unit'), ...opt('asOf') };
98
+ case 'table': {
99
+ if (!Array.isArray(v.columns) || !Array.isArray(v.rows))
100
+ return null;
101
+ const columns = v.columns.filter((c) => isObj(c) &&
102
+ isStr(c.key) &&
103
+ isStr(c.label) &&
104
+ (c.numeric === undefined || typeof c.numeric === 'boolean'));
105
+ if (columns.length !== v.columns.length)
106
+ return null;
107
+ const rows = v.rows.filter((r) => isObj(r) &&
108
+ Object.values(r).every((c) => c === null ||
109
+ isStr(c) ||
110
+ typeof c === 'boolean' ||
111
+ (typeof c === 'number' && Number.isFinite(c))));
112
+ if (rows.length !== v.rows.length)
113
+ return null;
114
+ return { kind: 'table', columns, rows };
115
+ }
116
+ case 'series': {
117
+ if (!isStr(v.label) || !Array.isArray(v.points))
118
+ return null;
119
+ const points = v.points.filter((p) => isObj(p) && isStr(p.x) && isNum(p.y));
120
+ if (points.length !== v.points.length)
121
+ return null;
122
+ return { kind: 'series', label: v.label, ...opt('unit'), points };
123
+ }
124
+ default:
125
+ return null;
126
+ }
127
+ }
128
+ function readOption(v) {
129
+ return isObj(v) && isStr(v.value) && isStr(v.label) ? { value: v.value, label: v.label } : null;
130
+ }
131
+ function readQuestion(v) {
132
+ if (!isObj(v) || !isStr(v.id) || !isStr(v.text))
133
+ return null;
134
+ if (v.kind === 'free_text')
135
+ return { id: v.id, text: v.text, kind: 'free_text' };
136
+ if (v.kind !== 'single' && v.kind !== 'multi')
137
+ return null;
138
+ if (!Array.isArray(v.options))
139
+ return null;
140
+ const options = v.options.map(readOption);
141
+ if (options.length === 0 || options.some((o) => o === null))
142
+ return null;
143
+ return { id: v.id, text: v.text, kind: v.kind, options: options };
144
+ }
145
+ function readAnswer(p) {
146
+ if (!isStr(p.answer))
147
+ return null;
148
+ const claims = Array.isArray(p.claims)
149
+ ? p.claims
150
+ .filter((c) => isObj(c) && isStr(c.text) && Array.isArray(c.refs))
151
+ .map((c) => ({ text: c.text, refs: c.refs.filter(isStr) }))
152
+ : [];
153
+ const gaps = Array.isArray(p.gaps) ? p.gaps.filter(isStr) : [];
154
+ return { answer: p.answer, claims, gaps };
155
+ }
156
+ function readUsage(v) {
157
+ return isObj(v) && isCount(v.modelCalls) && isCount(v.toolCalls)
158
+ ? { modelCalls: v.modelCalls, toolCalls: v.toolCalls }
159
+ : null;
160
+ }
161
+ function applyLocal(state, event) {
162
+ switch (event.type) {
163
+ case 'local.opened':
164
+ return event.live
165
+ ? { ...state, status: 'streaming', live: true, error: null }
166
+ : { ...state, live: false };
167
+ case 'local.closed':
168
+ return state.live ? { ...state, live: false } : state;
169
+ case 'local.connection_lost':
170
+ return { ...state, status: 'error', live: false, error: taskError('connection_lost', false) };
171
+ case 'local.refused': {
172
+ const code = event.code ?? (event.status === 0 ? 'unreachable' : `http_${event.status}`);
173
+ return {
174
+ ...state,
175
+ status: 'error',
176
+ live: false,
177
+ error: taskError(code, event.retryable, event.status),
178
+ };
179
+ }
180
+ default:
181
+ return state;
182
+ }
183
+ }
184
+ function applyServer(state, event) {
185
+ if (state.taskId !== null && event.taskId !== state.taskId)
186
+ return state; // another task
187
+ if (!Number.isSafeInteger(event.seq) || event.seq <= state.lastSeq)
188
+ return state; // duplicate
189
+ const p = isObj(event.payload) ? event.payload : {};
190
+ if (event.type === 'replay.truncated') {
191
+ // Its seq is firstRetainedSeq − 1: everything after lastSeq up to it is gone.
192
+ return { ...state, taskId: event.taskId, lastSeq: event.seq, truncated: true };
193
+ }
194
+ const gap = state.lastSeq > 0 && event.seq !== state.lastSeq + 1;
195
+ const base = {
196
+ ...state,
197
+ taskId: event.taskId,
198
+ lastSeq: event.seq,
199
+ truncated: state.truncated || gap,
200
+ };
201
+ switch (event.type) {
202
+ case 'task.started':
203
+ return {
204
+ ...base,
205
+ status: 'streaming',
206
+ run: Number.isSafeInteger(p.run) && p.run > 0 ? p.run : state.run + 1,
207
+ steps: [],
208
+ tools: {},
209
+ answer: null,
210
+ questions: null,
211
+ error: null,
212
+ usage: null,
213
+ };
214
+ case 'step':
215
+ if (!isStr(p.key) || !isStr(p.label))
216
+ return base;
217
+ return { ...base, steps: [...state.steps, { key: p.key, label: p.label }] };
218
+ case 'tool.started': {
219
+ if (!isStr(p.callId) || !isStr(p.capability) || !isStr(p.title))
220
+ return base;
221
+ const tool = {
222
+ capability: p.capability,
223
+ title: p.title,
224
+ status: 'running',
225
+ code: null,
226
+ evidence: null,
227
+ partial: null,
228
+ };
229
+ return { ...base, tools: { ...state.tools, [p.callId]: tool } };
230
+ }
231
+ case 'tool.finished': {
232
+ if (!isStr(p.callId) || !isStr(p.status) || !TOOL_STATUSES.includes(p.status))
233
+ return base;
234
+ const prior = Object.prototype.hasOwnProperty.call(state.tools, p.callId)
235
+ ? state.tools[p.callId]
236
+ : undefined;
237
+ const tool = {
238
+ capability: prior?.capability ?? null,
239
+ title: prior?.title ?? null,
240
+ status: p.status,
241
+ code: isStr(p.code) ? p.code : null,
242
+ evidence: readEvidence(p.evidence),
243
+ partial: readPartial(p.partial),
244
+ };
245
+ return { ...base, tools: { ...state.tools, [p.callId]: tool } };
246
+ }
247
+ case 'clarification.required': {
248
+ if (!Array.isArray(p.questions))
249
+ return base;
250
+ const questions = p.questions.map(readQuestion).filter((q) => q !== null);
251
+ return { ...base, questions };
252
+ }
253
+ case 'answer': {
254
+ const answer = readAnswer(p);
255
+ return answer ? { ...base, answer } : base;
256
+ }
257
+ case 'done': {
258
+ const status = p.state === 'awaiting_clarification'
259
+ ? 'awaiting_clarification'
260
+ : p.state === 'completed'
261
+ ? 'done'
262
+ : null;
263
+ if (status === null)
264
+ return base;
265
+ return { ...base, status, error: null, usage: readUsage(p.usage), live: state.live };
266
+ }
267
+ case 'error': {
268
+ const code = isStr(p.code) && p.code !== '' ? p.code : 'internal';
269
+ return { ...base, status: 'error', error: taskError(code, p.retryable === true) };
270
+ }
271
+ default:
272
+ return base; // reserved or later types: seq advances, nothing shown
273
+ }
274
+ }
275
+ /** Pure: the next state for one server event or client input. Never throws, never mutates. */
276
+ export function agentReducer(state, event) {
277
+ if (typeof event.type === 'string' && event.type.startsWith('local.')) {
278
+ return applyLocal(state, event);
279
+ }
280
+ return applyServer(state, event);
281
+ }
282
+ /** `true` when the state ended its run (`done`, `awaiting_clarification` or `error`). */
283
+ export function isAgentTerminal(state) {
284
+ return (state.status === 'done' || state.status === 'awaiting_clarification' || state.status === 'error');
285
+ }
286
+ //# sourceMappingURL=agentReducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentReducer.js","sourceRoot":"","sources":["../../src/agent/agentReducer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * createAgentService — the agent client (G-036 M1, SPEC
3
+ * `docs/features/agent-read-capabilities/SPEC.md` §3, §5 frontend-core). Platform-agnostic like
4
+ * the other R-7 services: the JSON calls go through the injected {@link HttpClient} (bearer token
5
+ * per call), the streams through the injected {@link AgentStreamTransport}, which authenticates
6
+ * its own requests (web: `fetch` with a streamed body; a refresh only before the first byte).
7
+ *
8
+ * Routes (`@Classified` on `identity:agent:chat`, session principals only):
9
+ * POST /agent/tasks { message, modelProfile?, locale? } → SSE (run 1)
10
+ * POST /agent/tasks/:taskId/continue { message } | { answers } | { retry } → SSE (next run)
11
+ * POST /agent/tasks/:taskId/cancel {} → 202 { accepted }
12
+ * GET /agent/tasks/:taskId → task view (§3 C)
13
+ * GET /agent/tasks/:taskId/events Last-Event-ID → SSE snapshot (§3 F)
14
+ *
15
+ * Streams: each is parsed ({@link parseSseFrames}) and folded ({@link agentReducer}); every new
16
+ * state is handed to `onState`. A stall watchdog ends a live stream that sends no event and no
17
+ * heartbeat for {@link AGENT_STREAM_STALL_MS}: the transport is closed and the state becomes
18
+ * `error` / `connection_lost` (the server cancels a task whose client disconnects, Q8). A live
19
+ * stream that ends with no terminal event ends the same way. There is no automatic reconnect and
20
+ * no resubmission: the only follow-up is the read-only `replay(taskId, lastSeq)`, which merges the
21
+ * snapshot by `seq` (duplicates dropped) and ends. A new turn is a user action.
22
+ *
23
+ * Never throws: every method resolves to `{ ok: true, … }` or `{ ok: false, status, code,
24
+ * retryable, error }` with fixed text (server text is never shown).
25
+ */
26
+ import type { AbortSignalLike, HttpClient } from '../http/types.js';
27
+ import { type AgentPartial, type AgentStreamEvent, type AgentStreamTransport, type AgentTaskState, type SseDrop } from './types.js';
28
+ /** Body of `POST /agent/tasks`. `message` is 1–8000 code points (checked by the server). */
29
+ export interface AgentOpenInput {
30
+ readonly message: string;
31
+ readonly modelProfile?: string;
32
+ readonly locale?: string;
33
+ }
34
+ /** One answer to a pending clarification question (M0 §10 A). */
35
+ export interface AgentAnswerInput {
36
+ readonly id: string;
37
+ /** `single`: one option value. */
38
+ readonly value?: string;
39
+ /** `multi`: 1–10 option values. */
40
+ readonly values?: readonly string[];
41
+ /** `free_text`: 1–1000 code points. */
42
+ readonly text?: string;
43
+ }
44
+ /** Body of `POST …/continue`: exactly one variant (§3 A). */
45
+ export type AgentContinueInput = {
46
+ readonly message: string;
47
+ } | {
48
+ readonly answers: readonly AgentAnswerInput[];
49
+ } | {
50
+ readonly retry: true;
51
+ };
52
+ export interface AgentStreamOptions {
53
+ /** The state to build on: the task's current state for continue and replay. Default: empty. */
54
+ readonly state?: AgentTaskState;
55
+ /** Every new state, in order. Must not throw (errors are swallowed). */
56
+ readonly onState?: (state: AgentTaskState) => void;
57
+ /** Every event the parser accepted, in order. Must not throw. */
58
+ readonly onEvent?: (event: AgentStreamEvent) => void;
59
+ /** Aborting it closes the stream (for a live stream the server then cancels the task). */
60
+ readonly signal?: AbortSignalLike;
61
+ }
62
+ /** A refusal or failure (fixed text in `error`). */
63
+ export interface AgentFailure {
64
+ readonly ok: false;
65
+ /** HTTP status; 0 = the server could not be reached. */
66
+ readonly status: number;
67
+ /** The §3 D code when the server sent one, else null. */
68
+ readonly code: string | null;
69
+ readonly retryable: boolean;
70
+ readonly error: string;
71
+ }
72
+ export type AgentStreamResult = {
73
+ readonly ok: true;
74
+ readonly state: AgentTaskState;
75
+ /** Frames the parser refused (reason and `seq` only). */
76
+ readonly dropped: readonly SseDrop[];
77
+ /** False when the stream stalled, failed or was aborted before it ended by itself. */
78
+ readonly complete: boolean;
79
+ } | (AgentFailure & {
80
+ readonly state: AgentTaskState;
81
+ });
82
+ /** One recorded call in the task view (§3 C). No arguments, results or model text. */
83
+ export interface AgentTaskAction {
84
+ readonly callId: string;
85
+ readonly capability: string;
86
+ readonly title: string;
87
+ readonly status: string;
88
+ readonly code: string | null;
89
+ readonly startedAt: string | null;
90
+ readonly durationMs: number | null;
91
+ readonly partial: AgentPartial | null;
92
+ }
93
+ /** `GET /agent/tasks/:taskId` (§3 C). */
94
+ export interface AgentTaskView {
95
+ readonly taskId: string;
96
+ readonly state: string;
97
+ readonly runs: number;
98
+ readonly createdAt: string | null;
99
+ readonly closedAt: string | null;
100
+ readonly endReason: string | null;
101
+ readonly usage: {
102
+ readonly modelCalls: number;
103
+ readonly toolCalls: number;
104
+ readonly inputTokens: number;
105
+ readonly outputTokens: number;
106
+ };
107
+ readonly actions: readonly AgentTaskAction[];
108
+ }
109
+ export type CancelAgentTaskResult = {
110
+ readonly ok: true;
111
+ } | AgentFailure;
112
+ export type GetAgentTaskResult = {
113
+ readonly ok: true;
114
+ readonly task: AgentTaskView;
115
+ } | AgentFailure;
116
+ export interface AgentService {
117
+ /** Open a task (run 1) and stream it to the end. */
118
+ openTask(input: AgentOpenInput, opts?: AgentStreamOptions): Promise<AgentStreamResult>;
119
+ /** Start the next run of a task and stream it. Pass the task's state in `opts.state`. */
120
+ continueTask(taskId: string, input: AgentContinueInput, opts?: AgentStreamOptions): Promise<AgentStreamResult>;
121
+ /** Cancel a task (idempotent; `202` for any outcome the server accepts). */
122
+ cancelTask(accessToken: string, taskId: string): Promise<CancelAgentTaskResult>;
123
+ /** The task's metadata view (no message text). */
124
+ getTask(accessToken: string, taskId: string, signal?: AbortSignalLike): Promise<GetAgentTaskResult>;
125
+ /**
126
+ * Read-only snapshot of the retained events after `lastSeq` (0 ⇒ all), merged into
127
+ * `opts.state` by `seq`. Never resumes, cancels or changes the task.
128
+ */
129
+ replay(taskId: string, lastSeq: number, opts?: AgentStreamOptions): Promise<AgentStreamResult>;
130
+ }
131
+ export interface AgentServiceOptions {
132
+ /** Stall watchdog in ms (default {@link AGENT_STREAM_STALL_MS}). */
133
+ readonly stallMs?: number;
134
+ }
135
+ export declare function createAgentService(http: HttpClient, stream: AgentStreamTransport, options?: AgentServiceOptions): AgentService;
136
+ //# sourceMappingURL=agentService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentService.d.ts","sourceRoot":"","sources":["../../src/agent/agentService.ts"],"names":[],"mappings":"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"}