@amalgm/chat 0.1.1 → 0.2.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.
- package/AGENTS.md +98 -0
- package/PURPOSE.md +143 -104
- package/README.md +82 -54
- package/dist/acp/index.d.ts +7 -0
- package/dist/acp/index.d.ts.map +1 -0
- package/dist/acp/index.js +7 -0
- package/dist/acp/index.js.map +1 -0
- package/dist/acp/projection.d.ts +30 -0
- package/dist/acp/projection.d.ts.map +1 -0
- package/dist/acp/projection.js +147 -0
- package/dist/acp/projection.js.map +1 -0
- package/dist/api/conversations.d.ts +66 -0
- package/dist/api/conversations.d.ts.map +1 -0
- package/dist/api/conversations.js +202 -0
- package/dist/api/conversations.js.map +1 -0
- package/dist/api/index.d.ts +3 -3
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +1 -2
- package/dist/api/index.js.map +1 -1
- package/dist/conversations/index.d.ts +3 -0
- package/dist/conversations/index.d.ts.map +1 -0
- package/dist/conversations/index.js +3 -0
- package/dist/conversations/index.js.map +1 -0
- package/dist/conversations/transcript.d.ts +13 -0
- package/dist/conversations/transcript.d.ts.map +1 -0
- package/dist/conversations/transcript.js +171 -0
- package/dist/conversations/transcript.js.map +1 -0
- package/dist/conversations/types.d.ts +147 -0
- package/dist/conversations/types.d.ts.map +1 -0
- package/dist/conversations/types.js +9 -0
- package/dist/conversations/types.js.map +1 -0
- package/dist/events/constructors.d.ts +9 -15
- package/dist/events/constructors.d.ts.map +1 -1
- package/dist/events/constructors.js +6 -12
- package/dist/events/constructors.js.map +1 -1
- package/dist/events/index.d.ts +2 -3
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +2 -3
- package/dist/events/index.js.map +1 -1
- package/dist/events/schema.d.ts +2 -5
- package/dist/events/schema.d.ts.map +1 -1
- package/dist/events/schema.js +2 -5
- package/dist/events/schema.js.map +1 -1
- package/dist/execution/contract.d.ts +51 -0
- package/dist/execution/contract.d.ts.map +1 -0
- package/dist/execution/contract.js +127 -0
- package/dist/execution/contract.js.map +1 -0
- package/dist/execution/index.d.ts +6 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +4 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/execution/revision.d.ts +5 -0
- package/dist/execution/revision.d.ts.map +1 -0
- package/dist/execution/revision.js +17 -0
- package/dist/execution/revision.js.map +1 -0
- package/dist/execution/store.d.ts +26 -0
- package/dist/execution/store.d.ts.map +1 -0
- package/dist/execution/store.js +38 -0
- package/dist/execution/store.js.map +1 -0
- package/dist/index.d.ts +8 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -23
- package/dist/index.js.map +1 -1
- package/dist/input/index.d.ts +3 -0
- package/dist/input/index.d.ts.map +1 -0
- package/dist/input/index.js +2 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input/prompt.d.ts +17 -0
- package/dist/input/prompt.d.ts.map +1 -0
- package/dist/input/prompt.js +104 -0
- package/dist/input/prompt.js.map +1 -0
- package/dist/normalizers/claude.d.ts +6 -9
- package/dist/normalizers/claude.d.ts.map +1 -1
- package/dist/normalizers/claude.js +5 -8
- package/dist/normalizers/claude.js.map +1 -1
- package/dist/normalizers/codex.d.ts +5 -8
- package/dist/normalizers/codex.d.ts.map +1 -1
- package/dist/normalizers/codex.js +4 -7
- package/dist/normalizers/codex.js.map +1 -1
- package/dist/normalizers/cursor.d.ts +1 -2
- package/dist/normalizers/cursor.d.ts.map +1 -1
- package/dist/normalizers/cursor.js +2 -3
- package/dist/normalizers/cursor.js.map +1 -1
- package/dist/normalizers/index.d.ts +3 -5
- package/dist/normalizers/index.d.ts.map +1 -1
- package/dist/normalizers/index.js +3 -5
- package/dist/normalizers/index.js.map +1 -1
- package/dist/normalizers/opencode.d.ts +2 -4
- package/dist/normalizers/opencode.d.ts.map +1 -1
- package/dist/normalizers/opencode.js +2 -4
- package/dist/normalizers/opencode.js.map +1 -1
- package/dist/normalizers/pi.d.ts +3 -4
- package/dist/normalizers/pi.d.ts.map +1 -1
- package/dist/normalizers/pi.js +3 -4
- package/dist/normalizers/pi.js.map +1 -1
- package/dist/sessions/chat.d.ts +176 -0
- package/dist/sessions/chat.d.ts.map +1 -0
- package/dist/sessions/chat.js +701 -0
- package/dist/sessions/chat.js.map +1 -0
- package/dist/sessions/index.d.ts +3 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +2 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/transcript/index.d.ts +1 -1
- package/dist/transcript/index.js +1 -1
- package/dist/transcript/message-reducer.d.ts +1 -1
- package/dist/transcript/message-reducer.js +1 -1
- package/dist/transcript/part-accumulator.d.ts +1 -1
- package/dist/transcript/part-accumulator.js +1 -1
- package/dist/transcript/tool-display.d.ts +1 -1
- package/dist/transcript/tool-display.js +1 -1
- package/dist/transcript/tool-shape.d.ts +1 -1
- package/dist/transcript/tool-shape.js +1 -1
- package/dist/usage/finalize.d.ts +7 -9
- package/dist/usage/finalize.d.ts.map +1 -1
- package/dist/usage/finalize.js +11 -13
- package/dist/usage/finalize.js.map +1 -1
- package/dist/usage/index.d.ts +2 -3
- package/dist/usage/index.d.ts.map +1 -1
- package/dist/usage/index.js +2 -3
- package/dist/usage/index.js.map +1 -1
- package/dist/usage/model-catalog.d.ts +2 -3
- package/dist/usage/model-catalog.d.ts.map +1 -1
- package/dist/usage/model-catalog.js +10 -3
- package/dist/usage/model-catalog.js.map +1 -1
- package/dist/usage/normalize.d.ts +5 -7
- package/dist/usage/normalize.d.ts.map +1 -1
- package/dist/usage/normalize.js +3 -5
- package/dist/usage/normalize.js.map +1 -1
- package/dist/usage/ports.d.ts +14 -24
- package/dist/usage/ports.d.ts.map +1 -1
- package/dist/usage/ports.js +9 -17
- package/dist/usage/ports.js.map +1 -1
- package/dist/usage/steps.d.ts +70 -0
- package/dist/usage/steps.d.ts.map +1 -0
- package/dist/usage/steps.js +152 -0
- package/dist/usage/steps.js.map +1 -0
- package/dist/usage/tokens.d.ts +4 -7
- package/dist/usage/tokens.d.ts.map +1 -1
- package/dist/usage/tokens.js +4 -7
- package/dist/usage/tokens.js.map +1 -1
- package/docs/contracts/acp-and-step-usage.md +51 -0
- package/docs/contracts/conversation-persistence.md +47 -0
- package/docs/contracts/input-and-execution.md +177 -0
- package/docs/contracts/platform-authorization.md +17 -0
- package/host/adapters/acp-capabilities.js +30 -0
- package/host/adapters/acp-client.js +156 -0
- package/host/adapters/acp.js +284 -0
- package/host/adapters/claude.js +235 -0
- package/host/adapters/codex.js +733 -0
- package/host/adapters/cursor.js +347 -0
- package/host/adapters/input-capabilities.js +89 -0
- package/host/adapters/opencode.js +486 -0
- package/host/adapters/pi.js +519 -0
- package/host/adapters/prompt.js +212 -0
- package/host/auth.js +257 -0
- package/host/credentials/store.js +209 -0
- package/host/http.d.ts +32 -0
- package/host/http.js +238 -0
- package/host/index.d.ts +84 -0
- package/host/index.js +59 -0
- package/host/lib/runtime-paths.js +44 -0
- package/host/model-resolution.js +313 -0
- package/host/native-contract.js +185 -0
- package/host/native-runtime.js +194 -0
- package/host/permissions.js +27 -0
- package/host/platform-egress.js +114 -0
- package/host/recorder.js +61 -0
- package/host/sqlite/index.d.ts +69 -0
- package/host/sqlite/index.js +704 -0
- package/host/tooling/mcp-bundle.js +214 -0
- package/host/tooling/mcp-relay.js +83 -0
- package/host/tooling/native-binaries.js +667 -0
- package/host/tooling/native-config.js +460 -0
- package/host/tooling/package-import.js +111 -0
- package/host/tooling/runtime-home.js +26 -0
- package/host/tooling/system-instructions.js +69 -0
- package/host/tooling/system-prompt.js +35 -0
- package/package.json +45 -21
- package/skills/chat/SKILL.md +97 -0
- package/skills/chat/agents/openai.yaml +4 -0
- package/skills/chat/references/contracts.md +131 -0
- package/dist/api/chat-payloads.d.ts +0 -10
- package/dist/api/chat-payloads.d.ts.map +0 -1
- package/dist/api/chat-payloads.js +0 -57
- package/dist/api/chat-payloads.js.map +0 -1
- package/dist/contract/chat-input.d.ts +0 -144
- package/dist/contract/chat-input.d.ts.map +0 -1
- package/dist/contract/chat-input.js +0 -261
- package/dist/contract/chat-input.js.map +0 -1
- package/dist/contract/create.d.ts +0 -191
- package/dist/contract/create.d.ts.map +0 -1
- package/dist/contract/create.js +0 -249
- package/dist/contract/create.js.map +0 -1
- package/dist/contract/freeze.d.ts +0 -85
- package/dist/contract/freeze.d.ts.map +0 -1
- package/dist/contract/freeze.js +0 -151
- package/dist/contract/freeze.js.map +0 -1
- package/dist/contract/harnesses.d.ts +0 -21
- package/dist/contract/harnesses.d.ts.map +0 -1
- package/dist/contract/harnesses.js +0 -39
- package/dist/contract/harnesses.js.map +0 -1
- package/dist/contract/index.d.ts +0 -17
- package/dist/contract/index.d.ts.map +0 -1
- package/dist/contract/index.js +0 -17
- package/dist/contract/index.js.map +0 -1
- package/dist/contract/input.d.ts +0 -45
- package/dist/contract/input.d.ts.map +0 -1
- package/dist/contract/input.js +0 -78
- package/dist/contract/input.js.map +0 -1
- package/dist/contract/models.d.ts +0 -57
- package/dist/contract/models.d.ts.map +0 -1
- package/dist/contract/models.js +0 -380
- package/dist/contract/models.js.map +0 -1
- package/dist/contract/payload-merge.d.ts +0 -76
- package/dist/contract/payload-merge.d.ts.map +0 -1
- package/dist/contract/payload-merge.js +0 -215
- package/dist/contract/payload-merge.js.map +0 -1
- package/dist/events/tool-display.d.ts +0 -22
- package/dist/events/tool-display.d.ts.map +0 -1
- package/dist/events/tool-display.js +0 -60
- package/dist/events/tool-display.js.map +0 -1
- package/dist/events/tool-shape.d.ts +0 -48
- package/dist/events/tool-shape.d.ts.map +0 -1
- package/dist/events/tool-shape.js +0 -225
- package/dist/events/tool-shape.js.map +0 -1
- package/dist/turns/index.d.ts +0 -11
- package/dist/turns/index.d.ts.map +0 -1
- package/dist/turns/index.js +0 -11
- package/dist/turns/index.js.map +0 -1
- package/dist/turns/queries.d.ts +0 -36
- package/dist/turns/queries.d.ts.map +0 -1
- package/dist/turns/queries.js +0 -37
- package/dist/turns/queries.js.map +0 -1
- package/dist/turns/replay.d.ts +0 -105
- package/dist/turns/replay.d.ts.map +0 -1
- package/dist/turns/replay.js +0 -163
- package/dist/turns/replay.js.map +0 -1
- package/dist/turns/status.d.ts +0 -49
- package/dist/turns/status.d.ts.map +0 -1
- package/dist/turns/status.js +0 -56
- package/dist/turns/status.js.map +0 -1
- package/dist/turns/turn-store.d.ts +0 -109
- package/dist/turns/turn-store.d.ts.map +0 -1
- package/dist/turns/turn-store.js +0 -169
- package/dist/turns/turn-store.js.map +0 -1
- package/dist/warm/client-cache.d.ts +0 -47
- package/dist/warm/client-cache.d.ts.map +0 -1
- package/dist/warm/client-cache.js +0 -48
- package/dist/warm/client-cache.js.map +0 -1
- package/dist/warm/envelope-cache.d.ts +0 -79
- package/dist/warm/envelope-cache.d.ts.map +0 -1
- package/dist/warm/envelope-cache.js +0 -85
- package/dist/warm/envelope-cache.js.map +0 -1
- package/dist/warm/index.d.ts +0 -18
- package/dist/warm/index.d.ts.map +0 -1
- package/dist/warm/index.js +0 -12
- package/dist/warm/index.js.map +0 -1
- package/dist/warm/payload.d.ts +0 -137
- package/dist/warm/payload.d.ts.map +0 -1
- package/dist/warm/payload.js +0 -112
- package/dist/warm/payload.js.map +0 -1
- package/dist/warm/revision.d.ts +0 -70
- package/dist/warm/revision.d.ts.map +0 -1
- package/dist/warm/revision.js +0 -63
- package/dist/warm/revision.js.map +0 -1
- package/dist/warm/store-policy.d.ts +0 -57
- package/dist/warm/store-policy.d.ts.map +0 -1
- package/dist/warm/store-policy.js +0 -89
- package/dist/warm/store-policy.js.map +0 -1
- package/dist/warm/store.d.ts +0 -42
- package/dist/warm/store.d.ts.map +0 -1
- package/dist/warm/store.js +0 -69
- package/dist/warm/store.js.map +0 -1
- package/dist/wire/frames.d.ts +0 -208
- package/dist/wire/frames.d.ts.map +0 -1
- package/dist/wire/frames.js +0 -245
- package/dist/wire/frames.js.map +0 -1
- package/dist/wire/index.d.ts +0 -7
- package/dist/wire/index.d.ts.map +0 -1
- package/dist/wire/index.js +0 -7
- package/dist/wire/index.js.map +0 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { SetSessionConfigOptionRequest } from '@agentclientprotocol/sdk';
|
|
2
|
+
export declare const AUTH_MODES: readonly ["platform", "subscription", "byok"];
|
|
3
|
+
export type AuthMode = (typeof AUTH_MODES)[number];
|
|
4
|
+
export declare const PERMISSION_MODES: readonly ["ask", "full_access"];
|
|
5
|
+
export type PermissionMode = (typeof PERMISSION_MODES)[number];
|
|
6
|
+
type WithoutSessionIdentity<Setting> = Setting extends unknown ? Omit<Setting, 'sessionId' | '_meta'> : never;
|
|
7
|
+
/** One ACP session setting selected before a provider session exists. */
|
|
8
|
+
export type ModelSetting = WithoutSessionIdentity<SetSessionConfigOptionRequest>;
|
|
9
|
+
export interface AgentRevisionSelection {
|
|
10
|
+
readonly adapterId: string;
|
|
11
|
+
readonly installationId: string;
|
|
12
|
+
readonly revisionId: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ModelSelection {
|
|
15
|
+
readonly providerId: string;
|
|
16
|
+
readonly modelId: string;
|
|
17
|
+
readonly settings: readonly ModelSetting[];
|
|
18
|
+
}
|
|
19
|
+
export interface AuthSelection {
|
|
20
|
+
readonly mode: AuthMode;
|
|
21
|
+
/** Opaque reference to a prepared platform grant, login, or BYOK credential. */
|
|
22
|
+
readonly bindingId: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ToolSelection {
|
|
25
|
+
/** Immutable amalgm-tools catalog revision. Null is valid only for no tools. */
|
|
26
|
+
readonly revisionId: string | null;
|
|
27
|
+
readonly toolIds: readonly string[];
|
|
28
|
+
}
|
|
29
|
+
export interface CwdSelection {
|
|
30
|
+
/** Absolute path already materialized on `computerId`. */
|
|
31
|
+
readonly path: string;
|
|
32
|
+
readonly workspaceId: string | null;
|
|
33
|
+
readonly materializationRevision: string | null;
|
|
34
|
+
}
|
|
35
|
+
export interface ExecutionContract {
|
|
36
|
+
readonly agent: AgentRevisionSelection;
|
|
37
|
+
readonly model: ModelSelection;
|
|
38
|
+
readonly auth: AuthSelection;
|
|
39
|
+
readonly tools: ToolSelection;
|
|
40
|
+
readonly cwd: CwdSelection;
|
|
41
|
+
readonly permissionMode: PermissionMode;
|
|
42
|
+
readonly computerId: string;
|
|
43
|
+
}
|
|
44
|
+
export declare class InvalidExecutionContractError extends Error {
|
|
45
|
+
readonly code = "INVALID_EXECUTION_CONTRACT";
|
|
46
|
+
constructor(message: string);
|
|
47
|
+
}
|
|
48
|
+
/** Normalize every execution identity without performing discovery or I/O. */
|
|
49
|
+
export declare function normalizeExecutionContract(input: ExecutionContract): ExecutionContract;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/execution/contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAE9E,eAAO,MAAM,UAAU,+CAAgD,CAAC;AACxE,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD,eAAO,MAAM,gBAAgB,iCAAkC,CAAC;AAChE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D,KAAK,sBAAsB,CAAC,OAAO,IAAI,OAAO,SAAS,OAAO,GAC1D,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,GACpC,KAAK,CAAC;AAEV,yEAAyE;AACzE,MAAM,MAAM,YAAY,GAAG,sBAAsB,CAAC,6BAA6B,CAAC,CAAC;AAEjF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,gFAAgF;IAChF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,gFAAgF;IAChF,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,QAAQ,CAAC,IAAI,gCAAgC;gBAEjC,OAAO,EAAE,MAAM;CAI5B;AAsED,8EAA8E;AAC9E,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,CAuDtF"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
export const AUTH_MODES = ['platform', 'subscription', 'byok'];
|
|
2
|
+
export const PERMISSION_MODES = ['ask', 'full_access'];
|
|
3
|
+
export class InvalidExecutionContractError extends Error {
|
|
4
|
+
code = 'INVALID_EXECUTION_CONTRACT';
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'InvalidExecutionContractError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function isRecord(value) {
|
|
11
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
12
|
+
}
|
|
13
|
+
function id(value, field) {
|
|
14
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
15
|
+
throw new InvalidExecutionContractError(`${field} must be a non-empty string`);
|
|
16
|
+
}
|
|
17
|
+
return value.trim();
|
|
18
|
+
}
|
|
19
|
+
function nullableId(value, field) {
|
|
20
|
+
if (value === null)
|
|
21
|
+
return null;
|
|
22
|
+
return id(value, field);
|
|
23
|
+
}
|
|
24
|
+
function absolutePath(value) {
|
|
25
|
+
const path = id(value, 'cwd.path');
|
|
26
|
+
const posix = path.startsWith('/');
|
|
27
|
+
const windowsDrive = /^[A-Za-z]:[\\/]/.test(path);
|
|
28
|
+
const windowsUnc = /^\\\\[^\\]+\\[^\\]+/.test(path);
|
|
29
|
+
if (!posix && !windowsDrive && !windowsUnc) {
|
|
30
|
+
throw new InvalidExecutionContractError('cwd.path must be absolute');
|
|
31
|
+
}
|
|
32
|
+
return path;
|
|
33
|
+
}
|
|
34
|
+
function normalizeSettings(value) {
|
|
35
|
+
if (!Array.isArray(value)) {
|
|
36
|
+
throw new InvalidExecutionContractError('model.settings must be an array');
|
|
37
|
+
}
|
|
38
|
+
const seen = new Set();
|
|
39
|
+
const settings = value.map((raw, index) => {
|
|
40
|
+
if (!isRecord(raw)) {
|
|
41
|
+
throw new InvalidExecutionContractError(`model.settings[${index}] must be an ACP config selection`);
|
|
42
|
+
}
|
|
43
|
+
const configId = id(raw['configId'], `model.settings[${index}].configId`);
|
|
44
|
+
if (seen.has(configId)) {
|
|
45
|
+
throw new InvalidExecutionContractError(`model.settings contains duplicate configId: ${configId}`);
|
|
46
|
+
}
|
|
47
|
+
seen.add(configId);
|
|
48
|
+
if (raw['type'] === 'boolean') {
|
|
49
|
+
if (typeof raw['value'] !== 'boolean') {
|
|
50
|
+
throw new InvalidExecutionContractError(`model.settings[${index}].value must be boolean`);
|
|
51
|
+
}
|
|
52
|
+
return Object.freeze({ configId, type: 'boolean', value: raw['value'] });
|
|
53
|
+
}
|
|
54
|
+
if (raw['type'] !== undefined) {
|
|
55
|
+
throw new InvalidExecutionContractError(`model.settings[${index}].type must be boolean or omitted`);
|
|
56
|
+
}
|
|
57
|
+
const selected = id(raw['value'], `model.settings[${index}].value`);
|
|
58
|
+
return Object.freeze({ configId, value: selected });
|
|
59
|
+
});
|
|
60
|
+
return Object.freeze(settings.sort((left, right) => left.configId.localeCompare(right.configId)));
|
|
61
|
+
}
|
|
62
|
+
function normalizeTools(value) {
|
|
63
|
+
if (!isRecord(value) || !Array.isArray(value['toolIds'])) {
|
|
64
|
+
throw new InvalidExecutionContractError('tools must contain revisionId and toolIds');
|
|
65
|
+
}
|
|
66
|
+
const toolIds = [...new Set(value['toolIds'].map((toolId, index) => id(toolId, `tools.toolIds[${index}]`)))].sort();
|
|
67
|
+
const revisionId = nullableId(value['revisionId'], 'tools.revisionId');
|
|
68
|
+
if (toolIds.length > 0 && revisionId === null) {
|
|
69
|
+
throw new InvalidExecutionContractError('tools.revisionId is required when tools are selected');
|
|
70
|
+
}
|
|
71
|
+
return Object.freeze({ revisionId, toolIds: Object.freeze(toolIds) });
|
|
72
|
+
}
|
|
73
|
+
/** Normalize every execution identity without performing discovery or I/O. */
|
|
74
|
+
export function normalizeExecutionContract(input) {
|
|
75
|
+
if (!isRecord(input))
|
|
76
|
+
throw new InvalidExecutionContractError('execution contract must be an object');
|
|
77
|
+
const agent = input.agent;
|
|
78
|
+
const model = input.model;
|
|
79
|
+
const auth = input.auth;
|
|
80
|
+
const cwd = input.cwd;
|
|
81
|
+
if (!isRecord(agent))
|
|
82
|
+
throw new InvalidExecutionContractError('agent must be an immutable revision selection');
|
|
83
|
+
if (!isRecord(model))
|
|
84
|
+
throw new InvalidExecutionContractError('model must be provider-scoped');
|
|
85
|
+
if (!isRecord(auth))
|
|
86
|
+
throw new InvalidExecutionContractError('auth must be explicit');
|
|
87
|
+
if (!isRecord(cwd))
|
|
88
|
+
throw new InvalidExecutionContractError('cwd must be prepared');
|
|
89
|
+
const mode = auth['mode'];
|
|
90
|
+
if (typeof mode !== 'string' || !AUTH_MODES.includes(mode)) {
|
|
91
|
+
throw new InvalidExecutionContractError(`auth.mode must be one of: ${AUTH_MODES.join(', ')}`);
|
|
92
|
+
}
|
|
93
|
+
const permissionMode = input.permissionMode;
|
|
94
|
+
if (typeof permissionMode !== 'string' || !PERMISSION_MODES.includes(permissionMode)) {
|
|
95
|
+
throw new InvalidExecutionContractError(`permissionMode must be one of: ${PERMISSION_MODES.join(', ')}`);
|
|
96
|
+
}
|
|
97
|
+
const workspaceId = nullableId(cwd['workspaceId'], 'cwd.workspaceId');
|
|
98
|
+
const materializationRevision = nullableId(cwd['materializationRevision'], 'cwd.materializationRevision');
|
|
99
|
+
if ((workspaceId === null) !== (materializationRevision === null)) {
|
|
100
|
+
throw new InvalidExecutionContractError('cwd.workspaceId and cwd.materializationRevision must both be present or both be null');
|
|
101
|
+
}
|
|
102
|
+
return Object.freeze({
|
|
103
|
+
agent: Object.freeze({
|
|
104
|
+
adapterId: id(agent['adapterId'], 'agent.adapterId'),
|
|
105
|
+
installationId: id(agent['installationId'], 'agent.installationId'),
|
|
106
|
+
revisionId: id(agent['revisionId'], 'agent.revisionId'),
|
|
107
|
+
}),
|
|
108
|
+
model: Object.freeze({
|
|
109
|
+
providerId: id(model['providerId'], 'model.providerId'),
|
|
110
|
+
modelId: id(model['modelId'], 'model.modelId'),
|
|
111
|
+
settings: normalizeSettings(model['settings']),
|
|
112
|
+
}),
|
|
113
|
+
auth: Object.freeze({
|
|
114
|
+
mode: mode,
|
|
115
|
+
bindingId: id(auth['bindingId'], 'auth.bindingId'),
|
|
116
|
+
}),
|
|
117
|
+
tools: normalizeTools(input.tools),
|
|
118
|
+
cwd: Object.freeze({
|
|
119
|
+
path: absolutePath(cwd['path']),
|
|
120
|
+
workspaceId,
|
|
121
|
+
materializationRevision,
|
|
122
|
+
}),
|
|
123
|
+
permissionMode: permissionMode,
|
|
124
|
+
computerId: id(input.computerId, 'computerId'),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/execution/contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { AgentRevisionSelection, AuthMode, AuthSelection, CwdSelection, ExecutionContract, ModelSelection, ModelSetting, PermissionMode, ToolSelection, } from './contract.js';
|
|
2
|
+
export { AUTH_MODES, PERMISSION_MODES, InvalidExecutionContractError, normalizeExecutionContract, } from './contract.js';
|
|
3
|
+
export { canonicalExecutionJson, executionRevision } from './revision.js';
|
|
4
|
+
export type { ExecutionHandle, PreparedExecution } from './store.js';
|
|
5
|
+
export { ExecutionNotPreparedError, ExecutionRevisionMismatchError, PreparedExecutionStore, } from './store.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,sBAAsB,EACtB,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,cAAc,EACd,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC1E,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,EACL,yBAAyB,EACzB,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { AUTH_MODES, PERMISSION_MODES, InvalidExecutionContractError, normalizeExecutionContract, } from './contract.js';
|
|
2
|
+
export { canonicalExecutionJson, executionRevision } from './revision.js';
|
|
3
|
+
export { ExecutionNotPreparedError, ExecutionRevisionMismatchError, PreparedExecutionStore, } from './store.js';
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE1E,OAAO,EACL,yBAAyB,EACzB,8BAA8B,EAC9B,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Sha256HexPort } from '../ports.js';
|
|
2
|
+
import type { ExecutionContract } from './contract.js';
|
|
3
|
+
export declare function canonicalExecutionJson(contract: ExecutionContract): string;
|
|
4
|
+
export declare function executionRevision(contract: ExecutionContract, sha256Hex: Sha256HexPort): string;
|
|
5
|
+
//# sourceMappingURL=revision.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision.d.ts","sourceRoot":"","sources":["../../src/execution/revision.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAavD,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAE1E;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,aAAa,GAAG,MAAM,CAE/F"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function canonicalValue(value) {
|
|
2
|
+
if (Array.isArray(value))
|
|
3
|
+
return value.map(canonicalValue);
|
|
4
|
+
if (value === null || typeof value !== 'object')
|
|
5
|
+
return value;
|
|
6
|
+
const input = value;
|
|
7
|
+
return Object.fromEntries(Object.keys(input)
|
|
8
|
+
.sort()
|
|
9
|
+
.map((key) => [key, canonicalValue(input[key])]));
|
|
10
|
+
}
|
|
11
|
+
export function canonicalExecutionJson(contract) {
|
|
12
|
+
return JSON.stringify(canonicalValue(contract));
|
|
13
|
+
}
|
|
14
|
+
export function executionRevision(contract, sha256Hex) {
|
|
15
|
+
return sha256Hex(canonicalExecutionJson(contract));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=revision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision.js","sourceRoot":"","sources":["../../src/execution/revision.ts"],"names":[],"mappings":"AAGA,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC3D,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,KAAK,GAAG,KAAgC,CAAC;IAC/C,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SACf,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACnD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAA2B;IAChE,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAA2B,EAAE,SAAwB;IACrF,OAAO,SAAS,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ExecutionContract } from './contract.js';
|
|
2
|
+
export interface ExecutionHandle {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly revision: string;
|
|
5
|
+
}
|
|
6
|
+
export interface PreparedExecution<Binding> extends ExecutionHandle {
|
|
7
|
+
readonly contract: ExecutionContract;
|
|
8
|
+
/** Host-only, already-resolved adapter state. Never serialize this field. */
|
|
9
|
+
readonly binding: Binding;
|
|
10
|
+
}
|
|
11
|
+
export declare class ExecutionNotPreparedError extends Error {
|
|
12
|
+
readonly code = "EXECUTION_NOT_PREPARED";
|
|
13
|
+
constructor(id: string);
|
|
14
|
+
}
|
|
15
|
+
export declare class ExecutionRevisionMismatchError extends Error {
|
|
16
|
+
readonly code = "EXECUTION_REVISION_MISMATCH";
|
|
17
|
+
constructor(id: string);
|
|
18
|
+
}
|
|
19
|
+
export declare class PreparedExecutionStore<Binding> {
|
|
20
|
+
#private;
|
|
21
|
+
publish(record: PreparedExecution<Binding>): ExecutionHandle;
|
|
22
|
+
resolve(handle: ExecutionHandle): PreparedExecution<Binding>;
|
|
23
|
+
current(id: string): ExecutionHandle | null;
|
|
24
|
+
delete(id: string): boolean;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/execution/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB,CAAC,OAAO,CAAE,SAAQ,eAAe;IACjE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,4BAA4B;gBAE7B,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,8BAA+B,SAAQ,KAAK;IACvD,QAAQ,CAAC,IAAI,iCAAiC;gBAElC,EAAE,EAAE,MAAM;CAIvB;AAED,qBAAa,sBAAsB,CAAC,OAAO;;IAGzC,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG,eAAe;IAM5D,OAAO,CAAC,MAAM,EAAE,eAAe,GAAG,iBAAiB,CAAC,OAAO,CAAC;IAO5D,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAK3C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;CAG5B"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export class ExecutionNotPreparedError extends Error {
|
|
2
|
+
code = 'EXECUTION_NOT_PREPARED';
|
|
3
|
+
constructor(id) {
|
|
4
|
+
super(`Execution is not prepared: ${id}`);
|
|
5
|
+
this.name = 'ExecutionNotPreparedError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class ExecutionRevisionMismatchError extends Error {
|
|
9
|
+
code = 'EXECUTION_REVISION_MISMATCH';
|
|
10
|
+
constructor(id) {
|
|
11
|
+
super(`Prepared execution revision changed: ${id}`);
|
|
12
|
+
this.name = 'ExecutionRevisionMismatchError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class PreparedExecutionStore {
|
|
16
|
+
#records = new Map();
|
|
17
|
+
publish(record) {
|
|
18
|
+
const immutable = Object.freeze({ ...record });
|
|
19
|
+
this.#records.set(record.id, immutable);
|
|
20
|
+
return Object.freeze({ id: immutable.id, revision: immutable.revision });
|
|
21
|
+
}
|
|
22
|
+
resolve(handle) {
|
|
23
|
+
const record = this.#records.get(handle.id);
|
|
24
|
+
if (!record)
|
|
25
|
+
throw new ExecutionNotPreparedError(handle.id);
|
|
26
|
+
if (record.revision !== handle.revision)
|
|
27
|
+
throw new ExecutionRevisionMismatchError(handle.id);
|
|
28
|
+
return record;
|
|
29
|
+
}
|
|
30
|
+
current(id) {
|
|
31
|
+
const record = this.#records.get(id);
|
|
32
|
+
return record ? Object.freeze({ id: record.id, revision: record.revision }) : null;
|
|
33
|
+
}
|
|
34
|
+
delete(id) {
|
|
35
|
+
return this.#records.delete(id);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/execution/store.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IACzC,IAAI,GAAG,wBAAwB,CAAC;IAEzC,YAAY,EAAU;QACpB,KAAK,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IAC9C,IAAI,GAAG,6BAA6B,CAAC;IAE9C,YAAY,EAAU;QACpB,KAAK,CAAC,wCAAwC,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;IAC/C,CAAC;CACF;AAED,MAAM,OAAO,sBAAsB;IACxB,QAAQ,GAAG,IAAI,GAAG,EAAsC,CAAC;IAElE,OAAO,CAAC,MAAkC;QACxC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,CAAC,MAAuB;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,yBAAyB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;YAAE,MAAM,IAAI,8BAA8B,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7F,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrF,CAAC;IAED,MAAM,CAAC,EAAU;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,29 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @amalgm/chat — the conversation pipeline's laws.
|
|
3
|
-
*
|
|
4
|
-
* One module per job (PURPOSE.md "The seven jobs"):
|
|
5
|
-
* events/ the canonical event grammar (constructors + zod schema)
|
|
6
|
-
* wire/ the SSE frame projection (ACP-shaped AgentStreamEvent)
|
|
7
|
-
* transcript/ message reducer, parts, tool shape/display — transcript truth
|
|
8
|
-
* turns/ TurnStore, status machine, replay grammar
|
|
9
|
-
* contract/ frozen session contract: harnesses, model identities,
|
|
10
|
-
* freeze algebra, chatInput, payload merge, input
|
|
11
|
-
* warm/ warm-payload laws: revision, fingerprint, cache policies
|
|
12
|
-
* usage/ token algebra, turn finalization, ownership fork, catalog
|
|
13
|
-
* api/ thin fetch adapters over SDK services
|
|
14
|
-
* normalizers/ native harness events → the grammar (wave B)
|
|
15
|
-
*
|
|
16
|
-
* Hosts inject effects through the port types in `ports.ts` (axiom 7).
|
|
17
|
-
* Prefer the subpath exports (`@amalgm/chat/<module>`) — name collisions
|
|
18
|
-
* between modules are resolved there, not flattened here.
|
|
19
|
-
*/
|
|
1
|
+
/** @amalgm/chat — one durable conversation capability over official ACP output. */
|
|
20
2
|
export * as events from './events/index.js';
|
|
21
|
-
export * as wire from './wire/index.js';
|
|
22
3
|
export * as transcript from './transcript/index.js';
|
|
23
|
-
export * as turns from './turns/index.js';
|
|
24
|
-
export * as contract from './contract/index.js';
|
|
25
|
-
export * as warm from './warm/index.js';
|
|
26
4
|
export * as usage from './usage/index.js';
|
|
27
5
|
export * as api from './api/index.js';
|
|
6
|
+
export * as acp from './acp/index.js';
|
|
7
|
+
export * as input from './input/index.js';
|
|
8
|
+
export * as execution from './execution/index.js';
|
|
9
|
+
export * as sessions from './sessions/index.js';
|
|
10
|
+
export * as conversations from './conversations/index.js';
|
|
11
|
+
export { Chat, ChatTurnStream, ChatSession, InterruptUnsupportedError, SessionAgentMismatchError, SessionAlreadyExistsError, SessionBusyError, SessionNotFoundError, SubscriberBackpressureError, TurnStreamError, } from './sessions/index.js';
|
|
12
|
+
export type { ChatRuntimePort, InterruptResult, RuntimeInterruptRequest, } from './sessions/index.js';
|
|
28
13
|
export type { ClockMsPort, ClockIsoPort, Sha256HexPort, RandomUuidPort } from './ports.js';
|
|
29
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAEnF,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EACL,IAAI,EACJ,cAAc,EACd,WAAW,EACX,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,eAAe,EACf,eAAe,EACf,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,28 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @amalgm/chat — the conversation pipeline's laws.
|
|
3
|
-
*
|
|
4
|
-
* One module per job (PURPOSE.md "The seven jobs"):
|
|
5
|
-
* events/ the canonical event grammar (constructors + zod schema)
|
|
6
|
-
* wire/ the SSE frame projection (ACP-shaped AgentStreamEvent)
|
|
7
|
-
* transcript/ message reducer, parts, tool shape/display — transcript truth
|
|
8
|
-
* turns/ TurnStore, status machine, replay grammar
|
|
9
|
-
* contract/ frozen session contract: harnesses, model identities,
|
|
10
|
-
* freeze algebra, chatInput, payload merge, input
|
|
11
|
-
* warm/ warm-payload laws: revision, fingerprint, cache policies
|
|
12
|
-
* usage/ token algebra, turn finalization, ownership fork, catalog
|
|
13
|
-
* api/ thin fetch adapters over SDK services
|
|
14
|
-
* normalizers/ native harness events → the grammar (wave B)
|
|
15
|
-
*
|
|
16
|
-
* Hosts inject effects through the port types in `ports.ts` (axiom 7).
|
|
17
|
-
* Prefer the subpath exports (`@amalgm/chat/<module>`) — name collisions
|
|
18
|
-
* between modules are resolved there, not flattened here.
|
|
19
|
-
*/
|
|
1
|
+
/** @amalgm/chat — one durable conversation capability over official ACP output. */
|
|
20
2
|
export * as events from './events/index.js';
|
|
21
|
-
export * as wire from './wire/index.js';
|
|
22
3
|
export * as transcript from './transcript/index.js';
|
|
23
|
-
export * as turns from './turns/index.js';
|
|
24
|
-
export * as contract from './contract/index.js';
|
|
25
|
-
export * as warm from './warm/index.js';
|
|
26
4
|
export * as usage from './usage/index.js';
|
|
27
5
|
export * as api from './api/index.js';
|
|
6
|
+
export * as acp from './acp/index.js';
|
|
7
|
+
export * as input from './input/index.js';
|
|
8
|
+
export * as execution from './execution/index.js';
|
|
9
|
+
export * as sessions from './sessions/index.js';
|
|
10
|
+
export * as conversations from './conversations/index.js';
|
|
11
|
+
export { Chat, ChatTurnStream, ChatSession, InterruptUnsupportedError, SessionAgentMismatchError, SessionAlreadyExistsError, SessionBusyError, SessionNotFoundError, SubscriberBackpressureError, TurnStreamError, } from './sessions/index.js';
|
|
28
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mFAAmF;AAEnF,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,UAAU,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,aAAa,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EACL,IAAI,EACJ,cAAc,EACd,WAAW,EACX,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,oBAAoB,EACpB,2BAA2B,EAC3B,eAAe,GAChB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/input/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/input/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ContentBlock } from '@agentclientprotocol/sdk';
|
|
2
|
+
export type PromptPart = ContentBlock;
|
|
3
|
+
export type Attachment = Exclude<ContentBlock, {
|
|
4
|
+
type: 'text';
|
|
5
|
+
}>;
|
|
6
|
+
export interface PromptInput {
|
|
7
|
+
readonly parts: readonly PromptPart[];
|
|
8
|
+
}
|
|
9
|
+
export declare class InvalidPromptError extends Error {
|
|
10
|
+
readonly code = "INVALID_PROMPT";
|
|
11
|
+
constructor(message: string);
|
|
12
|
+
}
|
|
13
|
+
/** Validate and detach a prompt from caller-owned mutable objects. */
|
|
14
|
+
export declare function normalizePrompt(input: PromptInput): PromptInput;
|
|
15
|
+
/** Convenience only; the canonical prompt remains an ordered ACP part list. */
|
|
16
|
+
export declare function promptFromText(text: string, attachments?: readonly Attachment[]): PromptInput;
|
|
17
|
+
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/input/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,MAAM,UAAU,GAAG,YAAY,CAAC;AACtC,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;CACvC;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,oBAAoB;gBAErB,OAAO,EAAE,MAAM;CAI5B;AAuFD,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAO/D;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,GAAE,SAAS,UAAU,EAAO,GAAG,WAAW,CAMjG"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export class InvalidPromptError extends Error {
|
|
2
|
+
code = 'INVALID_PROMPT';
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'InvalidPromptError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
function isRecord(value) {
|
|
9
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
10
|
+
}
|
|
11
|
+
function requireString(record, key, label) {
|
|
12
|
+
const value = record[key];
|
|
13
|
+
if (typeof value !== 'string') {
|
|
14
|
+
throw new InvalidPromptError(`${label}.${key} must be a string`);
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
function requireNonEmptyString(record, key, label) {
|
|
19
|
+
const value = requireString(record, key, label);
|
|
20
|
+
if (!value.trim()) {
|
|
21
|
+
throw new InvalidPromptError(`${label}.${key} must not be empty`);
|
|
22
|
+
}
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
function clone(value) {
|
|
26
|
+
if (Array.isArray(value))
|
|
27
|
+
return value.map((item) => clone(item));
|
|
28
|
+
if (!isRecord(value))
|
|
29
|
+
return value;
|
|
30
|
+
return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, clone(item)]));
|
|
31
|
+
}
|
|
32
|
+
function deepFreeze(value) {
|
|
33
|
+
if (Array.isArray(value)) {
|
|
34
|
+
for (const item of value)
|
|
35
|
+
deepFreeze(item);
|
|
36
|
+
return Object.freeze(value);
|
|
37
|
+
}
|
|
38
|
+
if (isRecord(value)) {
|
|
39
|
+
for (const item of Object.values(value))
|
|
40
|
+
deepFreeze(item);
|
|
41
|
+
return Object.freeze(value);
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
function validatePart(part, index) {
|
|
46
|
+
const label = `prompt.parts[${index}]`;
|
|
47
|
+
if (!isRecord(part))
|
|
48
|
+
throw new InvalidPromptError(`${label} must be an ACP content block`);
|
|
49
|
+
const type = requireNonEmptyString(part, 'type', label);
|
|
50
|
+
if (type === 'text') {
|
|
51
|
+
requireString(part, 'text', label);
|
|
52
|
+
return clone(part);
|
|
53
|
+
}
|
|
54
|
+
if (type === 'image' || type === 'audio') {
|
|
55
|
+
requireNonEmptyString(part, 'data', label);
|
|
56
|
+
requireNonEmptyString(part, 'mimeType', label);
|
|
57
|
+
return clone(part);
|
|
58
|
+
}
|
|
59
|
+
if (type === 'resource_link') {
|
|
60
|
+
requireNonEmptyString(part, 'name', label);
|
|
61
|
+
requireNonEmptyString(part, 'uri', label);
|
|
62
|
+
if (part['size'] !== undefined && part['size'] !== null) {
|
|
63
|
+
const size = part['size'];
|
|
64
|
+
if (typeof size !== 'number' || !Number.isFinite(size) || size < 0) {
|
|
65
|
+
throw new InvalidPromptError(`${label}.size must be a non-negative number`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return clone(part);
|
|
69
|
+
}
|
|
70
|
+
if (type === 'resource') {
|
|
71
|
+
const resource = part['resource'];
|
|
72
|
+
if (!isRecord(resource)) {
|
|
73
|
+
throw new InvalidPromptError(`${label}.resource must be an ACP embedded resource`);
|
|
74
|
+
}
|
|
75
|
+
requireNonEmptyString(resource, 'uri', `${label}.resource`);
|
|
76
|
+
const hasText = typeof resource['text'] === 'string';
|
|
77
|
+
const hasBlob = typeof resource['blob'] === 'string' && resource['blob'].length > 0;
|
|
78
|
+
if (hasText === hasBlob) {
|
|
79
|
+
throw new InvalidPromptError(`${label}.resource must contain exactly one of text or blob`);
|
|
80
|
+
}
|
|
81
|
+
return clone(part);
|
|
82
|
+
}
|
|
83
|
+
throw new InvalidPromptError(`${label}.type is not a supported ACP content type: ${type}`);
|
|
84
|
+
}
|
|
85
|
+
/** Validate and detach a prompt from caller-owned mutable objects. */
|
|
86
|
+
export function normalizePrompt(input) {
|
|
87
|
+
if (!isRecord(input) || !Array.isArray(input.parts) || input.parts.length === 0) {
|
|
88
|
+
throw new InvalidPromptError('prompt.parts must contain at least one ACP content block');
|
|
89
|
+
}
|
|
90
|
+
return Object.freeze({
|
|
91
|
+
parts: Object.freeze(input.parts.map((part, index) => deepFreeze(validatePart(part, index)))),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/** Convenience only; the canonical prompt remains an ordered ACP part list. */
|
|
95
|
+
export function promptFromText(text, attachments = []) {
|
|
96
|
+
if (typeof text !== 'string')
|
|
97
|
+
throw new InvalidPromptError('text must be a string');
|
|
98
|
+
const parts = [];
|
|
99
|
+
if (text.length > 0)
|
|
100
|
+
parts.push({ type: 'text', text });
|
|
101
|
+
parts.push(...attachments);
|
|
102
|
+
return normalizePrompt({ parts });
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/input/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Claude Code
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* The engine module calls the event constructors from `../events` directly;
|
|
6
|
-
* here the host builds an {@link EventConstructors} instance (axiom 7) and
|
|
2
|
+
* Claude Code Agent SDK normalizer. The host builds an
|
|
3
|
+
* {@link EventConstructors} instance and
|
|
7
4
|
* `createClaudeNormalizer(events)` closes the stateful entry points over it.
|
|
8
5
|
* The usage helpers (`usageFromClaude`, `usageFromClaudeModelUsage`,
|
|
9
6
|
* `usageRecordsFromClaudeResult`) and the pure string helpers
|
|
@@ -11,8 +8,8 @@
|
|
|
11
8
|
* are also exported at module level.
|
|
12
9
|
*
|
|
13
10
|
* Note: `result` message handling (usage records emission, cost, error, done)
|
|
14
|
-
* lives in the
|
|
15
|
-
*
|
|
11
|
+
* lives in the Claude adapter; this module provides
|
|
12
|
+
* `usageRecordsFromClaudeResult` for that boundary.
|
|
16
13
|
*/
|
|
17
14
|
import type { EventConstructors } from '../events/index.js';
|
|
18
15
|
import { type NormalizedUsage } from '../usage/index.js';
|
|
@@ -55,7 +52,7 @@ export declare function stringifyClaudeContent(content: unknown): string;
|
|
|
55
52
|
/**
|
|
56
53
|
* Build the engine's Claude normalizer export set over an injected
|
|
57
54
|
* {@link EventConstructors} instance. Function-for-function parity with
|
|
58
|
-
*
|
|
55
|
+
* canonical Claude normalizer surface.
|
|
59
56
|
*/
|
|
60
57
|
export declare function createClaudeNormalizer(events: EventConstructors): {
|
|
61
58
|
normalizeClaudeContentBlock: (block: AnyRecord | null | undefined, providerSessionId?: unknown, state?: ClaudeNormalizerState | null, raw?: AnyRecord | undefined) => ({
|
|
@@ -622,7 +619,7 @@ export declare function createClaudeNormalizer(events: EventConstructors): {
|
|
|
622
619
|
usageFromClaude: typeof usageFromClaude;
|
|
623
620
|
usageFromClaudeModelUsage: typeof usageFromClaudeModelUsage;
|
|
624
621
|
};
|
|
625
|
-
/** The
|
|
622
|
+
/** The Claude normalizer set, closed over injected constructors. */
|
|
626
623
|
export type ClaudeNormalizer = ReturnType<typeof createClaudeNormalizer>;
|
|
627
624
|
export {};
|
|
628
625
|
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/normalizers/claude.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../src/normalizers/claude.ts"],"names":[],"mappings":"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"}
|