openxiangda 2.66.2 → 2.67.2
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/dist/agent.d.ts +6 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +4 -0
- package/dist/agent.js.map +1 -0
- package/dist/browser/admin-shell.d.ts +1 -1
- package/dist/browser/agent-client.d.ts +16 -0
- package/dist/browser/agent-client.d.ts.map +1 -0
- package/dist/browser/agent-client.js +54 -0
- package/dist/browser/agent-client.js.map +1 -0
- package/dist/browser/agent-conversation.d.ts +71 -0
- package/dist/browser/agent-conversation.d.ts.map +1 -0
- package/dist/browser/agent-conversation.js +391 -0
- package/dist/browser/agent-conversation.js.map +1 -0
- package/dist/browser/agent-hooks.d.ts +31 -0
- package/dist/browser/agent-hooks.d.ts.map +1 -0
- package/dist/browser/agent-hooks.js +62 -0
- package/dist/browser/agent-hooks.js.map +1 -0
- package/dist/browser/agent-protocol.d.ts +131 -0
- package/dist/browser/agent-protocol.d.ts.map +1 -0
- package/dist/browser/agent-protocol.js +2 -0
- package/dist/browser/agent-protocol.js.map +1 -0
- package/dist/browser/agent-stream.d.ts +7 -0
- package/dist/browser/agent-stream.d.ts.map +1 -0
- package/dist/browser/agent-stream.js +83 -0
- package/dist/browser/agent-stream.js.map +1 -0
- package/dist/browser/components/resource/SurfaceFields.d.ts +1 -1
- package/dist/browser/components/resource/useResourceFormDrafts.d.ts.map +1 -1
- package/dist/browser/components/workflow/StandardWorkflowPages.d.ts +1 -1
- package/dist/browser/mobile.d.ts +2 -2
- package/dist/browser/platform-client.d.ts +3 -0
- package/dist/browser/platform-client.d.ts.map +1 -1
- package/dist/browser/platform-client.js +88 -0
- package/dist/browser/platform-client.js.map +1 -1
- package/dist/browser/runtime-capabilities.d.ts +5 -0
- package/dist/browser/runtime-capabilities.d.ts.map +1 -0
- package/dist/browser/runtime-capabilities.js +4 -0
- package/dist/browser/runtime-capabilities.js.map +1 -0
- package/dist/browser/runtime.d.ts.map +1 -1
- package/dist/browser/runtime.js +2 -4
- package/dist/browser/runtime.js.map +1 -1
- package/dist/browser/standard-user-surfaces.d.ts +1 -1
- package/documentation/application-agents.md +72 -0
- package/documentation/application-operations.md +35 -0
- package/documentation/appspec.md +4 -0
- package/documentation/getting-started.md +7 -7
- package/documentation/manifest.json +11 -5
- package/documentation/reference/mcp.md +111 -0
- package/package.json +26 -17
- package/releases/2.63.0.json +45 -0
- package/releases/2.63.1.json +46 -0
- package/releases/2.66.0.json +29 -0
- package/releases/2.66.1.json +29 -0
- package/releases/2.67.0.json +33 -0
- package/releases/2.67.1.json +35 -0
- package/releases/2.67.2.json +34 -0
- package/skills/manifest.json +1 -1
- package/skills/openxiangda-v2/SKILL.md +5 -4
- package/skills/openxiangda-v2/references/application-agents.md +72 -0
- package/skills/openxiangda-v2/references/application-operations.md +35 -0
- package/skills/openxiangda-v2/references/appspec.md +4 -0
- package/skills/openxiangda-v2/references/getting-started.md +7 -7
- package/skills/openxiangda-v2/references/mcp.md +111 -0
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Application-scoped assistant client/hooks. No engine or provider administration API. */
|
|
2
|
+
export { createApplicationAgentClient, type ApplicationAgentClient } from './browser/agent-client';
|
|
3
|
+
export { useAgents, useAgentConversation } from './browser/agent-hooks';
|
|
4
|
+
export type { AgentConversationController, AgentConversationState, AgentPendingMutation, AgentMutationKind } from './browser/agent-conversation';
|
|
5
|
+
export type { ApplicationAgent, AgentConversation, AgentConversationPage, AgentConversationSnapshot, AgentRun, AgentMessage, AgentTool, AgentInteraction, AgentInteractionAcceptance, AgentReconciliation, AgentUpdatedEvent, } from './browser/agent-protocol';
|
|
6
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,OAAO,EAAE,4BAA4B,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACxE,YAAY,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjJ,YAAY,EACV,gBAAgB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,QAAQ,EAC/F,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,iBAAiB,GAC9G,MAAM,0BAA0B,CAAC"}
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Application-scoped assistant client/hooks. No engine or provider administration API. */
|
|
2
|
+
export { createApplicationAgentClient } from './browser/agent-client';
|
|
3
|
+
export { useAgents, useAgentConversation } from './browser/agent-hooks';
|
|
4
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,OAAO,EAAE,4BAA4B,EAA+B,MAAM,wBAAwB,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -67,6 +67,6 @@ export declare class AdminShellErrorBoundary extends Component<{
|
|
|
67
67
|
static getDerivedStateFromError(): {
|
|
68
68
|
failed: boolean;
|
|
69
69
|
};
|
|
70
|
-
render(): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> |
|
|
70
|
+
render(): string | number | bigint | boolean | import("react/jsx-runtime").JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
|
|
71
71
|
}
|
|
72
72
|
//# sourceMappingURL=admin-shell.d.ts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AgentConversationController } from './agent-conversation';
|
|
2
|
+
import type { AgentConversationPage, ApplicationAgent } from './agent-protocol';
|
|
3
|
+
export interface ApplicationAgentClient {
|
|
4
|
+
readonly scope: string;
|
|
5
|
+
agents(signal?: AbortSignal): Promise<ApplicationAgent[]>;
|
|
6
|
+
conversations(agentCode: string, query?: {
|
|
7
|
+
cursor?: string;
|
|
8
|
+
limit?: number;
|
|
9
|
+
search?: string;
|
|
10
|
+
}, signal?: AbortSignal): Promise<AgentConversationPage>;
|
|
11
|
+
conversation(agentCode: string): AgentConversationController;
|
|
12
|
+
dispose(): void;
|
|
13
|
+
}
|
|
14
|
+
/** No endpoint, credential, user, app or environment parameter. RuntimeBoundary installs the identity. */
|
|
15
|
+
export declare function createApplicationAgentClient(): ApplicationAgentClient;
|
|
16
|
+
//# sourceMappingURL=agent-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-client.d.ts","sourceRoot":"","sources":["../../src/browser/agent-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC1D,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACrJ,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,2BAA2B,CAAC;IAC7D,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,0GAA0G;AAC1G,wBAAgB,4BAA4B,IAAI,sBAAsB,CAqCrE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { createApplicationAgentTransport } from './platform-client';
|
|
2
|
+
import { AgentConversationController } from './agent-conversation';
|
|
3
|
+
/** No endpoint, credential, user, app or environment parameter. RuntimeBoundary installs the identity. */
|
|
4
|
+
export function createApplicationAgentClient() {
|
|
5
|
+
const transport = createApplicationAgentTransport();
|
|
6
|
+
const controllers = new Set();
|
|
7
|
+
let disposed = false;
|
|
8
|
+
const assertLive = () => { if (disposed)
|
|
9
|
+
throw new Error('AGENT_CLIENT_DISPOSED'); };
|
|
10
|
+
const dispose = () => {
|
|
11
|
+
if (disposed)
|
|
12
|
+
return;
|
|
13
|
+
disposed = true;
|
|
14
|
+
controllers.forEach(controller => controller.dispose());
|
|
15
|
+
controllers.clear();
|
|
16
|
+
transport.dispose();
|
|
17
|
+
};
|
|
18
|
+
transport.onDispose(dispose);
|
|
19
|
+
return {
|
|
20
|
+
scope: transport.scope,
|
|
21
|
+
async agents(signal) {
|
|
22
|
+
assertLive();
|
|
23
|
+
return (await transport.json('/agents', { signal })).items;
|
|
24
|
+
},
|
|
25
|
+
async conversations(agentCode, query = {}, signal) {
|
|
26
|
+
assertLive();
|
|
27
|
+
if (!/^[a-z][a-z0-9]*(?:[-.][a-z0-9]+)*$/.test(agentCode) ||
|
|
28
|
+
(query.cursor !== undefined && !/^\d+$/.test(query.cursor)) ||
|
|
29
|
+
(query.limit !== undefined && (!Number.isSafeInteger(query.limit) || query.limit < 1 || query.limit > 100)))
|
|
30
|
+
throw new Error('AGENT_QUERY_INVALID');
|
|
31
|
+
const params = new URLSearchParams({ agentCode });
|
|
32
|
+
if (query.cursor)
|
|
33
|
+
params.set('cursor', query.cursor);
|
|
34
|
+
if (query.limit)
|
|
35
|
+
params.set('limit', String(query.limit));
|
|
36
|
+
if (query.search)
|
|
37
|
+
params.set('search', query.search);
|
|
38
|
+
return await transport.json(`/conversations?${params}`, { signal });
|
|
39
|
+
},
|
|
40
|
+
conversation(agentCode) {
|
|
41
|
+
assertLive();
|
|
42
|
+
let storage;
|
|
43
|
+
try {
|
|
44
|
+
storage = typeof window === 'undefined' ? undefined : window.sessionStorage;
|
|
45
|
+
}
|
|
46
|
+
catch { /* memory-only */ }
|
|
47
|
+
const controller = new AgentConversationController(transport, agentCode, storage);
|
|
48
|
+
controllers.add(controller);
|
|
49
|
+
return controller;
|
|
50
|
+
},
|
|
51
|
+
dispose,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=agent-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-client.js","sourceRoot":"","sources":["../../src/browser/agent-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { AgentConversation, AgentConversationSnapshot, AgentInteractionAcceptance, AgentReconciliation, AgentRun, ApplicationAgentTransport } from './agent-protocol';
|
|
2
|
+
export type AgentMutationKind = 'create' | 'send' | 'submit' | 'confirm' | 'cancel-run' | 'cancel-interaction' | 'reconcile' | 'resolve-manually';
|
|
3
|
+
export interface AgentPendingMutation {
|
|
4
|
+
kind: AgentMutationKind;
|
|
5
|
+
requestId: string;
|
|
6
|
+
targetId?: string;
|
|
7
|
+
revision?: number;
|
|
8
|
+
state: 'pending' | 'unknown';
|
|
9
|
+
}
|
|
10
|
+
export interface AgentConversationState {
|
|
11
|
+
phase: 'idle' | 'loading' | 'ready' | 'error' | 'disposed';
|
|
12
|
+
stream: 'idle' | 'connecting' | 'live' | 'reconnecting' | 'disconnected';
|
|
13
|
+
persistence: 'session' | 'memory';
|
|
14
|
+
snapshot?: AgentConversationSnapshot;
|
|
15
|
+
pending?: AgentPendingMutation;
|
|
16
|
+
/** Acknowledged is admission, never business success. Closed does not attribute the change to this request. */
|
|
17
|
+
lastResolution?: {
|
|
18
|
+
requestId: string;
|
|
19
|
+
disposition: 'acknowledged' | 'closed';
|
|
20
|
+
};
|
|
21
|
+
error?: Error;
|
|
22
|
+
}
|
|
23
|
+
type RecoveryStorage = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;
|
|
24
|
+
export declare const INITIAL_AGENT_CONVERSATION_STATE: AgentConversationState;
|
|
25
|
+
/** One UI observer and mutation gate. The server still owns every durable state. */
|
|
26
|
+
export declare class AgentConversationController {
|
|
27
|
+
private readonly transport;
|
|
28
|
+
readonly agentCode: string;
|
|
29
|
+
private readonly storage?;
|
|
30
|
+
private value;
|
|
31
|
+
private readonly listeners;
|
|
32
|
+
private readonly lifetime;
|
|
33
|
+
private streamAbort?;
|
|
34
|
+
private conversationId?;
|
|
35
|
+
private writing;
|
|
36
|
+
private initialized;
|
|
37
|
+
private resumePromise?;
|
|
38
|
+
private readonly storageKey;
|
|
39
|
+
constructor(transport: ApplicationAgentTransport, agentCode: string, storage?: RecoveryStorage | undefined);
|
|
40
|
+
snapshot: () => AgentConversationState;
|
|
41
|
+
subscribe: (listener: () => void) => () => void;
|
|
42
|
+
private update;
|
|
43
|
+
private assertLive;
|
|
44
|
+
private persist;
|
|
45
|
+
/** Mount/reload only reads. It never creates a conversation or replays a write. */
|
|
46
|
+
resume(): Promise<void>;
|
|
47
|
+
private restoreAndRead;
|
|
48
|
+
/** Explicit history selection is scoped again by the platform, never trusted from storage. */
|
|
49
|
+
open(id: string): Promise<void>;
|
|
50
|
+
newConversation(): Promise<AgentConversation>;
|
|
51
|
+
send(text: string): Promise<AgentRun>;
|
|
52
|
+
cancel(runId: string): Promise<AgentRun>;
|
|
53
|
+
submitInteraction(id: string, revision: number, input: Record<string, unknown>): Promise<AgentInteractionAcceptance>;
|
|
54
|
+
confirm(id: string, revision: number): Promise<AgentInteractionAcceptance>;
|
|
55
|
+
cancelInteraction(id: string): Promise<AgentInteractionAcceptance>;
|
|
56
|
+
reconcile(id: string): Promise<AgentReconciliation>;
|
|
57
|
+
resolveManually(id: string, outcome: 'executed' | 'not_executed', note: string): Promise<AgentReconciliation>;
|
|
58
|
+
private mutate;
|
|
59
|
+
/** Read original correlation first. An absent result remains unknown, not permission to resubmit. */
|
|
60
|
+
recover(): Promise<void>;
|
|
61
|
+
private recoverOriginal;
|
|
62
|
+
refresh(): Promise<void>;
|
|
63
|
+
private readSnapshot;
|
|
64
|
+
private resolvePending;
|
|
65
|
+
private event;
|
|
66
|
+
private startStream;
|
|
67
|
+
private observe;
|
|
68
|
+
dispose(): void;
|
|
69
|
+
}
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=agent-conversation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-conversation.d.ts","sourceRoot":"","sources":["../../src/browser/agent-conversation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import { createBrowserUuid } from './uuid';
|
|
2
|
+
import { consumeAgentStream } from './agent-stream';
|
|
3
|
+
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
4
|
+
const KINDS = ['create', 'send', 'submit', 'confirm', 'cancel-run', 'cancel-interaction', 'reconcile', 'resolve-manually'];
|
|
5
|
+
const asError = (value) => value instanceof Error ? value : new Error('AGENT_REQUEST_FAILED');
|
|
6
|
+
const uuid = (value) => { if (!UUID.test(value))
|
|
7
|
+
throw new Error('AGENT_ID_INVALID'); return value; };
|
|
8
|
+
const ambiguous = (error) => {
|
|
9
|
+
const value = error;
|
|
10
|
+
return value.code === 'AGENT_IDENTITY_CHANGED' || !value.status || value.status === 408 || value.status >= 500;
|
|
11
|
+
};
|
|
12
|
+
export const INITIAL_AGENT_CONVERSATION_STATE = Object.freeze({ phase: 'idle', stream: 'idle', persistence: 'memory' });
|
|
13
|
+
function pause(ms, signal) {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
const abort = () => { clearTimeout(timer); signal.removeEventListener('abort', abort); reject(signal.reason || new DOMException('Aborted', 'AbortError')); };
|
|
16
|
+
const timer = setTimeout(() => { signal.removeEventListener('abort', abort); resolve(); }, ms);
|
|
17
|
+
if (signal.aborted)
|
|
18
|
+
abort();
|
|
19
|
+
else
|
|
20
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function replace(items, value) {
|
|
24
|
+
const index = items.findIndex(item => item.id === value.id);
|
|
25
|
+
if (index < 0)
|
|
26
|
+
return [...items, value];
|
|
27
|
+
return items.map((item, i) => i === index ? value : item);
|
|
28
|
+
}
|
|
29
|
+
/** One UI observer and mutation gate. The server still owns every durable state. */
|
|
30
|
+
export class AgentConversationController {
|
|
31
|
+
transport;
|
|
32
|
+
agentCode;
|
|
33
|
+
storage;
|
|
34
|
+
value;
|
|
35
|
+
listeners = new Set();
|
|
36
|
+
lifetime = new AbortController();
|
|
37
|
+
streamAbort;
|
|
38
|
+
conversationId;
|
|
39
|
+
writing = false;
|
|
40
|
+
initialized = false;
|
|
41
|
+
resumePromise;
|
|
42
|
+
storageKey;
|
|
43
|
+
constructor(transport, agentCode, storage) {
|
|
44
|
+
this.transport = transport;
|
|
45
|
+
this.agentCode = agentCode;
|
|
46
|
+
this.storage = storage;
|
|
47
|
+
if (!/^[a-z][a-z0-9]*(?:[-.][a-z0-9]+)*$/.test(agentCode))
|
|
48
|
+
throw new Error('AGENT_CODE_INVALID');
|
|
49
|
+
this.storageKey = `openxiangda:agent:v1:${JSON.stringify([transport.scope, agentCode])}`;
|
|
50
|
+
this.value = { ...INITIAL_AGENT_CONVERSATION_STATE, persistence: storage ? 'session' : 'memory' };
|
|
51
|
+
}
|
|
52
|
+
snapshot = () => this.value;
|
|
53
|
+
subscribe = (listener) => { this.listeners.add(listener); return () => { this.listeners.delete(listener); }; };
|
|
54
|
+
update(patch) {
|
|
55
|
+
if (this.lifetime.signal.aborted && patch.phase !== 'disposed')
|
|
56
|
+
return;
|
|
57
|
+
this.value = Object.freeze({ ...this.value, ...patch });
|
|
58
|
+
this.listeners.forEach(listener => listener());
|
|
59
|
+
}
|
|
60
|
+
assertLive() { if (this.lifetime.signal.aborted)
|
|
61
|
+
throw new Error('AGENT_OBSERVER_DISPOSED'); }
|
|
62
|
+
persist() {
|
|
63
|
+
if (!this.storage)
|
|
64
|
+
return;
|
|
65
|
+
try {
|
|
66
|
+
// Never store utterances, typed inputs, tokens, model settings or receipts.
|
|
67
|
+
this.storage.setItem(this.storageKey, JSON.stringify({ version: 1, conversationId: this.conversationId || null, pending: this.value.pending || null }));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
this.update({ persistence: 'memory' });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Mount/reload only reads. It never creates a conversation or replays a write. */
|
|
74
|
+
resume() {
|
|
75
|
+
this.assertLive();
|
|
76
|
+
if (this.initialized)
|
|
77
|
+
return this.recover();
|
|
78
|
+
if (!this.resumePromise)
|
|
79
|
+
this.resumePromise = this.restoreAndRead().then(() => {
|
|
80
|
+
this.initialized = true;
|
|
81
|
+
}).finally(() => { this.resumePromise = undefined; });
|
|
82
|
+
return this.resumePromise;
|
|
83
|
+
}
|
|
84
|
+
async restoreAndRead() {
|
|
85
|
+
this.assertLive();
|
|
86
|
+
if (this.storage) {
|
|
87
|
+
try {
|
|
88
|
+
const raw = this.storage.getItem(this.storageKey);
|
|
89
|
+
if (raw) {
|
|
90
|
+
if (raw.length > 4096)
|
|
91
|
+
throw new Error('AGENT_RECOVERY_INVALID');
|
|
92
|
+
const saved = JSON.parse(raw);
|
|
93
|
+
if (saved.version !== 1 || (saved.conversationId !== null && (typeof saved.conversationId !== 'string' || !UUID.test(saved.conversationId))))
|
|
94
|
+
throw new Error('AGENT_RECOVERY_INVALID');
|
|
95
|
+
this.conversationId = typeof saved.conversationId === 'string' ? saved.conversationId : undefined;
|
|
96
|
+
if (saved.pending) {
|
|
97
|
+
const pending = saved.pending;
|
|
98
|
+
if (!KINDS.includes(pending.kind) || !UUID.test(pending.requestId) ||
|
|
99
|
+
(pending.targetId !== undefined && !UUID.test(pending.targetId)) ||
|
|
100
|
+
(pending.revision !== undefined && (!Number.isSafeInteger(pending.revision) || pending.revision < 1)))
|
|
101
|
+
throw new Error('AGENT_RECOVERY_INVALID');
|
|
102
|
+
this.update({ pending: { kind: pending.kind, requestId: pending.requestId, targetId: pending.targetId, revision: pending.revision, state: 'unknown' } });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
if (error?.message === 'AGENT_RECOVERY_INVALID' || error instanceof SyntaxError) {
|
|
108
|
+
this.update({ phase: 'error', error: asError(error) });
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
this.update({ persistence: 'memory' }); // Storage can be unavailable; in-memory operation is still possible.
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
await this.recover();
|
|
115
|
+
}
|
|
116
|
+
/** Explicit history selection is scoped again by the platform, never trusted from storage. */
|
|
117
|
+
async open(id) {
|
|
118
|
+
this.assertLive();
|
|
119
|
+
if (!this.initialized)
|
|
120
|
+
await this.resume();
|
|
121
|
+
if (this.writing || this.value.pending)
|
|
122
|
+
throw new Error('AGENT_ORIGINAL_RESULT_REQUIRED');
|
|
123
|
+
this.streamAbort?.abort();
|
|
124
|
+
this.conversationId = uuid(id);
|
|
125
|
+
this.update({ snapshot: undefined, phase: 'loading', error: undefined });
|
|
126
|
+
await this.refresh();
|
|
127
|
+
}
|
|
128
|
+
async newConversation() {
|
|
129
|
+
const conversation = await this.mutate('create', '/conversations', { agentCode: this.agentCode });
|
|
130
|
+
uuid(conversation.id);
|
|
131
|
+
this.streamAbort?.abort();
|
|
132
|
+
this.conversationId = conversation.id;
|
|
133
|
+
this.update({ snapshot: undefined, lastResolution: undefined });
|
|
134
|
+
this.persist();
|
|
135
|
+
await this.refresh().catch(() => { });
|
|
136
|
+
return conversation;
|
|
137
|
+
}
|
|
138
|
+
async send(text) {
|
|
139
|
+
if (typeof text !== 'string' || !text.trim() || text.length > 8000)
|
|
140
|
+
throw new Error('AGENT_TEXT_INVALID');
|
|
141
|
+
if (!this.initialized)
|
|
142
|
+
await this.resume();
|
|
143
|
+
if (!this.conversationId)
|
|
144
|
+
await this.newConversation();
|
|
145
|
+
const result = await this.mutate('send', `/conversations/${uuid(this.conversationId)}/runs`, { text }, this.conversationId);
|
|
146
|
+
await this.refresh().catch(() => { });
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
async cancel(runId) {
|
|
150
|
+
const result = await this.mutate('cancel-run', `/runs/${uuid(runId)}/cancel`, {}, runId, undefined, false);
|
|
151
|
+
await this.refresh().catch(() => { });
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
async submitInteraction(id, revision, input) {
|
|
155
|
+
if (!Number.isSafeInteger(revision) || revision < 1 || !input || typeof input !== 'object' || Array.isArray(input))
|
|
156
|
+
throw new Error('AGENT_INPUT_INVALID');
|
|
157
|
+
// Untouched fields stay absent; null is an explicit clear. Do not merge partialInput.
|
|
158
|
+
const result = await this.mutate('submit', `/interactions/${uuid(id)}/submit`, { revision, input }, id, revision);
|
|
159
|
+
await this.refresh().catch(() => { });
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
async confirm(id, revision) {
|
|
163
|
+
if (!Number.isSafeInteger(revision) || revision < 1)
|
|
164
|
+
throw new Error('AGENT_INPUT_INVALID');
|
|
165
|
+
const result = await this.mutate('confirm', `/interactions/${uuid(id)}/confirm`, { revision }, id, revision);
|
|
166
|
+
await this.refresh().catch(() => { });
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
async cancelInteraction(id) {
|
|
170
|
+
const result = await this.mutate('cancel-interaction', `/interactions/${uuid(id)}/cancel`, {}, id, undefined, false);
|
|
171
|
+
await this.refresh().catch(() => { });
|
|
172
|
+
return result;
|
|
173
|
+
}
|
|
174
|
+
async reconcile(id) {
|
|
175
|
+
const result = await this.mutate('reconcile', `/tools/${uuid(id)}/reconcile`, {}, id, undefined, false);
|
|
176
|
+
await this.refresh().catch(() => { });
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
async resolveManually(id, outcome, note) {
|
|
180
|
+
if (!['executed', 'not_executed'].includes(outcome) || typeof note !== 'string' || !note.trim() || note.length > 1000)
|
|
181
|
+
throw new Error('AGENT_INPUT_INVALID');
|
|
182
|
+
const result = await this.mutate('resolve-manually', `/tools/${uuid(id)}/resolve-manually`, { outcome, note }, id, undefined, false);
|
|
183
|
+
await this.refresh().catch(() => { });
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
async mutate(kind, path, body, targetId, revision, sendRequestId = true) {
|
|
187
|
+
this.assertLive();
|
|
188
|
+
if (!this.initialized)
|
|
189
|
+
await this.resume();
|
|
190
|
+
if (this.writing || this.value.pending)
|
|
191
|
+
throw new Error('AGENT_ORIGINAL_RESULT_REQUIRED');
|
|
192
|
+
if (this.value.error?.message === 'AGENT_RECOVERY_INVALID')
|
|
193
|
+
throw this.value.error;
|
|
194
|
+
const requestId = createBrowserUuid();
|
|
195
|
+
// Freeze before dispatch, including deep typed values. App mutation of an object cannot change this intent.
|
|
196
|
+
const frozen = JSON.stringify({ ...body, ...(sendRequestId ? { requestId } : {}) });
|
|
197
|
+
this.writing = true;
|
|
198
|
+
this.update({ pending: { kind, requestId, targetId, revision, state: 'pending' }, error: undefined, lastResolution: undefined });
|
|
199
|
+
this.persist();
|
|
200
|
+
try {
|
|
201
|
+
const result = await this.transport.json(path, { method: 'POST', body: frozen, signal: this.lifetime.signal });
|
|
202
|
+
this.assertLive();
|
|
203
|
+
if (!result || typeof result !== 'object' || Array.isArray(result))
|
|
204
|
+
throw new Error('AGENT_RESPONSE_INVALID');
|
|
205
|
+
const record = result;
|
|
206
|
+
if (kind === 'create' && (typeof record.id !== 'string' || !UUID.test(record.id) || record.agentCode !== this.agentCode) ||
|
|
207
|
+
['send', 'cancel-run'].includes(kind) && (typeof record.id !== 'string' || !UUID.test(record.id) || typeof record.state !== 'string') ||
|
|
208
|
+
!['create', 'send', 'cancel-run'].includes(kind) && typeof record.state !== 'string')
|
|
209
|
+
throw new Error('AGENT_RESPONSE_INVALID');
|
|
210
|
+
this.update({ pending: undefined, lastResolution: { requestId, disposition: 'acknowledged' } });
|
|
211
|
+
this.persist();
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
if (ambiguous(error)) {
|
|
216
|
+
this.update({ pending: { kind, requestId, targetId, revision, state: 'unknown' }, error: asError(error) });
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
this.update({ pending: undefined, error: asError(error) });
|
|
220
|
+
}
|
|
221
|
+
this.persist();
|
|
222
|
+
throw error;
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
this.writing = false;
|
|
226
|
+
this.resolvePending();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/** Read original correlation first. An absent result remains unknown, not permission to resubmit. */
|
|
230
|
+
async recover() {
|
|
231
|
+
try {
|
|
232
|
+
await this.recoverOriginal();
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
this.update({ phase: 'error', error: asError(error) });
|
|
236
|
+
throw error;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
async recoverOriginal() {
|
|
240
|
+
this.assertLive();
|
|
241
|
+
const pending = this.value.pending;
|
|
242
|
+
if (pending?.kind === 'create') {
|
|
243
|
+
const query = new URLSearchParams({ agentCode: this.agentCode, requestId: pending.requestId });
|
|
244
|
+
const page = await this.transport.json(`/conversations?${query}`, { signal: this.lifetime.signal });
|
|
245
|
+
this.assertLive();
|
|
246
|
+
const found = page.items.find(item => item.requestId === pending.requestId && item.agentCode === this.agentCode);
|
|
247
|
+
if (!found)
|
|
248
|
+
return;
|
|
249
|
+
this.conversationId = uuid(found.id);
|
|
250
|
+
this.update({ pending: undefined, snapshot: undefined, lastResolution: { requestId: pending.requestId, disposition: 'acknowledged' } });
|
|
251
|
+
this.persist();
|
|
252
|
+
}
|
|
253
|
+
if (this.conversationId)
|
|
254
|
+
await this.refresh();
|
|
255
|
+
}
|
|
256
|
+
async refresh() {
|
|
257
|
+
this.assertLive();
|
|
258
|
+
if (!this.conversationId)
|
|
259
|
+
return;
|
|
260
|
+
try {
|
|
261
|
+
await this.readSnapshot();
|
|
262
|
+
this.startStream();
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
this.update({ phase: 'error', error: asError(error) });
|
|
266
|
+
throw error;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async readSnapshot() {
|
|
270
|
+
const id = this.conversationId;
|
|
271
|
+
const snapshot = await this.transport.json(`/conversations/${uuid(id)}`, { signal: this.lifetime.signal });
|
|
272
|
+
this.assertLive();
|
|
273
|
+
if (this.conversationId !== id)
|
|
274
|
+
return;
|
|
275
|
+
if (!snapshot || snapshot.conversation?.id !== id || snapshot.conversation.agentCode !== this.agentCode ||
|
|
276
|
+
!Number.isSafeInteger(snapshot.cursor) || snapshot.cursor < 0 ||
|
|
277
|
+
![snapshot.messages, snapshot.runs, snapshot.tools, snapshot.interactions].every(Array.isArray))
|
|
278
|
+
throw new Error('AGENT_SNAPSHOT_INVALID');
|
|
279
|
+
if (this.value.snapshot && snapshot.cursor < this.value.snapshot.cursor)
|
|
280
|
+
return;
|
|
281
|
+
this.update({ snapshot, phase: 'ready', error: undefined });
|
|
282
|
+
this.resolvePending();
|
|
283
|
+
this.persist();
|
|
284
|
+
}
|
|
285
|
+
resolvePending() {
|
|
286
|
+
if (this.writing)
|
|
287
|
+
return; // Never let SSE release the gate while its POST is still in flight.
|
|
288
|
+
const pending = this.value.pending, snapshot = this.value.snapshot;
|
|
289
|
+
if (!pending || !snapshot)
|
|
290
|
+
return;
|
|
291
|
+
let disposition;
|
|
292
|
+
if (pending.kind === 'send' && snapshot.messages.some(item => item.requestId === pending.requestId && item.role === 'user'))
|
|
293
|
+
disposition = 'acknowledged';
|
|
294
|
+
if (pending.kind === 'submit' || pending.kind === 'confirm' || pending.kind === 'cancel-interaction') {
|
|
295
|
+
const card = snapshot.interactions.find(item => item.id === pending.targetId);
|
|
296
|
+
if (card?.requestId === pending.requestId)
|
|
297
|
+
disposition = 'acknowledged';
|
|
298
|
+
else if (card && ((pending.revision !== undefined && card.revision > pending.revision) || card.state !== 'waiting_input'))
|
|
299
|
+
disposition = 'closed';
|
|
300
|
+
}
|
|
301
|
+
if (pending.kind === 'cancel-run') {
|
|
302
|
+
const run = snapshot.runs.find(item => item.id === pending.targetId);
|
|
303
|
+
if (run && ['stopping', 'cancelled', 'completed', 'failed', 'superseded'].includes(run.state))
|
|
304
|
+
disposition = 'closed';
|
|
305
|
+
}
|
|
306
|
+
if (pending.kind === 'reconcile' || pending.kind === 'resolve-manually') {
|
|
307
|
+
const result = snapshot.tools.find(item => item.id === pending.targetId)?.reconciliation;
|
|
308
|
+
if (result && !['unknown', 'still_unknown', 'pending'].includes(result.state))
|
|
309
|
+
disposition = 'closed';
|
|
310
|
+
}
|
|
311
|
+
if (disposition) {
|
|
312
|
+
this.update({ pending: undefined, lastResolution: { requestId: pending.requestId, disposition } });
|
|
313
|
+
this.persist();
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
event(event) {
|
|
317
|
+
const previous = this.value.snapshot;
|
|
318
|
+
if (!previous)
|
|
319
|
+
throw new Error('AGENT_SNAPSHOT_REQUIRED');
|
|
320
|
+
let snapshot = { ...previous, cursor: event.seq };
|
|
321
|
+
switch (event.type) {
|
|
322
|
+
case 'conversation.updated':
|
|
323
|
+
if (event.data.id !== previous.conversation.id)
|
|
324
|
+
throw new Error('AGENT_STREAM_SCOPE_INVALID');
|
|
325
|
+
snapshot.conversation = { ...previous.conversation, ...event.data };
|
|
326
|
+
break;
|
|
327
|
+
case 'message.updated':
|
|
328
|
+
snapshot.messages = replace(previous.messages, event.data);
|
|
329
|
+
break;
|
|
330
|
+
case 'run.updated':
|
|
331
|
+
snapshot.runs = replace(previous.runs, event.data);
|
|
332
|
+
break;
|
|
333
|
+
case 'tool.updated':
|
|
334
|
+
snapshot.tools = replace(previous.tools, event.data);
|
|
335
|
+
break;
|
|
336
|
+
case 'interaction.updated':
|
|
337
|
+
snapshot.interactions = replace(previous.interactions, event.data);
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
this.update({ snapshot, stream: 'live' });
|
|
341
|
+
this.resolvePending();
|
|
342
|
+
}
|
|
343
|
+
startStream() {
|
|
344
|
+
this.streamAbort?.abort();
|
|
345
|
+
const abort = new AbortController();
|
|
346
|
+
this.streamAbort = abort;
|
|
347
|
+
void this.observe(abort.signal).catch(error => {
|
|
348
|
+
if (!abort.signal.aborted)
|
|
349
|
+
this.update({ stream: 'disconnected', error: asError(error) });
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
async observe(signal) {
|
|
353
|
+
for (let attempt = 0; attempt <= 3 && !signal.aborted; attempt++) {
|
|
354
|
+
const id = this.conversationId, after = this.value.snapshot.cursor;
|
|
355
|
+
this.update({ stream: attempt ? 'reconnecting' : 'connecting' });
|
|
356
|
+
try {
|
|
357
|
+
const response = await this.transport.stream(`/conversations/${uuid(id)}/events?after=${after}`, signal);
|
|
358
|
+
if (signal.aborted)
|
|
359
|
+
return;
|
|
360
|
+
const result = await consumeAgentStream(response, after, event => { if (!signal.aborted)
|
|
361
|
+
this.event(event); }, signal);
|
|
362
|
+
if (signal.aborted)
|
|
363
|
+
return;
|
|
364
|
+
if (result.idle) {
|
|
365
|
+
this.update({ stream: 'idle' });
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
throw new Error('AGENT_STREAM_INTERRUPTED');
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
if (signal.aborted || this.lifetime.signal.aborted)
|
|
372
|
+
return;
|
|
373
|
+
const status = error.status;
|
|
374
|
+
if (attempt === 3 || status === 401 || status === 403 || status === 404 || status === 429)
|
|
375
|
+
throw error;
|
|
376
|
+
await pause([250, 750, 1500][attempt], signal);
|
|
377
|
+
// Only reads recover. Snapshot is cursor-consistent and may contain events received before disconnect.
|
|
378
|
+
await this.readSnapshot();
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
dispose() {
|
|
383
|
+
if (this.lifetime.signal.aborted)
|
|
384
|
+
return;
|
|
385
|
+
this.streamAbort?.abort();
|
|
386
|
+
this.lifetime.abort();
|
|
387
|
+
this.update({ phase: 'disposed', stream: 'idle', snapshot: undefined });
|
|
388
|
+
this.listeners.clear();
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=agent-conversation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-conversation.js","sourceRoot":"","sources":["../../src/browser/agent-conversation.ts"],"names":[],"mappings":"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"}
|