@corenel/tools-web 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 (45) hide show
  1. package/dist/core/protocol.d.ts +144 -0
  2. package/dist/core/protocol.d.ts.map +1 -0
  3. package/dist/core/protocol.js +2 -0
  4. package/dist/core/protocol.js.map +1 -0
  5. package/dist/idb.d.ts +12 -0
  6. package/dist/idb.d.ts.map +1 -0
  7. package/dist/idb.js +100 -0
  8. package/dist/idb.js.map +1 -0
  9. package/dist/memory/index.d.ts +11 -0
  10. package/dist/memory/index.d.ts.map +1 -0
  11. package/dist/memory/index.js +21 -0
  12. package/dist/memory/index.js.map +1 -0
  13. package/dist/memory/local.d.ts +16 -0
  14. package/dist/memory/local.d.ts.map +1 -0
  15. package/dist/memory/local.js +51 -0
  16. package/dist/memory/local.js.map +1 -0
  17. package/dist/memory/prompdApi.d.ts +20 -0
  18. package/dist/memory/prompdApi.d.ts.map +1 -0
  19. package/dist/memory/prompdApi.js +68 -0
  20. package/dist/memory/prompdApi.js.map +1 -0
  21. package/dist/prompts/history.d.ts +27 -0
  22. package/dist/prompts/history.d.ts.map +1 -0
  23. package/dist/prompts/history.js +82 -0
  24. package/dist/prompts/history.js.map +1 -0
  25. package/dist/sessions/store.d.ts +10 -0
  26. package/dist/sessions/store.d.ts.map +1 -0
  27. package/dist/sessions/store.js +37 -0
  28. package/dist/sessions/store.js.map +1 -0
  29. package/dist/storageHealth.d.ts +16 -0
  30. package/dist/storageHealth.d.ts.map +1 -0
  31. package/dist/storageHealth.js +64 -0
  32. package/dist/storageHealth.js.map +1 -0
  33. package/dist/tools/result-store.d.ts +20 -0
  34. package/dist/tools/result-store.d.ts.map +1 -0
  35. package/dist/tools/result-store.js +52 -0
  36. package/dist/tools/result-store.js.map +1 -0
  37. package/dist/workerClient.d.ts +81 -0
  38. package/dist/workerClient.d.ts.map +1 -0
  39. package/dist/workerClient.js +192 -0
  40. package/dist/workerClient.js.map +1 -0
  41. package/dist/workerHandler.d.ts +6 -0
  42. package/dist/workerHandler.d.ts.map +1 -0
  43. package/dist/workerHandler.js +442 -0
  44. package/dist/workerHandler.js.map +1 -0
  45. package/package.json +44 -0
@@ -0,0 +1,144 @@
1
+ import type { ChatCompletionMessageParam } from 'openai/resources/chat/completions';
2
+ import type { AgentEvent, AskQuestion, AskAnswers, EditReviewOutcome } from '@corenel/protocol';
3
+ import type { RunAgentResult } from '@corenel/harness/core/loop';
4
+ import type { Policy, PermissionCeiling } from '@corenel/harness/guardrail';
5
+ import type { CompressionConfig } from '@corenel/harness/compression';
6
+ import type { NodeSpec, RunNodeResult } from '@corenel/harness/dag/executeNode';
7
+ import type { NodeOutput, NodeEvent } from '@corenel/protocol';
8
+ import type { FileOp } from '@corenel/protocol';
9
+ import type { ToolDecl } from '@corenel/protocol';
10
+ /** Lightweight provider metadata sent with a run so the worker's file tools can
11
+ * describe write risk in permission prompts (LOCAL DISK vs virtual workspace). */
12
+ export interface FileMeta {
13
+ kind: 'memory' | 'directory';
14
+ label: string;
15
+ isLocalDisk: boolean;
16
+ writable: boolean;
17
+ }
18
+ export type MainToWorker = {
19
+ kind: 'run';
20
+ runId: number;
21
+ messages: ChatCompletionMessageParam[];
22
+ model?: string;
23
+ system?: string;
24
+ policy?: Policy;
25
+ ceiling?: PermissionCeiling;
26
+ compression?: CompressionConfig;
27
+ debug?: boolean;
28
+ fileMeta?: FileMeta;
29
+ scope?: string;
30
+ /** True when the caller wired a propose_edit reviewer (onEditReview) — the
31
+ * worker then BLOCKS propose_edit on the review. Surfaces with no mid-run
32
+ * review UI (the standalone agent page) leave it unset and keep the
33
+ * non-blocking acknowledgment. */
34
+ reviewEdits?: boolean;
35
+ /** Tools contributed by connected sidecars (capability servers). The worker
36
+ * exposes them to the model as proxy tools whose calls forward to the main
37
+ * thread (tool-request) — same shape as the file bridge. The main thread
38
+ * holds the sidecar connection and gates the call before it crosses. */
39
+ remoteTools?: ToolDecl[];
40
+ } | {
41
+ kind: 'run-node';
42
+ runId: number;
43
+ node: NodeSpec;
44
+ inputs: Record<string, NodeOutput>;
45
+ model?: string;
46
+ policy?: Policy;
47
+ ceiling?: PermissionCeiling;
48
+ compression?: CompressionConfig;
49
+ debug?: boolean;
50
+ fileMeta?: FileMeta;
51
+ scope?: string;
52
+ remoteTools?: ToolDecl[];
53
+ } | {
54
+ kind: 'abort';
55
+ runId: number;
56
+ } | {
57
+ kind: 'token-response';
58
+ id: number;
59
+ token: string | null;
60
+ } | {
61
+ kind: 'permission-response';
62
+ id: number;
63
+ allow: boolean;
64
+ } | {
65
+ kind: 'ask-response';
66
+ id: number;
67
+ answers: AskAnswers | null;
68
+ } | {
69
+ kind: 'edit-review-response';
70
+ id: number;
71
+ outcome: EditReviewOutcome | null;
72
+ } | {
73
+ kind: 'file-response';
74
+ id: number;
75
+ ok: boolean;
76
+ data?: unknown;
77
+ error?: string;
78
+ } | {
79
+ kind: 'tool-response';
80
+ id: number;
81
+ ok: boolean;
82
+ result?: string;
83
+ error?: string;
84
+ };
85
+ export type WorkerToMain = {
86
+ kind: 'event';
87
+ runId: number;
88
+ event: AgentEvent;
89
+ } | {
90
+ kind: 'node-event';
91
+ runId: number;
92
+ event: NodeEvent;
93
+ } | {
94
+ kind: 'result';
95
+ runId: number;
96
+ result: RunAgentResult;
97
+ } | {
98
+ kind: 'node-result';
99
+ runId: number;
100
+ result: RunNodeResult;
101
+ } | {
102
+ kind: 'error';
103
+ runId: number;
104
+ message: string;
105
+ } | {
106
+ kind: 'token-request';
107
+ id: number;
108
+ } | {
109
+ kind: 'permission-request';
110
+ id: number;
111
+ runId: number;
112
+ tool: string;
113
+ summary: string;
114
+ input?: unknown;
115
+ } | {
116
+ kind: 'ask-request';
117
+ id: number;
118
+ runId: number;
119
+ questions: AskQuestion[];
120
+ } | {
121
+ kind: 'edit-review-request';
122
+ id: number;
123
+ runId: number;
124
+ callId: string;
125
+ } | {
126
+ kind: 'file-request';
127
+ id: number;
128
+ op: FileOp;
129
+ args: unknown[];
130
+ } | {
131
+ kind: 'tool-request';
132
+ id: number;
133
+ runId: number;
134
+ name: string;
135
+ args: Record<string, unknown>;
136
+ };
137
+ /** The kernel worker handler's host channel. The app-owned worker entry binds
138
+ * this to its runtime — a browser Web Worker's `self`, or a Node
139
+ * `worker_threads` parentPort — so the handler itself never references either. */
140
+ export interface WorkerTransport {
141
+ post(msg: WorkerToMain): void;
142
+ on(handler: (msg: MainToWorker) => void): void;
143
+ }
144
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../core/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../core/protocol.ts"],"names":[],"mappings":""}
package/dist/idb.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export declare const STORES: readonly ["memory", "kv", "sessions", "recall", "files", "config", "config-history"];
2
+ export type StoreName = (typeof STORES)[number];
3
+ /** Point IndexedDB at a given identity's database. Drops the cached connection so
4
+ * the next op opens the new DB. No-op when unchanged. */
5
+ export declare function setIdbScope(scope: string): void;
6
+ export declare function idbPut<T>(store: StoreName, key: string, value: T): Promise<void>;
7
+ export declare function idbGet<T>(store: StoreName, key: string): Promise<T | undefined>;
8
+ export declare function idbGetAll<T>(store: StoreName): Promise<T[]>;
9
+ export declare function idbKeys(store: StoreName): Promise<string[]>;
10
+ export declare function idbDelete(store: StoreName, key: string): Promise<void>;
11
+ export declare function idbClear(store: StoreName): Promise<void>;
12
+ //# sourceMappingURL=idb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idb.d.ts","sourceRoot":"","sources":["../idb.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,MAAM,sFAAuF,CAAC;AAC3G,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAchD;yDACyD;AACzD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAM/C;AAiDD,wBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhF;AAED,wBAAsB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAGrF;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAGjE;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIjE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAExD"}
package/dist/idb.js ADDED
@@ -0,0 +1,100 @@
1
+ /* Minimal promise-wrapped IndexedDB (no deps). Worker-safe (IndexedDB works in
2
+ * workers; localStorage does not), so the local providers can move into a Worker
3
+ * later unchanged. Out-of-line keys: put(value, key). */
4
+ import { isStorageFullError, reportStorageFull, reportStorageOk } from './storageHealth';
5
+ const DB_BASE = 'prompd.agent';
6
+ const VERSION = 5;
7
+ export const STORES = ['memory', 'kv', 'sessions', 'recall', 'files', 'config', 'config-history'];
8
+ // Per-identity database name. The anonymous scope keeps the bare `prompd.agent`
9
+ // DB (so pre-existing local data is preserved); each signed-in identity gets its
10
+ // own `prompd.agent.<scope>` DB. Set by lib/scope on the main thread, and by the
11
+ // worker per-run from the scope carried in the run message — so the worker and
12
+ // main thread always read/write the same identity's database.
13
+ let scopeName = 'anon';
14
+ function dbName() {
15
+ return scopeName === 'anon' ? DB_BASE : `${DB_BASE}.${scopeName}`;
16
+ }
17
+ let dbPromise = null;
18
+ /** Point IndexedDB at a given identity's database. Drops the cached connection so
19
+ * the next op opens the new DB. No-op when unchanged. */
20
+ export function setIdbScope(scope) {
21
+ if (scope === scopeName)
22
+ return;
23
+ scopeName = scope;
24
+ const prev = dbPromise;
25
+ dbPromise = null;
26
+ if (prev)
27
+ prev.then((db) => db.close()).catch(() => { });
28
+ }
29
+ function open() {
30
+ if (dbPromise)
31
+ return dbPromise;
32
+ dbPromise = new Promise((resolve, reject) => {
33
+ const req = indexedDB.open(dbName(), VERSION);
34
+ req.onupgradeneeded = () => {
35
+ const db = req.result;
36
+ for (const s of STORES) {
37
+ if (!db.objectStoreNames.contains(s))
38
+ db.createObjectStore(s);
39
+ }
40
+ };
41
+ req.onsuccess = () => resolve(req.result);
42
+ req.onerror = () => reject(req.error);
43
+ });
44
+ return dbPromise;
45
+ }
46
+ function reqP(req) {
47
+ return new Promise((resolve, reject) => {
48
+ req.onsuccess = () => resolve(req.result);
49
+ req.onerror = () => reject(req.error);
50
+ });
51
+ }
52
+ function done(tx) {
53
+ return new Promise((resolve, reject) => {
54
+ tx.oncomplete = () => resolve();
55
+ tx.onerror = () => reject(tx.error);
56
+ tx.onabort = () => reject(tx.error);
57
+ });
58
+ }
59
+ /** Run a write transaction, failing SOFT when the browser refuses to persist
60
+ * (quota exhausted / disk full): the value isn't saved but the call resolves, so a
61
+ * full disk degrades the app instead of crashing the flow. Other errors still throw. */
62
+ async function write(store, mutate) {
63
+ try {
64
+ const db = await open();
65
+ const tx = db.transaction(store, 'readwrite');
66
+ mutate(tx.objectStore(store));
67
+ await done(tx);
68
+ reportStorageOk();
69
+ }
70
+ catch (e) {
71
+ if (isStorageFullError(e)) {
72
+ reportStorageFull();
73
+ return;
74
+ }
75
+ throw e;
76
+ }
77
+ }
78
+ export function idbPut(store, key, value) {
79
+ return write(store, (s) => s.put(value, key));
80
+ }
81
+ export async function idbGet(store, key) {
82
+ const db = await open();
83
+ return reqP(db.transaction(store).objectStore(store).get(key));
84
+ }
85
+ export async function idbGetAll(store) {
86
+ const db = await open();
87
+ return reqP(db.transaction(store).objectStore(store).getAll());
88
+ }
89
+ export async function idbKeys(store) {
90
+ const db = await open();
91
+ const keys = await reqP(db.transaction(store).objectStore(store).getAllKeys());
92
+ return keys.map(String);
93
+ }
94
+ export function idbDelete(store, key) {
95
+ return write(store, (s) => s.delete(key));
96
+ }
97
+ export function idbClear(store) {
98
+ return write(store, (s) => s.clear());
99
+ }
100
+ //# sourceMappingURL=idb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idb.js","sourceRoot":"","sources":["../idb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { IMemoryProvider, IKeyValueStore, ISearchProvider } from '@corenel/protocol';
2
+ export type AgentBackend = 'local' | 'prompd-api';
3
+ export declare const AGENT_BACKEND: AgentBackend;
4
+ export interface ProviderSet {
5
+ memory: IMemoryProvider;
6
+ kv: IKeyValueStore;
7
+ search: ISearchProvider;
8
+ }
9
+ export declare function setSearchProvider(provider: ISearchProvider): void;
10
+ export declare function createProviders(getToken: () => Promise<string | null>, backend?: AgentBackend): ProviderSet;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../memory/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAmB,MAAM,mBAAmB,CAAC;AAI3G,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,YAAY,CAAC;AAClD,eAAO,MAAM,aAAa,EAAE,YACoE,CAAC;AAEjG,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,eAAe,CAAC;IACxB,EAAE,EAAE,cAAc,CAAC;IACnB,MAAM,EAAE,eAAe,CAAC;CACzB;AASD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAEjE;AAGD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EACtC,OAAO,GAAE,YAA4B,GACpC,WAAW,CAKb"}
@@ -0,0 +1,21 @@
1
+ import { LocalMemoryProvider, LocalKeyValueStore } from './local';
2
+ import { PrompdApiMemoryProvider, PrompdApiKeyValueStore } from './prompdApi';
3
+ export const AGENT_BACKEND = import.meta.env.VITE_AGENT_BACKEND === 'prompd-api' ? 'prompd-api' : 'local';
4
+ /* Search backend is HOST-INJECTED (the registry it hits is a product choice).
5
+ * The app registers a real provider at boot via setSearchProvider; until then
6
+ * search returns nothing rather than throwing — an unconfigured search degrades,
7
+ * it doesn't break a run. The shared `search` delegates LAZILY so registration
8
+ * order never matters (createProviders runs at some module loads before boot). */
9
+ const NULL_SEARCH = { async searchPackages() { return []; } };
10
+ let injectedSearch = NULL_SEARCH;
11
+ export function setSearchProvider(provider) {
12
+ injectedSearch = provider;
13
+ }
14
+ const sharedSearch = { searchPackages: (q) => injectedSearch.searchPackages(q) };
15
+ export function createProviders(getToken, backend = AGENT_BACKEND) {
16
+ if (backend === 'prompd-api') {
17
+ return { memory: new PrompdApiMemoryProvider(getToken), kv: new PrompdApiKeyValueStore(getToken), search: sharedSearch };
18
+ }
19
+ return { memory: new LocalMemoryProvider(), kv: new LocalKeyValueStore(), search: sharedSearch };
20
+ }
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../memory/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAG9E,MAAM,CAAC,MAAM,aAAa,GACvB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,kBAAmC,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;AAQjG;;;;kFAIkF;AAClF,MAAM,WAAW,GAAoB,EAAE,KAAK,CAAC,cAAc,KAAiC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3G,IAAI,cAAc,GAAoB,WAAW,CAAC;AAClD,MAAM,UAAU,iBAAiB,CAAC,QAAyB;IACzD,cAAc,GAAG,QAAQ,CAAC;AAC5B,CAAC;AACD,MAAM,YAAY,GAAoB,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;AAElG,MAAM,UAAU,eAAe,CAC7B,QAAsC,EACtC,UAAwB,aAAa;IAErC,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,OAAO,EAAE,MAAM,EAAE,IAAI,uBAAuB,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,sBAAsB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAC3H,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,mBAAmB,EAAE,EAAE,EAAE,EAAE,IAAI,kBAAkB,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AACnG,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { IMemoryProvider, MemoryItem, IKeyValueStore } from '@corenel/protocol';
2
+ /** IndexedDB memory. Recall is naive keyword/recency scoring (no embeddings) —
3
+ * adequate for the experiment; a PrompdApiMemoryProvider can do real retrieval. */
4
+ export declare class LocalMemoryProvider implements IMemoryProvider {
5
+ save(text: string, tags?: string[]): Promise<MemoryItem>;
6
+ recall(query: string, limit?: number): Promise<MemoryItem[]>;
7
+ list(limit?: number): Promise<MemoryItem[]>;
8
+ forget(id: string): Promise<void>;
9
+ }
10
+ export declare class LocalKeyValueStore implements IKeyValueStore {
11
+ get(key: string): Promise<string | null>;
12
+ set(key: string, value: string): Promise<void>;
13
+ delete(key: string): Promise<void>;
14
+ keys(prefix?: string): Promise<string[]>;
15
+ }
16
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../memory/local.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOhF;mFACmF;AACnF,qBAAa,mBAAoB,YAAW,eAAe;IACnD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAM5D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAevD,IAAI,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAKvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC;AAED,qBAAa,kBAAmB,YAAW,cAAc;IACjD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAG9C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGlC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAI/C"}
@@ -0,0 +1,51 @@
1
+ import { idbGet, idbGetAll, idbPut, idbDelete, idbKeys } from '../idb';
2
+ function uid(prefix) {
3
+ return `${prefix}_${Date.now().toString(36)}${Math.floor(Math.random() * 1e6).toString(36)}`;
4
+ }
5
+ /** IndexedDB memory. Recall is naive keyword/recency scoring (no embeddings) —
6
+ * adequate for the experiment; a PrompdApiMemoryProvider can do real retrieval. */
7
+ export class LocalMemoryProvider {
8
+ async save(text, tags = []) {
9
+ const item = { id: uid('mem'), text, tags, createdAt: Date.now() };
10
+ await idbPut('memory', item.id, item);
11
+ return item;
12
+ }
13
+ async recall(query, limit = 5) {
14
+ const all = await idbGetAll('memory');
15
+ const terms = query.toLowerCase().split(/\s+/).filter(Boolean);
16
+ const scored = all.map((m) => {
17
+ const hay = `${m.text} ${m.tags.join(' ')}`.toLowerCase();
18
+ const hits = terms.reduce((n, t) => (hay.includes(t) ? n + 1 : n), 0);
19
+ return { m, score: hits, recency: m.createdAt };
20
+ });
21
+ return scored
22
+ .filter((s) => s.score > 0 || terms.length === 0)
23
+ .sort((a, b) => b.score - a.score || b.recency - a.recency)
24
+ .slice(0, limit)
25
+ .map((s) => s.m);
26
+ }
27
+ async list(limit = 50) {
28
+ const all = await idbGetAll('memory');
29
+ return all.sort((a, b) => b.createdAt - a.createdAt).slice(0, limit);
30
+ }
31
+ async forget(id) {
32
+ await idbDelete('memory', id);
33
+ }
34
+ }
35
+ export class LocalKeyValueStore {
36
+ async get(key) {
37
+ const v = await idbGet('kv', key);
38
+ return v ?? null;
39
+ }
40
+ async set(key, value) {
41
+ await idbPut('kv', key, value);
42
+ }
43
+ async delete(key) {
44
+ await idbDelete('kv', key);
45
+ }
46
+ async keys(prefix) {
47
+ const all = await idbKeys('kv');
48
+ return prefix ? all.filter((k) => k.startsWith(prefix)) : all;
49
+ }
50
+ }
51
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../memory/local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { IMemoryProvider, MemoryItem, IKeyValueStore } from '@corenel/protocol';
2
+ type GetToken = () => Promise<string | null>;
3
+ export declare class PrompdApiMemoryProvider implements IMemoryProvider {
4
+ private getToken;
5
+ constructor(getToken: GetToken);
6
+ save(text: string, tags?: string[]): Promise<MemoryItem>;
7
+ recall(query: string, limit?: number): Promise<MemoryItem[]>;
8
+ list(limit?: number): Promise<MemoryItem[]>;
9
+ forget(id: string): Promise<void>;
10
+ }
11
+ export declare class PrompdApiKeyValueStore implements IKeyValueStore {
12
+ private getToken;
13
+ constructor(getToken: GetToken);
14
+ get(key: string): Promise<string | null>;
15
+ set(key: string, value: string): Promise<void>;
16
+ delete(key: string): Promise<void>;
17
+ keys(prefix?: string): Promise<string[]>;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=prompdApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompdApi.d.ts","sourceRoot":"","sources":["../../memory/prompdApi.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGrF,KAAK,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAe7C,qBAAa,uBAAwB,YAAW,eAAe;IACjD,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,QAAQ;IAEhC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAI5D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAIvD,IAAI,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAIvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC;AAED,qBAAa,sBAAuB,YAAW,cAAc;IAC/C,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,QAAQ;IAEhC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAMxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAG9C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGlC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAK/C"}
@@ -0,0 +1,68 @@
1
+ const BASE = (import.meta.env.VITE_API_BASE_URL || '/api').replace(/\/$/, '');
2
+ async function authedFetch(getToken, path, init = {}) {
3
+ const token = await getToken().catch(() => null);
4
+ const headers = new Headers(init.headers);
5
+ headers.set('Content-Type', 'application/json');
6
+ if (token)
7
+ headers.set('Authorization', `Bearer ${token}`);
8
+ return fetch(`${BASE}${path}`, { ...init, headers });
9
+ }
10
+ async function json(res) {
11
+ if (!res.ok)
12
+ throw new Error(`HTTP ${res.status}`);
13
+ return res.json();
14
+ }
15
+ export class PrompdApiMemoryProvider {
16
+ constructor(getToken) {
17
+ Object.defineProperty(this, "getToken", {
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true,
21
+ value: getToken
22
+ });
23
+ }
24
+ async save(text, tags = []) {
25
+ const res = await authedFetch(this.getToken, '/agent/memory', { method: 'POST', body: JSON.stringify({ text, tags }) });
26
+ return json(res);
27
+ }
28
+ async recall(query, limit = 5) {
29
+ const res = await authedFetch(this.getToken, `/agent/memory/search?q=${encodeURIComponent(query)}&limit=${limit}`);
30
+ return json(res);
31
+ }
32
+ async list(limit = 50) {
33
+ const res = await authedFetch(this.getToken, `/agent/memory?limit=${limit}`);
34
+ return json(res);
35
+ }
36
+ async forget(id) {
37
+ await authedFetch(this.getToken, `/agent/memory/${encodeURIComponent(id)}`, { method: 'DELETE' });
38
+ }
39
+ }
40
+ export class PrompdApiKeyValueStore {
41
+ constructor(getToken) {
42
+ Object.defineProperty(this, "getToken", {
43
+ enumerable: true,
44
+ configurable: true,
45
+ writable: true,
46
+ value: getToken
47
+ });
48
+ }
49
+ async get(key) {
50
+ const res = await authedFetch(this.getToken, `/agent/kv/${encodeURIComponent(key)}`);
51
+ if (res.status === 404)
52
+ return null;
53
+ const { value } = await json(res);
54
+ return value ?? null;
55
+ }
56
+ async set(key, value) {
57
+ await authedFetch(this.getToken, `/agent/kv/${encodeURIComponent(key)}`, { method: 'PUT', body: JSON.stringify({ value }) });
58
+ }
59
+ async delete(key) {
60
+ await authedFetch(this.getToken, `/agent/kv/${encodeURIComponent(key)}`, { method: 'DELETE' });
61
+ }
62
+ async keys(prefix) {
63
+ const q = prefix ? `?prefix=${encodeURIComponent(prefix)}` : '';
64
+ const res = await authedFetch(this.getToken, `/agent/kv${q}`);
65
+ return json(res);
66
+ }
67
+ }
68
+ //# sourceMappingURL=prompdApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompdApi.js","sourceRoot":"","sources":["../../memory/prompdApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface ConfigCommit {
2
+ id: string;
3
+ ts: number;
4
+ message: string;
5
+ /** path -> file content, captured at commit time. */
6
+ files: Record<string, string>;
7
+ }
8
+ /** Lightweight commit info for the history list (no file bodies). */
9
+ export interface CommitMeta {
10
+ id: string;
11
+ ts: number;
12
+ message: string;
13
+ fileCount: number;
14
+ }
15
+ /** Snapshot the current config working copy as a named commit. */
16
+ export declare function commitConfig(message: string): Promise<CommitMeta>;
17
+ /** All commits, newest first (metadata only). */
18
+ export declare function listCommits(): Promise<CommitMeta[]>;
19
+ /** Full commit (including file bodies), or null if missing. */
20
+ export declare function getCommit(id: string): Promise<ConfigCommit | null>;
21
+ /** Restore the working copy to a commit: write each snapshot file and delete any
22
+ * config file the commit didn't contain. Writes go through configWorkspace so the
23
+ * explorer/editor refresh via its onChange listeners. */
24
+ export declare function restoreConfig(id: string): Promise<void>;
25
+ /** Delete a commit from history (does not touch the working copy). */
26
+ export declare function deleteCommit(id: string): Promise<void>;
27
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../prompts/history.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,qEAAqE;AACrE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAmBD,kEAAkE;AAClE,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAWvE;AAED,iDAAiD;AACjD,wBAAsB,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAKzD;AAED,+DAA+D;AAC/D,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAExE;AAED;;yDAEyD;AACzD,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe7D;AAED,sEAAsE;AACtE,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D"}
@@ -0,0 +1,82 @@
1
+ /* Commit history for the Prompd-config workspace (the agent's prompt files).
2
+ *
3
+ * The config files in IndexedDB (store 'config') are the LIVE working copy that
4
+ * composeAgentSystem reads — so editing + chatting tests an edit immediately. A
5
+ * commit snapshots that working copy into the 'config-history' store as a named,
6
+ * restorable savepoint; restoring overwrites the working copy with a past snapshot.
7
+ *
8
+ * Snapshots are whole-workspace (the config tree is a handful of small .md files),
9
+ * which keeps restore trivial and diff-free. */
10
+ import { idbGet, idbGetAll, idbKeys, idbPut, idbDelete } from '../idb';
11
+ import { configWorkspace } from '@corenel/harness/prompts/host';
12
+ import { seedConfig } from '@corenel/harness/prompts/config';
13
+ const STORE = 'config-history';
14
+ const KEEP = '.keep';
15
+ let seq = 0;
16
+ function freshId() {
17
+ seq += 1;
18
+ return `c-${Date.now().toString(36)}-${seq.toString(36)}`;
19
+ }
20
+ /** Read every config file (path -> content), skipping empty-dir .keep markers. */
21
+ async function snapshotWorkingCopy() {
22
+ const [keys, vals] = await Promise.all([idbKeys('config'), idbGetAll('config')]);
23
+ const files = {};
24
+ for (let i = 0; i < keys.length; i++) {
25
+ if (keys[i].endsWith(`/${KEEP}`) || keys[i] === KEEP)
26
+ continue;
27
+ files[keys[i]] = vals[i] ?? '';
28
+ }
29
+ return files;
30
+ }
31
+ /** Snapshot the current config working copy as a named commit. */
32
+ export async function commitConfig(message) {
33
+ await seedConfig();
34
+ const files = await snapshotWorkingCopy();
35
+ const commit = {
36
+ id: freshId(),
37
+ ts: Date.now(),
38
+ message: message.trim() || 'Update prompts',
39
+ files,
40
+ };
41
+ await idbPut(STORE, commit.id, commit);
42
+ return { id: commit.id, ts: commit.ts, message: commit.message, fileCount: Object.keys(files).length };
43
+ }
44
+ /** All commits, newest first (metadata only). */
45
+ export async function listCommits() {
46
+ const all = await idbGetAll(STORE);
47
+ return all
48
+ .map((c) => ({ id: c.id, ts: c.ts, message: c.message, fileCount: Object.keys(c.files || {}).length }))
49
+ .sort((a, b) => b.ts - a.ts);
50
+ }
51
+ /** Full commit (including file bodies), or null if missing. */
52
+ export async function getCommit(id) {
53
+ return (await idbGet(STORE, id)) ?? null;
54
+ }
55
+ /** Restore the working copy to a commit: write each snapshot file and delete any
56
+ * config file the commit didn't contain. Writes go through configWorkspace so the
57
+ * explorer/editor refresh via its onChange listeners. */
58
+ export async function restoreConfig(id) {
59
+ const commit = await getCommit(id);
60
+ if (!commit)
61
+ throw new Error(`Commit not found: ${id}`);
62
+ const target = new Set(Object.keys(commit.files));
63
+ // Never let an empty/corrupt snapshot wipe the working copy — restoring "nothing"
64
+ // would delete every config file and write none. Treat it as a no-op.
65
+ if (target.size === 0)
66
+ return;
67
+ const current = await idbKeys('config');
68
+ for (const k of current) {
69
+ if (k.endsWith(`/${KEEP}`) || k === KEEP)
70
+ continue;
71
+ if (!target.has(k))
72
+ await configWorkspace().remove(k);
73
+ }
74
+ for (const [path, content] of Object.entries(commit.files)) {
75
+ await configWorkspace().write(path, content);
76
+ }
77
+ }
78
+ /** Delete a commit from history (does not touch the working copy). */
79
+ export async function deleteCommit(id) {
80
+ await idbDelete(STORE, id);
81
+ }
82
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../prompts/history.ts"],"names":[],"mappings":"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"}