@automatalabs/pi-acp 0.1.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 (54) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +57 -0
  3. package/dist/agent.d.ts +87 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +398 -0
  6. package/dist/auth.d.ts +4 -0
  7. package/dist/auth.d.ts.map +1 -0
  8. package/dist/auth.js +40 -0
  9. package/dist/config.d.ts +7 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +46 -0
  12. package/dist/deps.d.ts +22 -0
  13. package/dist/deps.d.ts.map +1 -0
  14. package/dist/deps.js +39 -0
  15. package/dist/errors.d.ts +34 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +104 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +54 -0
  21. package/dist/lib.d.ts +4 -0
  22. package/dist/lib.d.ts.map +1 -0
  23. package/dist/lib.js +2 -0
  24. package/dist/mcp-bridge.d.ts +58 -0
  25. package/dist/mcp-bridge.d.ts.map +1 -0
  26. package/dist/mcp-bridge.js +240 -0
  27. package/dist/permissions.d.ts +11 -0
  28. package/dist/permissions.d.ts.map +1 -0
  29. package/dist/permissions.js +77 -0
  30. package/dist/prompt-content.d.ts +12 -0
  31. package/dist/prompt-content.d.ts.map +1 -0
  32. package/dist/prompt-content.js +35 -0
  33. package/dist/replay.d.ts +4 -0
  34. package/dist/replay.d.ts.map +1 -0
  35. package/dist/replay.js +101 -0
  36. package/dist/server.d.ts +13 -0
  37. package/dist/server.d.ts.map +1 -0
  38. package/dist/server.js +23 -0
  39. package/dist/session.d.ts +58 -0
  40. package/dist/session.d.ts.map +1 -0
  41. package/dist/session.js +414 -0
  42. package/dist/stop-reason.d.ts +4 -0
  43. package/dist/stop-reason.d.ts.map +1 -0
  44. package/dist/stop-reason.js +18 -0
  45. package/dist/structured-output.d.ts +14 -0
  46. package/dist/structured-output.d.ts.map +1 -0
  47. package/dist/structured-output.js +71 -0
  48. package/dist/translate.d.ts +20 -0
  49. package/dist/translate.d.ts.map +1 -0
  50. package/dist/translate.js +110 -0
  51. package/dist/usage.d.ts +35 -0
  52. package/dist/usage.d.ts.map +1 -0
  53. package/dist/usage.js +36 -0
  54. package/package.json +47 -0
@@ -0,0 +1,71 @@
1
+ import { Type } from "typebox";
2
+ import { adapterError } from "./errors.js";
3
+ export const STRUCTURED_TOOL_NAME = "__acp_structured_output";
4
+ export class StructuredOutputState {
5
+ tool;
6
+ schemaHolder = Type.Any();
7
+ captured;
8
+ baseActive = [];
9
+ constructor() {
10
+ const tool = {
11
+ name: STRUCTURED_TOOL_NAME,
12
+ label: "Structured output",
13
+ description: "Return the final response as structured data matching the requested schema.",
14
+ parameters: this.schemaHolder,
15
+ execute: async (_toolCallId, params) => {
16
+ this.captured = params;
17
+ return {
18
+ content: [{ type: "text", text: "(structured output captured)" }],
19
+ details: params,
20
+ terminate: true,
21
+ };
22
+ },
23
+ };
24
+ this.tool = tool;
25
+ }
26
+ install(session) {
27
+ if (!session.getToolDefinition(STRUCTURED_TOOL_NAME)) {
28
+ throw adapterError("structured_tool_collision");
29
+ }
30
+ this.baseActive = session.getActiveToolNames().filter((name) => name !== STRUCTURED_TOOL_NAME);
31
+ session.setActiveToolsByName(this.baseActive);
32
+ }
33
+ arm(session, schema) {
34
+ if (typeof schema !== "object" || schema === null || Array.isArray(schema)) {
35
+ throw adapterError("invalid_output_schema");
36
+ }
37
+ this.captured = undefined;
38
+ const holder = this.schemaHolder;
39
+ for (const key of Object.keys(holder))
40
+ delete holder[key];
41
+ Object.assign(holder, schema);
42
+ try {
43
+ session.setActiveToolsByName([...this.baseActive, STRUCTURED_TOOL_NAME]);
44
+ }
45
+ catch (error) {
46
+ this.captured = undefined;
47
+ try {
48
+ session.setActiveToolsByName(this.baseActive);
49
+ }
50
+ catch (rollbackError) {
51
+ console.error("pi-acp structured-output arm rollback error:", rollbackError);
52
+ }
53
+ throw error;
54
+ }
55
+ return "Finish by calling __acp_structured_output with a value conforming to the requested output schema.";
56
+ }
57
+ disarm(session) {
58
+ session.setActiveToolsByName(this.baseActive);
59
+ this.captured = undefined;
60
+ }
61
+ takeJson() {
62
+ if (this.captured === undefined)
63
+ return undefined;
64
+ try {
65
+ return JSON.stringify(this.captured);
66
+ }
67
+ catch {
68
+ return undefined;
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,20 @@
1
+ import type { ContentBlock, SessionUpdate, ToolCallContent, ToolCallLocation, ToolKind } from "@agentclientprotocol/sdk";
2
+ import type { AgentSessionEvent } from "@earendil-works/pi-coding-agent";
3
+ interface PiResult {
4
+ content?: Array<{
5
+ type: "text";
6
+ text: string;
7
+ } | {
8
+ type: "image";
9
+ data: string;
10
+ mimeType: string;
11
+ }>;
12
+ details?: unknown;
13
+ }
14
+ export declare function mapKind(toolName: string): ToolKind;
15
+ export declare function fileLocations(args: unknown): ToolCallLocation[] | undefined;
16
+ export declare function contentItems(result: PiResult): ContentBlock[];
17
+ export declare function toContent(result: PiResult): ToolCallContent[];
18
+ export declare function translateEvent(event: AgentSessionEvent, failedResult?: PiResult): SessionUpdate[];
19
+ export {};
20
+ //# sourceMappingURL=translate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translate.d.ts","sourceRoot":"","sources":["../src/translate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACT,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,UAAU,QAAQ;IAChB,OAAO,CAAC,EAAE,KAAK,CACX;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAC9B;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CACpD,CAAC;IACF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAgBlD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,EAAE,GAAG,SAAS,CAI3E;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,YAAY,EAAE,CAM7D;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,QAAQ,GAAG,eAAe,EAAE,CAE7D;AA4BD,wBAAgB,cAAc,CAAC,KAAK,EAAE,iBAAiB,EAAE,YAAY,CAAC,EAAE,QAAQ,GAAG,aAAa,EAAE,CAsDjG"}
@@ -0,0 +1,110 @@
1
+ export function mapKind(toolName) {
2
+ switch (toolName) {
3
+ case "read":
4
+ case "ls":
5
+ return "read";
6
+ case "edit":
7
+ case "write":
8
+ return "edit";
9
+ case "bash":
10
+ return "execute";
11
+ case "grep":
12
+ case "find":
13
+ return "search";
14
+ default:
15
+ return "other";
16
+ }
17
+ }
18
+ export function fileLocations(args) {
19
+ if (typeof args !== "object" || args === null)
20
+ return undefined;
21
+ const path = args.path;
22
+ return typeof path === "string" ? [{ path }] : undefined;
23
+ }
24
+ export function contentItems(result) {
25
+ return (result.content ?? []).map((item) => item.type === "text"
26
+ ? { type: "text", text: item.text }
27
+ : { type: "image", data: item.data, mimeType: item.mimeType });
28
+ }
29
+ export function toContent(result) {
30
+ return contentItems(result).map((content) => ({ type: "content", content }));
31
+ }
32
+ function translateAssistantEvent(event) {
33
+ switch (event.type) {
34
+ case "text_delta":
35
+ return [{ sessionUpdate: "agent_message_chunk", content: { type: "text", text: event.delta } }];
36
+ case "thinking_delta":
37
+ return [{ sessionUpdate: "agent_thought_chunk", content: { type: "text", text: event.delta } }];
38
+ case "start":
39
+ case "text_start":
40
+ case "text_end":
41
+ case "thinking_start":
42
+ case "thinking_end":
43
+ case "toolcall_start":
44
+ case "toolcall_delta":
45
+ case "toolcall_end":
46
+ case "done":
47
+ case "error":
48
+ return [];
49
+ default: {
50
+ const exhaustive = event;
51
+ return exhaustive;
52
+ }
53
+ }
54
+ }
55
+ export function translateEvent(event, failedResult) {
56
+ switch (event.type) {
57
+ case "message_update":
58
+ return translateAssistantEvent(event.assistantMessageEvent);
59
+ case "tool_execution_start":
60
+ return [{
61
+ sessionUpdate: "tool_call",
62
+ toolCallId: event.toolCallId,
63
+ title: event.toolName,
64
+ kind: mapKind(event.toolName),
65
+ status: "pending",
66
+ rawInput: event.args,
67
+ locations: fileLocations(event.args),
68
+ _meta: { toolName: event.toolName },
69
+ }];
70
+ case "tool_execution_update":
71
+ return [{
72
+ sessionUpdate: "tool_call_update",
73
+ toolCallId: event.toolCallId,
74
+ status: "in_progress",
75
+ content: toContent(event.partialResult),
76
+ }];
77
+ case "tool_execution_end": {
78
+ const result = failedResult ?? event.result;
79
+ const update = {
80
+ sessionUpdate: "tool_call_update",
81
+ toolCallId: event.toolCallId,
82
+ status: event.isError ? "failed" : "completed",
83
+ content: toContent(result),
84
+ };
85
+ if (result.details !== undefined)
86
+ update.rawOutput = result.details;
87
+ return [update];
88
+ }
89
+ case "agent_start":
90
+ case "agent_end":
91
+ case "turn_start":
92
+ case "turn_end":
93
+ case "message_start":
94
+ case "message_end":
95
+ case "agent_settled":
96
+ case "queue_update":
97
+ case "compaction_start":
98
+ case "compaction_end":
99
+ case "entry_appended":
100
+ case "session_info_changed":
101
+ case "thinking_level_changed":
102
+ case "auto_retry_start":
103
+ case "auto_retry_end":
104
+ return [];
105
+ default: {
106
+ const exhaustive = event;
107
+ return exhaustive;
108
+ }
109
+ }
110
+ }
@@ -0,0 +1,35 @@
1
+ import type { PromptResponse, SessionUpdate, Usage } from "@agentclientprotocol/sdk";
2
+ import type { AgentSession } from "@earendil-works/pi-coding-agent";
3
+ interface PiUsage {
4
+ input: number;
5
+ output: number;
6
+ cacheRead: number;
7
+ cacheWrite: number;
8
+ totalTokens: number;
9
+ reasoning?: number;
10
+ }
11
+ export interface AssistantLike {
12
+ role: "assistant";
13
+ usage: PiUsage;
14
+ stopReason: string;
15
+ errorMessage?: string;
16
+ diagnostics?: Array<{
17
+ type: string;
18
+ timestamp: number;
19
+ error?: {
20
+ name?: string;
21
+ message: string;
22
+ stack?: string;
23
+ code?: string | number;
24
+ };
25
+ details?: unknown;
26
+ }>;
27
+ }
28
+ export declare function agentMessages(session: AgentSession): unknown[];
29
+ export declare function assistantMessages(messages: readonly unknown[]): AssistantLike[];
30
+ export declare function terminalAssistant(messages: readonly unknown[]): AssistantLike | undefined;
31
+ export declare function promptUsage(messages: readonly unknown[]): Usage;
32
+ export declare function usageUpdate(session: AgentSession): SessionUpdate;
33
+ export declare function response(stopReason: PromptResponse["stopReason"], messages: readonly unknown[]): PromptResponse;
34
+ export {};
35
+ //# sourceMappingURL=usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,UAAU,OAAO;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,CAAC;QACnF,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;CACJ;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,EAAE,CAE9D;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,aAAa,EAAE,CAK/E;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,aAAa,GAAG,SAAS,CAEzF;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,KAAK,CAe/D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,aAAa,CAQhE;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,cAAc,CAE/G"}
package/dist/usage.js ADDED
@@ -0,0 +1,36 @@
1
+ export function agentMessages(session) {
2
+ return session.agent.state.messages;
3
+ }
4
+ export function assistantMessages(messages) {
5
+ return messages.filter((message) => typeof message === "object" && message !== null && message.role === "assistant");
6
+ }
7
+ export function terminalAssistant(messages) {
8
+ return assistantMessages(messages).at(-1);
9
+ }
10
+ export function promptUsage(messages) {
11
+ const assistants = assistantMessages(messages);
12
+ const sum = (key) => assistants.reduce((total, message) => total + (message.usage[key] ?? 0), 0);
13
+ const usage = {
14
+ inputTokens: sum("input"),
15
+ outputTokens: sum("output"),
16
+ cachedReadTokens: sum("cacheRead"),
17
+ cachedWriteTokens: sum("cacheWrite"),
18
+ totalTokens: sum("totalTokens"),
19
+ };
20
+ if (assistants.some((message) => message.usage.reasoning !== undefined)) {
21
+ usage.thoughtTokens = sum("reasoning");
22
+ }
23
+ return usage;
24
+ }
25
+ export function usageUpdate(session) {
26
+ const context = session.getContextUsage();
27
+ return {
28
+ sessionUpdate: "usage_update",
29
+ used: context?.tokens ?? 0,
30
+ size: context?.contextWindow ?? session.model?.contextWindow ?? 0,
31
+ cost: { amount: session.getSessionStats().cost, currency: "USD" },
32
+ };
33
+ }
34
+ export function response(stopReason, messages) {
35
+ return { stopReason, usage: promptUsage(messages) };
36
+ }
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@automatalabs/pi-acp",
3
+ "version": "0.1.0",
4
+ "license": "Apache-2.0",
5
+ "engines": {
6
+ "node": ">=22.19.0"
7
+ },
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/VikashLoomba/agentprism-workflows.git",
11
+ "directory": "packages/pi-acp"
12
+ },
13
+ "type": "module",
14
+ "bin": {
15
+ "pi-acp": "./dist/index.js"
16
+ },
17
+ "main": "./dist/lib.js",
18
+ "types": "./dist/lib.d.ts",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/lib.d.ts",
22
+ "import": "./dist/lib.js",
23
+ "default": "./dist/lib.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "dependencies": {
33
+ "@agentclientprotocol/sdk": "1.2.1",
34
+ "@earendil-works/pi-coding-agent": "0.80.8",
35
+ "@modelcontextprotocol/sdk": "1.29.0",
36
+ "typebox": "1.3.2"
37
+ },
38
+ "devDependencies": {
39
+ "@earendil-works/pi-agent-core": "0.80.8",
40
+ "@earendil-works/pi-ai": "0.80.8"
41
+ },
42
+ "scripts": {
43
+ "build": "tsc -b",
44
+ "typecheck": "tsc --noEmit",
45
+ "test": "tsc -p tsconfig.type-tests.json && tsx --test \"test/**/*.test.ts\""
46
+ }
47
+ }