@averyyy/pi-agent-core 1.1.0-piclient.2 → 1.2.0-piclient.1
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.
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Context, MutableReplicatedState, ReplicatedState } from "@earendil-works/chord";
|
|
2
2
|
import type { ConversationHandle, Harness } from "./harness.ts";
|
|
3
3
|
import type { ConversationSpec, ConversationView, Entry, EntryScan, Id, JsonObject, NewEntry, SendInput, ViewEvent } from "./types.ts";
|
|
4
4
|
export type PublishedConversationView = ConversationView & {
|
|
@@ -18,9 +18,16 @@ export interface PicoConversationService {
|
|
|
18
18
|
fork(at: Id | "start", spec: Omit<ConversationSpec, "parent">, ctx: Context): Promise<Id>;
|
|
19
19
|
entries(scan: EntryScan, ctx: Context): Promise<Entry[]>;
|
|
20
20
|
}
|
|
21
|
+
/** Typed service identifier; Chord no longer provides `defineService()`. */
|
|
22
|
+
export interface PicoServiceId<T> {
|
|
23
|
+
readonly id: string;
|
|
24
|
+
readonly local: boolean;
|
|
25
|
+
/** Type-only marker for the service implementation. */
|
|
26
|
+
readonly __service?: T;
|
|
27
|
+
}
|
|
21
28
|
/** Local registration/control plane and remote keyed conversation contract used by Chord facets. */
|
|
22
|
-
export declare const PicoHarnessService:
|
|
23
|
-
export declare const PicoConversationService:
|
|
29
|
+
export declare const PicoHarnessService: PicoServiceId<Harness>;
|
|
30
|
+
export declare const PicoConversationService: PicoServiceId<PicoConversationService>;
|
|
24
31
|
export declare function createPicoConversationService<Cfg extends object>(harness: Pick<Harness, "abortInput" | "entries">, conversation: ConversationHandle<Cfg>, view: ReplicatedState<PublishedConversationView>): PicoConversationService;
|
|
25
32
|
export interface ChordViewBridge {
|
|
26
33
|
readonly view: MutableReplicatedState<PublishedConversationView>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chord.d.ts","sourceRoot":"","sources":["../../../src/harness/pico3/chord.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"chord.d.ts","sourceRoot":"","sources":["../../../src/harness/pico3/chord.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { defineService, } from "@earendil-works/chord";
|
|
2
1
|
import { WATCH_CAPACITY } from "./view.js";
|
|
3
2
|
/** Local registration/control plane and remote keyed conversation contract used by Chord facets. */
|
|
4
|
-
export const PicoHarnessService =
|
|
5
|
-
export const PicoConversationService =
|
|
3
|
+
export const PicoHarnessService = Object.freeze({ id: "pi.harness", local: true });
|
|
4
|
+
export const PicoConversationService = Object.freeze({
|
|
5
|
+
id: "pi.conversation",
|
|
6
|
+
local: false,
|
|
7
|
+
});
|
|
6
8
|
export function createPicoConversationService(harness, conversation, view) {
|
|
7
9
|
return {
|
|
8
10
|
view,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chord.js","sourceRoot":"","sources":["../../../src/harness/pico3/chord.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype Context,\n\ttype Draft,\n\tdefineService,\n\ttype MutableReplicatedState,\n\ttype ReplicatedState,\n} from \"@earendil-works/chord\";\nimport type { Op, Path, Seg } from \"@earendil-works/chord/delta\";\nimport type { ConversationHandle, Harness } from \"./harness.ts\";\nimport type {\n\tConversationSpec,\n\tConversationView,\n\tEntry,\n\tEntryScan,\n\tEnvelope,\n\tId,\n\tJsonObject,\n\tNewEntry,\n\tSendInput,\n\tViewEvent,\n} from \"./types.ts\";\nimport { WATCH_CAPACITY, type Watch } from \"./view.ts\";\n\nexport type PublishedConversationView = ConversationView & {\n\tcommit: { events: ViewEvent[] };\n};\n\nexport interface PicoConversationService {\n\treadonly view: ReplicatedState<PublishedConversationView>;\n\tsend(input: SendInput, ctx: Context): Promise<Id>;\n\twrite(entry: NewEntry, ctx: Context): Promise<Id>;\n\tinputAbort(id: Id, ctx: Context): Promise<\"aborted\" | \"already_placed\" | \"not_found\">;\n\tconfigSet(patch: JsonObject, ctx: Context): Promise<void>;\n\tabort(ctx: Context): Promise<void>;\n\treset(handoff: string | null, ctx: Context): Promise<void>;\n\tcollapse(instructions: string | null, ctx: Context): Promise<Id>;\n\tfork(at: Id | \"start\", spec: Omit<ConversationSpec, \"parent\">, ctx: Context): Promise<Id>;\n\tentries(scan: EntryScan, ctx: Context): Promise<Entry[]>;\n}\n\n/** Local registration/control plane and remote keyed conversation contract used by Chord facets. */\nexport const PicoHarnessService = defineService<Harness>(\"pi.harness\", { local: true });\nexport const PicoConversationService = defineService<PicoConversationService>(\"pi.conversation\");\n\nexport function createPicoConversationService<Cfg extends object>(\n\tharness: Pick<Harness, \"abortInput\" | \"entries\">,\n\tconversation: ConversationHandle<Cfg>,\n\tview: ReplicatedState<PublishedConversationView>,\n): PicoConversationService {\n\treturn {\n\t\tview,\n\t\tsend: (input, ctx) => conversation.send(input, ctx).then((handle) => handle.id),\n\t\twrite: (entry, ctx) => conversation.write(entry, ctx),\n\t\tinputAbort: (id, ctx) => harness.abortInput(id, ctx, conversation.id),\n\t\tconfigSet: (patch, ctx) => conversation.config.set(patch as never, ctx),\n\t\tabort: (ctx) => conversation.abort(ctx),\n\t\treset: (handoff, ctx) => conversation.reset(handoff ?? undefined, ctx),\n\t\tcollapse: (instructions, ctx) => conversation.collapse(instructions ?? undefined, ctx),\n\t\tfork: (at, spec, ctx) => conversation.fork(at, spec, ctx).then((child) => child.id),\n\t\tentries: (scan, ctx) => harness.entries({ ...scan, conversationId: conversation.id }, ctx),\n\t};\n}\n\nexport interface ChordViewBridge {\n\treadonly view: MutableReplicatedState<PublishedConversationView>;\n\treadonly closed: boolean;\n\tclose(): void;\n}\n\nexport interface ChordViewBridgeOptions {\n\tcapacity?: number;\n\t/** Called after the raw watch is closed. The owner should close and respawn its keyed service instance. */\n\tonFailure?: (error: Error) => void;\n}\n\n/**\n * Adapt Pico's commit-granular envelopes to one Chord publication per commit.\n * The raw listener only enqueues. Applying ops and publishing happen together,\n * off the Session line, with no await between them.\n */\nexport async function attachChordView(\n\tconversation: Pick<ConversationHandle, \"watch\">,\n\tcreateState: (initial: PublishedConversationView) => MutableReplicatedState<PublishedConversationView>,\n\tctx: Context,\n\topts: ChordViewBridgeOptions = {},\n): Promise<ChordViewBridge> {\n\tconst watch = await conversation.watch(ctx);\n\tconst view = createState({ ...structuredClone(watch.view), commit: { events: [] } });\n\treturn bridgeWatch(watch, view, ctx, opts);\n}\n\nfunction bridgeWatch(\n\twatch: Watch,\n\tview: MutableReplicatedState<PublishedConversationView>,\n\tctx: Context,\n\topts: ChordViewBridgeOptions,\n): ChordViewBridge {\n\tconst capacity = opts.capacity ?? WATCH_CAPACITY;\n\tif (!Number.isSafeInteger(capacity) || capacity < 1)\n\t\tthrow new RangeError(\"Chord view queue capacity must be positive\");\n\tconst queue: Envelope[] = [];\n\tlet scheduled = false;\n\tlet closed = false;\n\tconst fail = (cause: unknown) => {\n\t\tif (closed) return;\n\t\tclosed = true;\n\t\tqueue.length = 0;\n\t\twatch.stop();\n\t\ttry {\n\t\t\topts.onFailure?.(cause instanceof Error ? cause : new Error(String(cause)));\n\t\t} catch {}\n\t};\n\tconst drain = () => {\n\t\tscheduled = false;\n\t\twhile (!closed && queue.length > 0) {\n\t\t\tconst envelope = queue.shift()!;\n\t\t\ttry {\n\t\t\t\tview.change(ctx, (draft) => {\n\t\t\t\t\tapplyTracked(draft, envelope.ops);\n\t\t\t\t\tdraft.commit.events = envelope.events as Draft<ViewEvent[]>;\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tfail(error);\n\t\t\t}\n\t\t}\n\t};\n\twatch.start((envelope) => {\n\t\tif (closed) return;\n\t\tif (queue.length >= capacity) {\n\t\t\tfail(new Error(`Pico-to-Chord view queue exceeded ${capacity} envelopes`));\n\t\t\treturn;\n\t\t}\n\t\tqueue.push(envelope);\n\t\tif (scheduled) return;\n\t\tscheduled = true;\n\t\tqueueMicrotask(drain);\n\t});\n\treturn {\n\t\tview,\n\t\tget closed() {\n\t\t\treturn closed;\n\t\t},\n\t\tclose() {\n\t\t\tif (closed) return;\n\t\t\tclosed = true;\n\t\t\tqueue.length = 0;\n\t\t\twatch.stop();\n\t\t},\n\t};\n}\n\nfunction applyTracked(root: Draft<PublishedConversationView>, ops: readonly Op[]): void {\n\tfor (const op of ops) {\n\t\tif (op[0] === \"r\") throw new Error(\"live Pico envelope unexpectedly replaced the view root\");\n\t\tconst path = op[1];\n\t\tif (op[0] === \"p\") {\n\t\t\tconst target = resolve(root, path);\n\t\t\tif (!Array.isArray(target)) throw new Error(`Pico splice path is not an array: ${path.join(\".\")}`);\n\t\t\t(target as unknown[]).splice(op[2], op[3], ...op[4]);\n\t\t\tcontinue;\n\t\t}\n\t\tif (op[0] === \"m\") {\n\t\t\tconst target = resolve(root, path);\n\t\t\tif (!Array.isArray(target) || target.length !== op[2].length) {\n\t\t\t\tthrow new Error(`Pico permutation path is not a matching array: ${path.join(\".\")}`);\n\t\t\t}\n\t\t\tconst array = target as unknown[];\n\t\t\tconst previous = array.slice();\n\t\t\tconst rank = new Map<unknown, number>();\n\t\t\tfor (let index = 0; index < op[2].length; index++) {\n\t\t\t\tconst value = previous[op[2][index]!]!;\n\t\t\t\tif (!rank.has(value)) rank.set(value, index);\n\t\t\t}\n\t\t\tarray.sort((left, right) => rank.get(left)! - rank.get(right)!);\n\t\t\tcontinue;\n\t\t}\n\t\tconst parent = resolve(root, path.slice(0, -1));\n\t\tif (parent === null || typeof parent !== \"object\")\n\t\t\tthrow new Error(`Pico operation parent is not an object: ${path.join(\".\")}`);\n\t\tconst key = path[path.length - 1]!;\n\t\tif (op[0] === \"d\") {\n\t\t\tif (Array.isArray(parent)) parent.splice(key as number, 1);\n\t\t\telse delete (parent as Record<PropertyKey, unknown>)[key];\n\t\t\tcontinue;\n\t\t}\n\t\tconst record = parent as Record<PropertyKey, unknown>;\n\t\tif (op[0] === \"s\") record[key] = op[2];\n\t\telse if (op[0] === \"a\") record[key] = `${String(record[key])}${op[2]}`;\n\t\telse record[key] = String(record[key]).slice(op[2]);\n\t}\n}\n\nfunction resolve(root: unknown, path: Path): unknown {\n\tlet value = root;\n\tfor (const segment of path) {\n\t\tif (value === null || typeof value !== \"object\") return undefined;\n\t\tvalue = (value as Record<Seg, unknown>)[segment];\n\t}\n\treturn value;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chord.js","sourceRoot":"","sources":["../../../src/harness/pico3/chord.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Context, Draft, MutableReplicatedState, ReplicatedState } from \"@earendil-works/chord\";\nimport type { Op, Path, Seg } from \"@earendil-works/chord/delta\";\nimport type { ConversationHandle, Harness } from \"./harness.ts\";\nimport type {\n\tConversationSpec,\n\tConversationView,\n\tEntry,\n\tEntryScan,\n\tEnvelope,\n\tId,\n\tJsonObject,\n\tNewEntry,\n\tSendInput,\n\tViewEvent,\n} from \"./types.ts\";\nimport { WATCH_CAPACITY, type Watch } from \"./view.ts\";\n\nexport type PublishedConversationView = ConversationView & {\n\tcommit: { events: ViewEvent[] };\n};\n\nexport interface PicoConversationService {\n\treadonly view: ReplicatedState<PublishedConversationView>;\n\tsend(input: SendInput, ctx: Context): Promise<Id>;\n\twrite(entry: NewEntry, ctx: Context): Promise<Id>;\n\tinputAbort(id: Id, ctx: Context): Promise<\"aborted\" | \"already_placed\" | \"not_found\">;\n\tconfigSet(patch: JsonObject, ctx: Context): Promise<void>;\n\tabort(ctx: Context): Promise<void>;\n\treset(handoff: string | null, ctx: Context): Promise<void>;\n\tcollapse(instructions: string | null, ctx: Context): Promise<Id>;\n\tfork(at: Id | \"start\", spec: Omit<ConversationSpec, \"parent\">, ctx: Context): Promise<Id>;\n\tentries(scan: EntryScan, ctx: Context): Promise<Entry[]>;\n}\n\n/** Typed service identifier; Chord no longer provides `defineService()`. */\nexport interface PicoServiceId<T> {\n\treadonly id: string;\n\treadonly local: boolean;\n\t/** Type-only marker for the service implementation. */\n\treadonly __service?: T;\n}\n\n/** Local registration/control plane and remote keyed conversation contract used by Chord facets. */\nexport const PicoHarnessService: PicoServiceId<Harness> = Object.freeze({ id: \"pi.harness\", local: true });\nexport const PicoConversationService: PicoServiceId<PicoConversationService> = Object.freeze({\n\tid: \"pi.conversation\",\n\tlocal: false,\n});\n\nexport function createPicoConversationService<Cfg extends object>(\n\tharness: Pick<Harness, \"abortInput\" | \"entries\">,\n\tconversation: ConversationHandle<Cfg>,\n\tview: ReplicatedState<PublishedConversationView>,\n): PicoConversationService {\n\treturn {\n\t\tview,\n\t\tsend: (input, ctx) => conversation.send(input, ctx).then((handle) => handle.id),\n\t\twrite: (entry, ctx) => conversation.write(entry, ctx),\n\t\tinputAbort: (id, ctx) => harness.abortInput(id, ctx, conversation.id),\n\t\tconfigSet: (patch, ctx) => conversation.config.set(patch as never, ctx),\n\t\tabort: (ctx) => conversation.abort(ctx),\n\t\treset: (handoff, ctx) => conversation.reset(handoff ?? undefined, ctx),\n\t\tcollapse: (instructions, ctx) => conversation.collapse(instructions ?? undefined, ctx),\n\t\tfork: (at, spec, ctx) => conversation.fork(at, spec, ctx).then((child) => child.id),\n\t\tentries: (scan, ctx) => harness.entries({ ...scan, conversationId: conversation.id }, ctx),\n\t};\n}\n\nexport interface ChordViewBridge {\n\treadonly view: MutableReplicatedState<PublishedConversationView>;\n\treadonly closed: boolean;\n\tclose(): void;\n}\n\nexport interface ChordViewBridgeOptions {\n\tcapacity?: number;\n\t/** Called after the raw watch is closed. The owner should close and respawn its keyed service instance. */\n\tonFailure?: (error: Error) => void;\n}\n\n/**\n * Adapt Pico's commit-granular envelopes to one Chord publication per commit.\n * The raw listener only enqueues. Applying ops and publishing happen together,\n * off the Session line, with no await between them.\n */\nexport async function attachChordView(\n\tconversation: Pick<ConversationHandle, \"watch\">,\n\tcreateState: (initial: PublishedConversationView) => MutableReplicatedState<PublishedConversationView>,\n\tctx: Context,\n\topts: ChordViewBridgeOptions = {},\n): Promise<ChordViewBridge> {\n\tconst watch = await conversation.watch(ctx);\n\tconst view = createState({ ...structuredClone(watch.view), commit: { events: [] } });\n\treturn bridgeWatch(watch, view, ctx, opts);\n}\n\nfunction bridgeWatch(\n\twatch: Watch,\n\tview: MutableReplicatedState<PublishedConversationView>,\n\tctx: Context,\n\topts: ChordViewBridgeOptions,\n): ChordViewBridge {\n\tconst capacity = opts.capacity ?? WATCH_CAPACITY;\n\tif (!Number.isSafeInteger(capacity) || capacity < 1)\n\t\tthrow new RangeError(\"Chord view queue capacity must be positive\");\n\tconst queue: Envelope[] = [];\n\tlet scheduled = false;\n\tlet closed = false;\n\tconst fail = (cause: unknown) => {\n\t\tif (closed) return;\n\t\tclosed = true;\n\t\tqueue.length = 0;\n\t\twatch.stop();\n\t\ttry {\n\t\t\topts.onFailure?.(cause instanceof Error ? cause : new Error(String(cause)));\n\t\t} catch {}\n\t};\n\tconst drain = () => {\n\t\tscheduled = false;\n\t\twhile (!closed && queue.length > 0) {\n\t\t\tconst envelope = queue.shift()!;\n\t\t\ttry {\n\t\t\t\tview.change(ctx, (draft) => {\n\t\t\t\t\tapplyTracked(draft, envelope.ops);\n\t\t\t\t\tdraft.commit.events = envelope.events as Draft<ViewEvent[]>;\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tfail(error);\n\t\t\t}\n\t\t}\n\t};\n\twatch.start((envelope) => {\n\t\tif (closed) return;\n\t\tif (queue.length >= capacity) {\n\t\t\tfail(new Error(`Pico-to-Chord view queue exceeded ${capacity} envelopes`));\n\t\t\treturn;\n\t\t}\n\t\tqueue.push(envelope);\n\t\tif (scheduled) return;\n\t\tscheduled = true;\n\t\tqueueMicrotask(drain);\n\t});\n\treturn {\n\t\tview,\n\t\tget closed() {\n\t\t\treturn closed;\n\t\t},\n\t\tclose() {\n\t\t\tif (closed) return;\n\t\t\tclosed = true;\n\t\t\tqueue.length = 0;\n\t\t\twatch.stop();\n\t\t},\n\t};\n}\n\nfunction applyTracked(root: Draft<PublishedConversationView>, ops: readonly Op[]): void {\n\tfor (const op of ops) {\n\t\tif (op[0] === \"r\") throw new Error(\"live Pico envelope unexpectedly replaced the view root\");\n\t\tconst path = op[1];\n\t\tif (op[0] === \"p\") {\n\t\t\tconst target = resolve(root, path);\n\t\t\tif (!Array.isArray(target)) throw new Error(`Pico splice path is not an array: ${path.join(\".\")}`);\n\t\t\t(target as unknown[]).splice(op[2], op[3], ...op[4]);\n\t\t\tcontinue;\n\t\t}\n\t\tif (op[0] === \"m\") {\n\t\t\tconst target = resolve(root, path);\n\t\t\tif (!Array.isArray(target) || target.length !== op[2].length) {\n\t\t\t\tthrow new Error(`Pico permutation path is not a matching array: ${path.join(\".\")}`);\n\t\t\t}\n\t\t\tconst array = target as unknown[];\n\t\t\tconst previous = array.slice();\n\t\t\tconst rank = new Map<unknown, number>();\n\t\t\tfor (let index = 0; index < op[2].length; index++) {\n\t\t\t\tconst value = previous[op[2][index]!]!;\n\t\t\t\tif (!rank.has(value)) rank.set(value, index);\n\t\t\t}\n\t\t\tarray.sort((left, right) => rank.get(left)! - rank.get(right)!);\n\t\t\tcontinue;\n\t\t}\n\t\tconst parent = resolve(root, path.slice(0, -1));\n\t\tif (parent === null || typeof parent !== \"object\")\n\t\t\tthrow new Error(`Pico operation parent is not an object: ${path.join(\".\")}`);\n\t\tconst key = path[path.length - 1]!;\n\t\tif (op[0] === \"d\") {\n\t\t\tif (Array.isArray(parent)) parent.splice(key as number, 1);\n\t\t\telse delete (parent as Record<PropertyKey, unknown>)[key];\n\t\t\tcontinue;\n\t\t}\n\t\tconst record = parent as Record<PropertyKey, unknown>;\n\t\tif (op[0] === \"s\") record[key] = op[2];\n\t\telse if (op[0] === \"a\") record[key] = `${String(record[key])}${op[2]}`;\n\t\telse record[key] = String(record[key]).slice(op[2]);\n\t}\n}\n\nfunction resolve(root: unknown, path: Path): unknown {\n\tlet value = root;\n\tfor (const segment of path) {\n\t\tif (value === null || typeof value !== \"object\") return undefined;\n\t\tvalue = (value as Record<Seg, unknown>)[segment];\n\t}\n\treturn value;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@averyyy/pi-agent-core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0-piclient.1",
|
|
4
4
|
"description": "General-purpose agent with transport abstraction, state management, and attachment support",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -56,9 +56,9 @@
|
|
|
56
56
|
"prepublishOnly": "npm run build"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@earendil-works/chord": "^1.
|
|
60
|
-
"@earendil-works/pi-ai": "npm:@averyyy/pi-ai@1.
|
|
61
|
-
"@earendil-works/pi-telemetry": "^1.
|
|
59
|
+
"@earendil-works/chord": "^1.2.0",
|
|
60
|
+
"@earendil-works/pi-ai": "npm:@averyyy/pi-ai@1.2.0-piclient.1",
|
|
61
|
+
"@earendil-works/pi-telemetry": "^1.2.0",
|
|
62
62
|
"diff": "8.0.4",
|
|
63
63
|
"ignore": "7.0.8",
|
|
64
64
|
"typebox": "1.3.27",
|