@polpo-ai/sdk 0.3.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 (46) hide show
  1. package/LICENSE +21 -0
  2. package/dist/client/errors.d.ts +12 -0
  3. package/dist/client/errors.d.ts.map +1 -0
  4. package/dist/client/errors.js +25 -0
  5. package/dist/client/errors.js.map +1 -0
  6. package/dist/client/event-source.d.ts +29 -0
  7. package/dist/client/event-source.d.ts.map +1 -0
  8. package/dist/client/event-source.js +129 -0
  9. package/dist/client/event-source.js.map +1 -0
  10. package/dist/client/index.d.ts +7 -0
  11. package/dist/client/index.d.ts.map +1 -0
  12. package/dist/client/index.js +4 -0
  13. package/dist/client/index.js.map +1 -0
  14. package/dist/client/polpo-client.d.ts +300 -0
  15. package/dist/client/polpo-client.d.ts.map +1 -0
  16. package/dist/client/polpo-client.js +602 -0
  17. package/dist/client/polpo-client.js.map +1 -0
  18. package/dist/client/types.d.ts +1160 -0
  19. package/dist/client/types.d.ts.map +1 -0
  20. package/dist/client/types.js +7 -0
  21. package/dist/client/types.js.map +1 -0
  22. package/dist/index.d.ts +12 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +9 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/store/event-reducer.d.ts +8 -0
  27. package/dist/store/event-reducer.d.ts.map +1 -0
  28. package/dist/store/event-reducer.js +301 -0
  29. package/dist/store/event-reducer.js.map +1 -0
  30. package/dist/store/index.d.ts +6 -0
  31. package/dist/store/index.d.ts.map +1 -0
  32. package/dist/store/index.js +4 -0
  33. package/dist/store/index.js.map +1 -0
  34. package/dist/store/polpo-store.d.ts +31 -0
  35. package/dist/store/polpo-store.d.ts.map +1 -0
  36. package/dist/store/polpo-store.js +136 -0
  37. package/dist/store/polpo-store.js.map +1 -0
  38. package/dist/store/selectors.d.ts +18 -0
  39. package/dist/store/selectors.d.ts.map +1 -0
  40. package/dist/store/selectors.js +91 -0
  41. package/dist/store/selectors.js.map +1 -0
  42. package/dist/store/types.d.ts +51 -0
  43. package/dist/store/types.d.ts.map +1 -0
  44. package/dist/store/types.js +2 -0
  45. package/dist/store/types.js.map +1 -0
  46. package/package.json +61 -0
@@ -0,0 +1,136 @@
1
+ import { reduceEvent } from "./event-reducer.js";
2
+ function createInitialState() {
3
+ return {
4
+ tasks: new Map(),
5
+ missions: new Map(),
6
+ missionReports: new Map(),
7
+ agents: [],
8
+ processes: [],
9
+ stats: null,
10
+ connectionStatus: "disconnected",
11
+ recentEvents: [],
12
+ missionsStale: false,
13
+ memory: null,
14
+ agentMemory: new Map(),
15
+ assessmentProgress: new Map(),
16
+ assessmentChecks: new Map(),
17
+ activeDelays: new Map(),
18
+ };
19
+ }
20
+ const SERVER_SNAPSHOT = createInitialState();
21
+ export class PolpoStore {
22
+ state;
23
+ listeners = new Set();
24
+ constructor() {
25
+ this.state = createInitialState();
26
+ }
27
+ // ── useSyncExternalStore interface ──────────────────────────
28
+ subscribe = (listener) => {
29
+ this.listeners.add(listener);
30
+ return () => this.listeners.delete(listener);
31
+ };
32
+ getSnapshot = () => {
33
+ return this.state;
34
+ };
35
+ getServerSnapshot = () => {
36
+ return SERVER_SNAPSHOT;
37
+ };
38
+ // ── Bulk setters (from REST initial fetch) ─────────────────
39
+ setTasks(tasks) {
40
+ // Avoid creating a new Map (and breaking selector cache) when the
41
+ // task list hasn't actually changed. Two concurrent useTasks() hooks
42
+ // (e.g. agent-detail page + chat sidebar) each fire an initial fetch;
43
+ // without this guard the second setTasks creates a new Map reference,
44
+ // which causes a selectTasks cache miss → new array → useSyncExternalStore
45
+ // re-render → useEffect re-fires → infinite loop.
46
+ const prev = this.state.tasks;
47
+ if (prev.size === tasks.length && tasks.every((t) => prev.get(t.id) === t)) {
48
+ return;
49
+ }
50
+ this.state = {
51
+ ...this.state,
52
+ tasks: new Map(tasks.map((t) => [t.id, t])),
53
+ };
54
+ this.notify();
55
+ }
56
+ setMissions(missions) {
57
+ const prev = this.state.missions;
58
+ if (prev.size === missions.length && missions.every((m) => prev.get(m.id) === m)) {
59
+ if (!this.state.missionsStale)
60
+ return;
61
+ }
62
+ this.state = {
63
+ ...this.state,
64
+ missions: new Map(missions.map((m) => [m.id, m])),
65
+ missionsStale: false,
66
+ };
67
+ this.notify();
68
+ }
69
+ /** Upsert a single mission into the store without replacing the entire map. */
70
+ upsertMission(mission) {
71
+ const prev = this.state.missions.get(mission.id);
72
+ // Skip if the object is referentially identical (no change)
73
+ if (prev === mission)
74
+ return;
75
+ const missions = new Map(this.state.missions);
76
+ missions.set(mission.id, mission);
77
+ this.state = { ...this.state, missions };
78
+ this.notify();
79
+ }
80
+ setAgents(agents) {
81
+ const prev = this.state.agents;
82
+ if (prev.length === agents.length && agents.every((a, i) => prev[i] === a)) {
83
+ return;
84
+ }
85
+ this.state = { ...this.state, agents };
86
+ this.notify();
87
+ }
88
+ setProcesses(processes) {
89
+ const prev = this.state.processes;
90
+ if (prev.length === processes.length &&
91
+ processes.every((p, i) => prev[i] === p)) {
92
+ return;
93
+ }
94
+ this.state = { ...this.state, processes };
95
+ this.notify();
96
+ }
97
+ setConnectionStatus(status) {
98
+ this.state = { ...this.state, connectionStatus: status };
99
+ this.notify();
100
+ }
101
+ setMemory(memory) {
102
+ this.state = { ...this.state, memory };
103
+ this.notify();
104
+ }
105
+ setAgentMemory(agentName, memory) {
106
+ const agentMemory = new Map(this.state.agentMemory);
107
+ agentMemory.set(agentName, memory);
108
+ this.state = { ...this.state, agentMemory };
109
+ this.notify();
110
+ }
111
+ // ── SSE event application ──────────────────────────────────
112
+ applyEvent(event) {
113
+ const next = reduceEvent(this.state, event);
114
+ if (next !== this.state) {
115
+ this.state = next;
116
+ this.notify();
117
+ }
118
+ }
119
+ applyEventBatch(events) {
120
+ let current = this.state;
121
+ for (const event of events) {
122
+ current = reduceEvent(current, event);
123
+ }
124
+ if (current !== this.state) {
125
+ this.state = current;
126
+ this.notify();
127
+ }
128
+ }
129
+ // ── Notification ───────────────────────────────────────────
130
+ notify() {
131
+ for (const listener of this.listeners) {
132
+ listener();
133
+ }
134
+ }
135
+ }
136
+ //# sourceMappingURL=polpo-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polpo-store.js","sourceRoot":"","sources":["../../src/store/polpo-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Task, Mission, MissionReport, AgentProcess, SSEEvent, TaskStatus } from "../client/types.js";
2
+ import type { StoreState } from "./types.js";
3
+ export interface TaskFilter {
4
+ status?: TaskStatus | TaskStatus[];
5
+ group?: string;
6
+ assignTo?: string;
7
+ }
8
+ export declare function selectTasks(state: StoreState, filter?: TaskFilter): Task[];
9
+ export declare function selectTask(state: StoreState, taskId: string): Task | undefined;
10
+ export declare function selectMissions(state: StoreState): Mission[];
11
+ export declare function selectMission(state: StoreState, missionId: string): Mission | undefined;
12
+ export declare function selectMissionReport(state: StoreState, missionId: string): MissionReport | undefined;
13
+ export declare function selectProcesses(state: StoreState): AgentProcess[];
14
+ export declare function selectEvents(state: StoreState, filter?: string[]): SSEEvent[];
15
+ import type { AssessmentProgressEntry, AssessmentCheckStatus } from "./types.js";
16
+ export declare function selectAssessmentProgress(state: StoreState, taskId: string): AssessmentProgressEntry[];
17
+ export declare function selectAssessmentChecks(state: StoreState, taskId: string): AssessmentCheckStatus[];
18
+ //# sourceMappingURL=selectors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../src/store/selectors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC3G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAeD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,EAAE,CAiC1E;AAID,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAE9E;AAOD,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,EAAE,CAK3D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAEvF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEnG;AAID,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,EAAE,CAEjE;AAYD,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAoB7E;AAaD,OAAO,KAAK,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAKjF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,uBAAuB,EAAE,CAErG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,qBAAqB,EAAE,CAEjG"}
@@ -0,0 +1,91 @@
1
+ const taskCacheByFilter = new Map();
2
+ // Limit cache size to prevent unbounded growth
3
+ const MAX_TASK_CACHE_ENTRIES = 8;
4
+ export function selectTasks(state, filter) {
5
+ const filterKey = JSON.stringify(filter ?? {});
6
+ const cached = taskCacheByFilter.get(filterKey);
7
+ // Cache hit: same Map reference for this filter key
8
+ if (cached && cached.mapRef === state.tasks) {
9
+ return cached.result;
10
+ }
11
+ let tasks = Array.from(state.tasks.values());
12
+ if (filter?.status) {
13
+ const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
14
+ tasks = tasks.filter((t) => statuses.includes(t.status));
15
+ }
16
+ if (filter?.group) {
17
+ tasks = tasks.filter((t) => t.group === filter.group);
18
+ }
19
+ if (filter?.assignTo) {
20
+ tasks = tasks.filter((t) => t.assignTo === filter.assignTo);
21
+ }
22
+ // Default sort: most recently updated first
23
+ tasks.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
24
+ // Evict oldest entries if cache is full
25
+ if (taskCacheByFilter.size >= MAX_TASK_CACHE_ENTRIES) {
26
+ const firstKey = taskCacheByFilter.keys().next().value;
27
+ taskCacheByFilter.delete(firstKey);
28
+ }
29
+ taskCacheByFilter.set(filterKey, { mapRef: state.tasks, result: tasks });
30
+ return tasks;
31
+ }
32
+ // ── Single task selector ────────────────────────────────────
33
+ export function selectTask(state, taskId) {
34
+ return state.tasks.get(taskId);
35
+ }
36
+ // ── Mission selectors ───────────────────────────────────────
37
+ let lastMissionsMap = null;
38
+ let lastMissionResult = [];
39
+ export function selectMissions(state) {
40
+ if (state.missions === lastMissionsMap)
41
+ return lastMissionResult;
42
+ lastMissionsMap = state.missions;
43
+ lastMissionResult = Array.from(state.missions.values());
44
+ return lastMissionResult;
45
+ }
46
+ export function selectMission(state, missionId) {
47
+ return state.missions.get(missionId);
48
+ }
49
+ export function selectMissionReport(state, missionId) {
50
+ return state.missionReports.get(missionId);
51
+ }
52
+ // ── Process selector ────────────────────────────────────────
53
+ export function selectProcesses(state) {
54
+ return state.processes;
55
+ }
56
+ const eventCacheByFilter = new Map();
57
+ const MAX_EVENT_CACHE_ENTRIES = 8;
58
+ export function selectEvents(state, filter) {
59
+ const filterKey = filter?.join(",") ?? "";
60
+ const cached = eventCacheByFilter.get(filterKey);
61
+ if (cached && cached.eventsRef === state.recentEvents) {
62
+ return cached.result;
63
+ }
64
+ let events = state.recentEvents;
65
+ if (filter?.length) {
66
+ events = events.filter((e) => matchesEventFilter(e.event, filter));
67
+ }
68
+ if (eventCacheByFilter.size >= MAX_EVENT_CACHE_ENTRIES) {
69
+ const firstKey = eventCacheByFilter.keys().next().value;
70
+ eventCacheByFilter.delete(firstKey);
71
+ }
72
+ eventCacheByFilter.set(filterKey, { eventsRef: state.recentEvents, result: events });
73
+ return events;
74
+ }
75
+ function matchesEventFilter(eventName, patterns) {
76
+ return patterns.some((pattern) => {
77
+ if (pattern.endsWith("*")) {
78
+ return eventName.startsWith(pattern.slice(0, -1));
79
+ }
80
+ return eventName === pattern;
81
+ });
82
+ }
83
+ const EMPTY_PROGRESS = [];
84
+ const EMPTY_CHECKS = [];
85
+ export function selectAssessmentProgress(state, taskId) {
86
+ return state.assessmentProgress.get(taskId) ?? EMPTY_PROGRESS;
87
+ }
88
+ export function selectAssessmentChecks(state, taskId) {
89
+ return state.assessmentChecks.get(taskId) ?? EMPTY_CHECKS;
90
+ }
91
+ //# sourceMappingURL=selectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors.js","sourceRoot":"","sources":["../../src/store/selectors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { Task, Mission, MissionReport, ActiveDelay, AgentConfig, AgentProcess, SSEEvent } from "../client/types.js";
2
+ import type { ConnectionStatus } from "../client/event-source.js";
3
+ export interface PolpoStats {
4
+ pending: number;
5
+ running: number;
6
+ done: number;
7
+ failed: number;
8
+ queued: number;
9
+ }
10
+ export interface AssessmentProgressEntry {
11
+ message: string;
12
+ timestamp: number;
13
+ }
14
+ export interface AssessmentCheckStatus {
15
+ index: number;
16
+ total: number;
17
+ type: string;
18
+ label: string;
19
+ phase: "started" | "complete";
20
+ passed?: boolean;
21
+ message?: string;
22
+ timestamp: number;
23
+ }
24
+ export interface StoreState {
25
+ tasks: Map<string, Task>;
26
+ missions: Map<string, Mission>;
27
+ /** Mission completion reports keyed by missionId. Populated from mission:completed SSE events. */
28
+ missionReports: Map<string, MissionReport>;
29
+ agents: AgentConfig[];
30
+ processes: AgentProcess[];
31
+ stats: PolpoStats | null;
32
+ connectionStatus: ConnectionStatus;
33
+ recentEvents: SSEEvent[];
34
+ missionsStale: boolean;
35
+ memory: {
36
+ exists: boolean;
37
+ content: string;
38
+ } | null;
39
+ /** Agent-specific memory keyed by agent name. */
40
+ agentMemory: Map<string, {
41
+ exists: boolean;
42
+ content: string;
43
+ }>;
44
+ /** Live assessment progress messages keyed by taskId. Cleared on assessment:complete. */
45
+ assessmentProgress: Map<string, AssessmentProgressEntry[]>;
46
+ /** Per-check status keyed by taskId. Tracks which expectations are running/done. Cleared on assessment:complete. */
47
+ assessmentChecks: Map<string, AssessmentCheckStatus[]>;
48
+ /** Active delay timers keyed by "group:delayName". Updated from delay:started/delay:expired SSE events. */
49
+ activeDelays: Map<string, ActiveDelay>;
50
+ }
51
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EACJ,OAAO,EACP,aAAa,EACb,WAAW,EACX,WAAW,EACX,YAAY,EACZ,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,kGAAkG;IAClG,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3C,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,YAAY,EAAE,QAAQ,EAAE,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACpD,iDAAiD;IACjD,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,yFAAyF;IACzF,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC3D,oHAAoH;IACpH,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACvD,2GAA2G;IAC3G,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACxC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@polpo-ai/sdk",
3
+ "version": "0.3.0",
4
+ "description": "Polpo SDK — typed HTTP client, SSE streaming, and reactive store for AI agent orchestration",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./client": {
14
+ "types": "./dist/client/index.d.ts",
15
+ "import": "./dist/client/index.js"
16
+ },
17
+ "./store": {
18
+ "types": "./dist/store/index.d.ts",
19
+ "import": "./dist/store/index.js"
20
+ }
21
+ },
22
+ "sideEffects": false,
23
+ "devDependencies": {
24
+ "typescript": "^5.7.0"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "README.md"
29
+ ],
30
+ "license": "MIT",
31
+ "keywords": [
32
+ "polpo",
33
+ "ai-agents",
34
+ "orchestration",
35
+ "typescript",
36
+ "client",
37
+ "sdk",
38
+ "sse",
39
+ "real-time"
40
+ ],
41
+ "author": "OpenPolpo Contributors",
42
+ "engines": {
43
+ "node": ">=18.0.0"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "https://github.com/lumea-labs/polpo.git",
51
+ "directory": "packages/client-sdk"
52
+ },
53
+ "homepage": "https://github.com/lumea-labs/polpo/tree/main/packages/client-sdk",
54
+ "bugs": {
55
+ "url": "https://github.com/lumea-labs/polpo/issues"
56
+ },
57
+ "scripts": {
58
+ "build": "tsc",
59
+ "dev": "tsc --watch"
60
+ }
61
+ }