@nimblebrain/synapse 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 (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +248 -0
  3. package/dist/chunk-AW3YIXLE.cjs +248 -0
  4. package/dist/chunk-AW3YIXLE.cjs.map +1 -0
  5. package/dist/chunk-JZC3VC2C.js +349 -0
  6. package/dist/chunk-JZC3VC2C.js.map +1 -0
  7. package/dist/chunk-M4I222LB.js +243 -0
  8. package/dist/chunk-M4I222LB.js.map +1 -0
  9. package/dist/chunk-Q7OSHSGZ.cjs +351 -0
  10. package/dist/chunk-Q7OSHSGZ.cjs.map +1 -0
  11. package/dist/codegen/cli.cjs +85 -0
  12. package/dist/codegen/cli.cjs.map +1 -0
  13. package/dist/codegen/cli.d.cts +1 -0
  14. package/dist/codegen/cli.d.ts +1 -0
  15. package/dist/codegen/cli.js +83 -0
  16. package/dist/codegen/cli.js.map +1 -0
  17. package/dist/codegen/index.cjs +24 -0
  18. package/dist/codegen/index.cjs.map +1 -0
  19. package/dist/codegen/index.d.cts +24 -0
  20. package/dist/codegen/index.d.ts +24 -0
  21. package/dist/codegen/index.js +3 -0
  22. package/dist/codegen/index.js.map +1 -0
  23. package/dist/index.cjs +87 -0
  24. package/dist/index.cjs.map +1 -0
  25. package/dist/index.d.cts +26 -0
  26. package/dist/index.d.ts +26 -0
  27. package/dist/index.js +81 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/react/index.cjs +123 -0
  30. package/dist/react/index.cjs.map +1 -0
  31. package/dist/react/index.d.cts +30 -0
  32. package/dist/react/index.d.ts +30 -0
  33. package/dist/react/index.js +113 -0
  34. package/dist/react/index.js.map +1 -0
  35. package/dist/synapse-runtime.iife.global.js +1 -0
  36. package/dist/types-BP0SNrpo.d.cts +96 -0
  37. package/dist/types-BP0SNrpo.d.ts +96 -0
  38. package/dist/vite/index.cjs +49 -0
  39. package/dist/vite/index.cjs.map +1 -0
  40. package/dist/vite/index.d.cts +21 -0
  41. package/dist/vite/index.d.ts +21 -0
  42. package/dist/vite/index.js +47 -0
  43. package/dist/vite/index.js.map +1 -0
  44. package/package.json +89 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/codegen/writer.ts","../../src/codegen/cli.ts"],"names":[],"mappings":"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","file":"cli.js","sourcesContent":["import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\n/**\n * Write generated TypeScript to a file, creating parent directories as needed.\n */\nexport function writeOutput(content: string, outputPath: string): void {\n mkdirSync(dirname(outputPath), { recursive: true });\n writeFileSync(outputPath, content, \"utf-8\");\n}\n","#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { ToolDefinition } from \"../types.js\";\nimport { readFromManifest, readFromSchemaDir, readFromServer } from \"./schema-reader.js\";\nimport { generateTypes } from \"./type-generator.js\";\nimport { writeOutput } from \"./writer.js\";\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n\n // Strip \"codegen\" subcommand if present\n if (args[0] === \"codegen\") args.shift();\n\n const flags = parseFlags(args);\n\n if (!flags.fromManifest && !flags.fromServer && !flags.fromSchema) {\n console.error(\"Error: Specify a source with --from-manifest, --from-server, or --from-schema\");\n console.error(\"\");\n console.error(\"Usage:\");\n console.error(\n \" synapse codegen --from-manifest ./manifest.json [--out ./types.ts] [--app my-app]\",\n );\n console.error(\n \" synapse codegen --from-server http://localhost:3000/mcp [--out ./types.ts] [--app my-app]\",\n );\n console.error(\" synapse codegen --from-schema ./schemas/ [--out ./types.ts] [--app my-app]\");\n process.exit(1);\n }\n\n try {\n let tools: ToolDefinition[];\n let appName = flags.app;\n\n if (flags.fromManifest) {\n const manifestPath = resolve(flags.fromManifest);\n tools = readFromManifest(manifestPath);\n if (!appName) {\n const raw = JSON.parse(readFileSync(manifestPath, \"utf-8\"));\n appName = raw.name ?? \"app\";\n }\n } else if (flags.fromServer) {\n tools = await readFromServer(flags.fromServer);\n appName = appName ?? \"app\";\n } else {\n tools = readFromSchemaDir(resolve(flags.fromSchema as string));\n appName = appName ?? \"app\";\n }\n\n if (tools.length === 0) {\n console.error(\"Warning: No tools found in source\");\n }\n\n const output = generateTypes(tools, appName ?? \"app\");\n const outPath = resolve(flags.out ?? \"src/generated/types.ts\");\n writeOutput(output, outPath);\n\n console.log(`Generated ${tools.length} tool types -> ${outPath}`);\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n}\n\ninterface Flags {\n fromManifest?: string;\n fromServer?: string;\n fromSchema?: string;\n out?: string;\n app?: string;\n}\n\nfunction parseFlags(args: string[]): Flags {\n const flags: Flags = {};\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--from-manifest\":\n flags.fromManifest = args[++i];\n break;\n case \"--from-server\":\n flags.fromServer = args[++i];\n break;\n case \"--from-schema\":\n flags.fromSchema = args[++i];\n break;\n case \"--out\":\n flags.out = args[++i];\n break;\n case \"--app\":\n flags.app = args[++i];\n break;\n }\n }\n return flags;\n}\n\nmain();\n"]}
@@ -0,0 +1,24 @@
1
+ 'use strict';
2
+
3
+ var chunkAW3YIXLE_cjs = require('../chunk-AW3YIXLE.cjs');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "generateTypes", {
8
+ enumerable: true,
9
+ get: function () { return chunkAW3YIXLE_cjs.generateTypes; }
10
+ });
11
+ Object.defineProperty(exports, "readFromManifest", {
12
+ enumerable: true,
13
+ get: function () { return chunkAW3YIXLE_cjs.readFromManifest; }
14
+ });
15
+ Object.defineProperty(exports, "readFromSchemaDir", {
16
+ enumerable: true,
17
+ get: function () { return chunkAW3YIXLE_cjs.readFromSchemaDir; }
18
+ });
19
+ Object.defineProperty(exports, "readFromServer", {
20
+ enumerable: true,
21
+ get: function () { return chunkAW3YIXLE_cjs.readFromServer; }
22
+ });
23
+ //# sourceMappingURL=index.cjs.map
24
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
@@ -0,0 +1,24 @@
1
+ import { g as ToolDefinition } from '../types-BP0SNrpo.cjs';
2
+
3
+ /**
4
+ * Read tool definitions from a manifest.json file.
5
+ * Extracts tools from the MCP standard `tools` array.
6
+ */
7
+ declare function readFromManifest(manifestPath: string): ToolDefinition[];
8
+ /**
9
+ * Read tool definitions from a running MCP server via tools/list.
10
+ * Connects to the server's HTTP endpoint and calls the JSON-RPC method.
11
+ */
12
+ declare function readFromServer(url: string): Promise<ToolDefinition[]>;
13
+ /**
14
+ * Read entity schemas from a directory and generate CRUD tool definitions.
15
+ * Each .schema.json file becomes create/read/update/delete/list tools.
16
+ */
17
+ declare function readFromSchemaDir(dirPath: string): ToolDefinition[];
18
+
19
+ /**
20
+ * Generate TypeScript interfaces from tool definitions.
21
+ */
22
+ declare function generateTypes(tools: ToolDefinition[], appName: string): string;
23
+
24
+ export { ToolDefinition, generateTypes, readFromManifest, readFromSchemaDir, readFromServer };
@@ -0,0 +1,24 @@
1
+ import { g as ToolDefinition } from '../types-BP0SNrpo.js';
2
+
3
+ /**
4
+ * Read tool definitions from a manifest.json file.
5
+ * Extracts tools from the MCP standard `tools` array.
6
+ */
7
+ declare function readFromManifest(manifestPath: string): ToolDefinition[];
8
+ /**
9
+ * Read tool definitions from a running MCP server via tools/list.
10
+ * Connects to the server's HTTP endpoint and calls the JSON-RPC method.
11
+ */
12
+ declare function readFromServer(url: string): Promise<ToolDefinition[]>;
13
+ /**
14
+ * Read entity schemas from a directory and generate CRUD tool definitions.
15
+ * Each .schema.json file becomes create/read/update/delete/list tools.
16
+ */
17
+ declare function readFromSchemaDir(dirPath: string): ToolDefinition[];
18
+
19
+ /**
20
+ * Generate TypeScript interfaces from tool definitions.
21
+ */
22
+ declare function generateTypes(tools: ToolDefinition[], appName: string): string;
23
+
24
+ export { ToolDefinition, generateTypes, readFromManifest, readFromSchemaDir, readFromServer };
@@ -0,0 +1,3 @@
1
+ export { generateTypes, readFromManifest, readFromSchemaDir, readFromServer } from '../chunk-M4I222LB.js';
2
+ //# sourceMappingURL=index.js.map
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
package/dist/index.cjs ADDED
@@ -0,0 +1,87 @@
1
+ 'use strict';
2
+
3
+ var chunkQ7OSHSGZ_cjs = require('./chunk-Q7OSHSGZ.cjs');
4
+
5
+ // src/store.ts
6
+ function createStore(synapse, config) {
7
+ let state = structuredClone(config.initialState);
8
+ const subscribers = /* @__PURE__ */ new Set();
9
+ let destroyed = false;
10
+ let persistTimer = null;
11
+ const dispatch = {};
12
+ for (const key of Object.keys(config.actions)) {
13
+ dispatch[key] = (payload) => {
14
+ if (destroyed) return;
15
+ state = config.actions[key](state, payload);
16
+ notify();
17
+ };
18
+ }
19
+ function notify() {
20
+ for (const cb of subscribers) cb(state);
21
+ if (config.visibleToAgent) pushToAgent();
22
+ if (config.persist) schedulePersist();
23
+ }
24
+ function pushToAgent() {
25
+ const summary = config.summarize?.(state);
26
+ synapse.setVisibleState(state, summary);
27
+ }
28
+ function schedulePersist() {
29
+ if (persistTimer) clearTimeout(persistTimer);
30
+ persistTimer = setTimeout(() => {
31
+ synapse._request("ui/persistState", {
32
+ state,
33
+ version: config.version
34
+ }).catch(() => {
35
+ });
36
+ persistTimer = null;
37
+ }, 500);
38
+ }
39
+ let unsubStateLoaded;
40
+ if (config.persist) {
41
+ unsubStateLoaded = synapse._onMessage("ui/stateLoaded", (params) => {
42
+ if (!params?.state) return;
43
+ let loaded = params.state;
44
+ const loadedVersion = params.version ?? 1;
45
+ const currentVersion = config.version ?? 1;
46
+ if (config.migrations && loadedVersion < currentVersion) {
47
+ const startIdx = loadedVersion - 1;
48
+ for (let i = startIdx; i < config.migrations.length; i++) {
49
+ loaded = config.migrations[i](loaded);
50
+ }
51
+ }
52
+ store.hydrate(loaded);
53
+ });
54
+ }
55
+ const store = {
56
+ getState() {
57
+ return state;
58
+ },
59
+ subscribe(callback) {
60
+ subscribers.add(callback);
61
+ return () => {
62
+ subscribers.delete(callback);
63
+ };
64
+ },
65
+ dispatch,
66
+ hydrate(newState) {
67
+ state = newState;
68
+ for (const cb of subscribers) cb(state);
69
+ },
70
+ destroy() {
71
+ if (destroyed) return;
72
+ destroyed = true;
73
+ if (persistTimer) clearTimeout(persistTimer);
74
+ subscribers.clear();
75
+ unsubStateLoaded?.();
76
+ }
77
+ };
78
+ return store;
79
+ }
80
+
81
+ Object.defineProperty(exports, "createSynapse", {
82
+ enumerable: true,
83
+ get: function () { return chunkQ7OSHSGZ_cjs.createSynapse; }
84
+ });
85
+ exports.createStore = createStore;
86
+ //# sourceMappingURL=index.cjs.map
87
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/store.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ActionReducer, Store, StoreConfig, StoreDispatch, Synapse } from \"./types.js\";\n\n/**\n * Create a typed state store with optional persistence and agent visibility.\n *\n * - `persist: true` — state survives iframe reloads via host storage\n * - `visibleToAgent: true` — state is pushed to the LLM context\n * - Both are independent and can be enabled separately\n */\nexport function createStore<\n TState,\n TActions extends Record<string, ActionReducer<TState, any>> = Record<\n string,\n ActionReducer<TState, any>\n >,\n>(synapse: Synapse, config: StoreConfig<TState> & { actions: TActions }): Store<TState, TActions> {\n let state = structuredClone(config.initialState);\n const subscribers = new Set<(state: TState) => void>();\n let destroyed = false;\n let persistTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Build dispatch object from action reducers\n const dispatch = {} as StoreDispatch<TActions>;\n for (const key of Object.keys(config.actions)) {\n (dispatch as any)[key] = (payload: unknown) => {\n if (destroyed) return;\n state = config.actions[key](state, payload);\n notify();\n };\n }\n\n function notify(): void {\n for (const cb of subscribers) cb(state);\n if (config.visibleToAgent) pushToAgent();\n if (config.persist) schedulePersist();\n }\n\n function pushToAgent(): void {\n const summary = config.summarize?.(state);\n synapse.setVisibleState(state as unknown as Record<string, unknown>, summary);\n }\n\n function schedulePersist(): void {\n if (persistTimer) clearTimeout(persistTimer);\n persistTimer = setTimeout(() => {\n synapse\n ._request(\"ui/persistState\", {\n state: state as unknown as Record<string, unknown>,\n version: config.version,\n })\n .catch(() => {\n // Silently ignore persist failures (host may not support it)\n });\n persistTimer = null;\n }, 500);\n }\n\n // Listen for state loaded from host (on init)\n let unsubStateLoaded: (() => void) | undefined;\n if (config.persist) {\n unsubStateLoaded = synapse._onMessage(\"ui/stateLoaded\", (params) => {\n if (!params?.state) return;\n let loaded = params.state as TState;\n const loadedVersion = (params.version as number) ?? 1;\n const currentVersion = config.version ?? 1;\n\n // Run migrations if needed\n if (config.migrations && loadedVersion < currentVersion) {\n const startIdx = loadedVersion - 1;\n for (let i = startIdx; i < config.migrations.length; i++) {\n loaded = config.migrations[i](loaded);\n }\n }\n\n store.hydrate(loaded);\n });\n }\n\n const store: Store<TState, TActions> = {\n getState(): TState {\n return state;\n },\n\n subscribe(callback: (state: TState) => void): () => void {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n },\n\n dispatch,\n\n hydrate(newState: TState): void {\n state = newState;\n for (const cb of subscribers) cb(state);\n },\n\n destroy(): void {\n if (destroyed) return;\n destroyed = true;\n if (persistTimer) clearTimeout(persistTimer);\n subscribers.clear();\n unsubStateLoaded?.();\n },\n };\n\n return store;\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import { S as SynapseOptions, a as Synapse, A as ActionReducer, b as StoreConfig, c as Store } from './types-BP0SNrpo.cjs';
2
+ export { D as DataChangedEvent, H as HostInfo, K as KeyForwardConfig, d as StateAcknowledgement, e as StoreDispatch, f as SynapseTheme, T as ToolCallResult, g as ToolDefinition, V as VisibleState } from './types-BP0SNrpo.cjs';
3
+
4
+ /**
5
+ * Create a Synapse instance.
6
+ *
7
+ * Wraps the ext-apps protocol handshake via `SynapseTransport` and provides
8
+ * a typed, framework-agnostic API for calling tools, reacting to data changes,
9
+ * dispatching actions, and pushing LLM-visible state.
10
+ *
11
+ * In non-NimbleBrain hosts, NB-specific methods degrade to no-ops.
12
+ */
13
+ declare function createSynapse(options: SynapseOptions): Synapse;
14
+
15
+ /**
16
+ * Create a typed state store with optional persistence and agent visibility.
17
+ *
18
+ * - `persist: true` — state survives iframe reloads via host storage
19
+ * - `visibleToAgent: true` — state is pushed to the LLM context
20
+ * - Both are independent and can be enabled separately
21
+ */
22
+ declare function createStore<TState, TActions extends Record<string, ActionReducer<TState, any>> = Record<string, ActionReducer<TState, any>>>(synapse: Synapse, config: StoreConfig<TState> & {
23
+ actions: TActions;
24
+ }): Store<TState, TActions>;
25
+
26
+ export { ActionReducer, Store, StoreConfig, Synapse, SynapseOptions, createStore, createSynapse };
@@ -0,0 +1,26 @@
1
+ import { S as SynapseOptions, a as Synapse, A as ActionReducer, b as StoreConfig, c as Store } from './types-BP0SNrpo.js';
2
+ export { D as DataChangedEvent, H as HostInfo, K as KeyForwardConfig, d as StateAcknowledgement, e as StoreDispatch, f as SynapseTheme, T as ToolCallResult, g as ToolDefinition, V as VisibleState } from './types-BP0SNrpo.js';
3
+
4
+ /**
5
+ * Create a Synapse instance.
6
+ *
7
+ * Wraps the ext-apps protocol handshake via `SynapseTransport` and provides
8
+ * a typed, framework-agnostic API for calling tools, reacting to data changes,
9
+ * dispatching actions, and pushing LLM-visible state.
10
+ *
11
+ * In non-NimbleBrain hosts, NB-specific methods degrade to no-ops.
12
+ */
13
+ declare function createSynapse(options: SynapseOptions): Synapse;
14
+
15
+ /**
16
+ * Create a typed state store with optional persistence and agent visibility.
17
+ *
18
+ * - `persist: true` — state survives iframe reloads via host storage
19
+ * - `visibleToAgent: true` — state is pushed to the LLM context
20
+ * - Both are independent and can be enabled separately
21
+ */
22
+ declare function createStore<TState, TActions extends Record<string, ActionReducer<TState, any>> = Record<string, ActionReducer<TState, any>>>(synapse: Synapse, config: StoreConfig<TState> & {
23
+ actions: TActions;
24
+ }): Store<TState, TActions>;
25
+
26
+ export { ActionReducer, Store, StoreConfig, Synapse, SynapseOptions, createStore, createSynapse };
package/dist/index.js ADDED
@@ -0,0 +1,81 @@
1
+ export { createSynapse } from './chunk-JZC3VC2C.js';
2
+
3
+ // src/store.ts
4
+ function createStore(synapse, config) {
5
+ let state = structuredClone(config.initialState);
6
+ const subscribers = /* @__PURE__ */ new Set();
7
+ let destroyed = false;
8
+ let persistTimer = null;
9
+ const dispatch = {};
10
+ for (const key of Object.keys(config.actions)) {
11
+ dispatch[key] = (payload) => {
12
+ if (destroyed) return;
13
+ state = config.actions[key](state, payload);
14
+ notify();
15
+ };
16
+ }
17
+ function notify() {
18
+ for (const cb of subscribers) cb(state);
19
+ if (config.visibleToAgent) pushToAgent();
20
+ if (config.persist) schedulePersist();
21
+ }
22
+ function pushToAgent() {
23
+ const summary = config.summarize?.(state);
24
+ synapse.setVisibleState(state, summary);
25
+ }
26
+ function schedulePersist() {
27
+ if (persistTimer) clearTimeout(persistTimer);
28
+ persistTimer = setTimeout(() => {
29
+ synapse._request("ui/persistState", {
30
+ state,
31
+ version: config.version
32
+ }).catch(() => {
33
+ });
34
+ persistTimer = null;
35
+ }, 500);
36
+ }
37
+ let unsubStateLoaded;
38
+ if (config.persist) {
39
+ unsubStateLoaded = synapse._onMessage("ui/stateLoaded", (params) => {
40
+ if (!params?.state) return;
41
+ let loaded = params.state;
42
+ const loadedVersion = params.version ?? 1;
43
+ const currentVersion = config.version ?? 1;
44
+ if (config.migrations && loadedVersion < currentVersion) {
45
+ const startIdx = loadedVersion - 1;
46
+ for (let i = startIdx; i < config.migrations.length; i++) {
47
+ loaded = config.migrations[i](loaded);
48
+ }
49
+ }
50
+ store.hydrate(loaded);
51
+ });
52
+ }
53
+ const store = {
54
+ getState() {
55
+ return state;
56
+ },
57
+ subscribe(callback) {
58
+ subscribers.add(callback);
59
+ return () => {
60
+ subscribers.delete(callback);
61
+ };
62
+ },
63
+ dispatch,
64
+ hydrate(newState) {
65
+ state = newState;
66
+ for (const cb of subscribers) cb(state);
67
+ },
68
+ destroy() {
69
+ if (destroyed) return;
70
+ destroyed = true;
71
+ if (persistTimer) clearTimeout(persistTimer);
72
+ subscribers.clear();
73
+ unsubStateLoaded?.();
74
+ }
75
+ };
76
+ return store;
77
+ }
78
+
79
+ export { createStore };
80
+ //# sourceMappingURL=index.js.map
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/store.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ActionReducer, Store, StoreConfig, StoreDispatch, Synapse } from \"./types.js\";\n\n/**\n * Create a typed state store with optional persistence and agent visibility.\n *\n * - `persist: true` — state survives iframe reloads via host storage\n * - `visibleToAgent: true` — state is pushed to the LLM context\n * - Both are independent and can be enabled separately\n */\nexport function createStore<\n TState,\n TActions extends Record<string, ActionReducer<TState, any>> = Record<\n string,\n ActionReducer<TState, any>\n >,\n>(synapse: Synapse, config: StoreConfig<TState> & { actions: TActions }): Store<TState, TActions> {\n let state = structuredClone(config.initialState);\n const subscribers = new Set<(state: TState) => void>();\n let destroyed = false;\n let persistTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Build dispatch object from action reducers\n const dispatch = {} as StoreDispatch<TActions>;\n for (const key of Object.keys(config.actions)) {\n (dispatch as any)[key] = (payload: unknown) => {\n if (destroyed) return;\n state = config.actions[key](state, payload);\n notify();\n };\n }\n\n function notify(): void {\n for (const cb of subscribers) cb(state);\n if (config.visibleToAgent) pushToAgent();\n if (config.persist) schedulePersist();\n }\n\n function pushToAgent(): void {\n const summary = config.summarize?.(state);\n synapse.setVisibleState(state as unknown as Record<string, unknown>, summary);\n }\n\n function schedulePersist(): void {\n if (persistTimer) clearTimeout(persistTimer);\n persistTimer = setTimeout(() => {\n synapse\n ._request(\"ui/persistState\", {\n state: state as unknown as Record<string, unknown>,\n version: config.version,\n })\n .catch(() => {\n // Silently ignore persist failures (host may not support it)\n });\n persistTimer = null;\n }, 500);\n }\n\n // Listen for state loaded from host (on init)\n let unsubStateLoaded: (() => void) | undefined;\n if (config.persist) {\n unsubStateLoaded = synapse._onMessage(\"ui/stateLoaded\", (params) => {\n if (!params?.state) return;\n let loaded = params.state as TState;\n const loadedVersion = (params.version as number) ?? 1;\n const currentVersion = config.version ?? 1;\n\n // Run migrations if needed\n if (config.migrations && loadedVersion < currentVersion) {\n const startIdx = loadedVersion - 1;\n for (let i = startIdx; i < config.migrations.length; i++) {\n loaded = config.migrations[i](loaded);\n }\n }\n\n store.hydrate(loaded);\n });\n }\n\n const store: Store<TState, TActions> = {\n getState(): TState {\n return state;\n },\n\n subscribe(callback: (state: TState) => void): () => void {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n },\n\n dispatch,\n\n hydrate(newState: TState): void {\n state = newState;\n for (const cb of subscribers) cb(state);\n },\n\n destroy(): void {\n if (destroyed) return;\n destroyed = true;\n if (persistTimer) clearTimeout(persistTimer);\n subscribers.clear();\n unsubStateLoaded?.();\n },\n };\n\n return store;\n}\n"]}
@@ -0,0 +1,123 @@
1
+ 'use strict';
2
+
3
+ var chunkQ7OSHSGZ_cjs = require('../chunk-Q7OSHSGZ.cjs');
4
+ var react = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ var SynapseContext = react.createContext(null);
8
+ function SynapseProvider({ children, ...options }) {
9
+ const ref = react.useRef(null);
10
+ if (ref.current === null) {
11
+ ref.current = chunkQ7OSHSGZ_cjs.createSynapse(options);
12
+ }
13
+ react.useEffect(() => {
14
+ return () => {
15
+ ref.current?.destroy();
16
+ ref.current = null;
17
+ };
18
+ }, []);
19
+ return /* @__PURE__ */ jsxRuntime.jsx(SynapseContext.Provider, { value: ref.current, children });
20
+ }
21
+ function useSynapseContext() {
22
+ const ctx = react.useContext(SynapseContext);
23
+ if (!ctx) {
24
+ throw new Error(
25
+ "useSynapse must be used within a <SynapseProvider>. Wrap your app component tree with <SynapseProvider>."
26
+ );
27
+ }
28
+ return ctx;
29
+ }
30
+
31
+ // src/react/hooks.ts
32
+ function useSynapse() {
33
+ return useSynapseContext();
34
+ }
35
+ function useCallTool(toolName) {
36
+ const synapse = useSynapseContext();
37
+ const [isPending, setIsPending] = react.useState(false);
38
+ const [error, setError] = react.useState(null);
39
+ const [data, setData] = react.useState(null);
40
+ const callIdRef = react.useRef(0);
41
+ const call = react.useCallback(
42
+ async (args) => {
43
+ const id = ++callIdRef.current;
44
+ setIsPending(true);
45
+ setError(null);
46
+ try {
47
+ const result = await synapse.callTool(toolName, args);
48
+ if (id === callIdRef.current) {
49
+ setData(result.data);
50
+ setIsPending(false);
51
+ }
52
+ return result;
53
+ } catch (err) {
54
+ if (id === callIdRef.current) {
55
+ const e = err instanceof Error ? err : new Error(String(err));
56
+ setError(e);
57
+ setIsPending(false);
58
+ }
59
+ throw err;
60
+ }
61
+ },
62
+ [synapse, toolName]
63
+ );
64
+ return { call, isPending, error, data };
65
+ }
66
+ function useDataSync(callback) {
67
+ const synapse = useSynapseContext();
68
+ const callbackRef = react.useRef(callback);
69
+ callbackRef.current = callback;
70
+ react.useEffect(() => {
71
+ return synapse.onDataChanged((event) => callbackRef.current(event));
72
+ }, [synapse]);
73
+ }
74
+ function useTheme() {
75
+ const synapse = useSynapseContext();
76
+ const [theme, setTheme] = react.useState(() => synapse.getTheme());
77
+ react.useEffect(() => {
78
+ setTheme(synapse.getTheme());
79
+ return synapse.onThemeChanged(setTheme);
80
+ }, [synapse]);
81
+ return theme;
82
+ }
83
+ function useAction() {
84
+ const synapse = useSynapseContext();
85
+ return react.useCallback(
86
+ (action, params) => synapse.action(action, params),
87
+ [synapse]
88
+ );
89
+ }
90
+ function useChat() {
91
+ const synapse = useSynapseContext();
92
+ return react.useCallback(
93
+ (message, context) => synapse.chat(message, context),
94
+ [synapse]
95
+ );
96
+ }
97
+ function useVisibleState() {
98
+ const synapse = useSynapseContext();
99
+ return react.useCallback(
100
+ (state, summary) => synapse.setVisibleState(state, summary),
101
+ [synapse]
102
+ );
103
+ }
104
+ function useStore(store) {
105
+ const state = react.useSyncExternalStore(
106
+ (onStoreChange) => store.subscribe(onStoreChange),
107
+ () => store.getState(),
108
+ () => store.getState()
109
+ );
110
+ return { state, dispatch: store.dispatch };
111
+ }
112
+
113
+ exports.SynapseProvider = SynapseProvider;
114
+ exports.useAction = useAction;
115
+ exports.useCallTool = useCallTool;
116
+ exports.useChat = useChat;
117
+ exports.useDataSync = useDataSync;
118
+ exports.useStore = useStore;
119
+ exports.useSynapse = useSynapse;
120
+ exports.useTheme = useTheme;
121
+ exports.useVisibleState = useVisibleState;
122
+ //# sourceMappingURL=index.cjs.map
123
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/provider.tsx","../../src/react/hooks.ts"],"names":["createContext","useRef","createSynapse","useEffect","useContext","useState","useCallback","useSyncExternalStore"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, type ReactNode, useContext, useEffect, useRef } from \"react\";\nimport { createSynapse } from \"../core.js\";\nimport type { Synapse, SynapseOptions } from \"../types.js\";\n\nconst SynapseContext = createContext<Synapse | null>(null);\n\nexport interface SynapseProviderProps extends SynapseOptions {\n children: ReactNode;\n}\n\nexport function SynapseProvider({ children, ...options }: SynapseProviderProps) {\n const ref = useRef<Synapse | null>(null);\n\n if (ref.current === null) {\n ref.current = createSynapse(options);\n }\n\n useEffect(() => {\n // StrictMode: on double-mount, the ref may already have an instance.\n // The ref was created synchronously above, so it's always valid here.\n return () => {\n ref.current?.destroy();\n ref.current = null;\n };\n }, []);\n\n return <SynapseContext.Provider value={ref.current}>{children}</SynapseContext.Provider>;\n}\n\nexport function useSynapseContext(): Synapse {\n const ctx = useContext(SynapseContext);\n if (!ctx) {\n throw new Error(\n \"useSynapse must be used within a <SynapseProvider>. \" +\n \"Wrap your app component tree with <SynapseProvider>.\",\n );\n }\n return ctx;\n}\n","import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport type {\n ActionReducer,\n DataChangedEvent,\n Store,\n StoreDispatch,\n Synapse,\n SynapseTheme,\n ToolCallResult,\n} from \"../types.js\";\nimport { SynapseProvider, useSynapseContext } from \"./provider.js\";\n\n// Re-export provider components\nexport { SynapseProvider };\n\nexport function useSynapse(): Synapse {\n return useSynapseContext();\n}\n\nexport function useCallTool<TOutput = unknown>(\n toolName: string,\n): {\n call: (args?: Record<string, unknown>) => Promise<ToolCallResult<TOutput>>;\n isPending: boolean;\n error: Error | null;\n data: TOutput | null;\n} {\n const synapse = useSynapseContext();\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<TOutput | null>(null);\n const callIdRef = useRef(0);\n\n const call = useCallback(\n async (args?: Record<string, unknown>): Promise<ToolCallResult<TOutput>> => {\n const id = ++callIdRef.current;\n setIsPending(true);\n setError(null);\n\n try {\n const result = await synapse.callTool<Record<string, unknown>, TOutput>(toolName, args);\n // Stale guard: only update if this is still the latest call\n if (id === callIdRef.current) {\n setData(result.data);\n setIsPending(false);\n }\n return result;\n } catch (err) {\n if (id === callIdRef.current) {\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n setIsPending(false);\n }\n throw err;\n }\n },\n [synapse, toolName],\n );\n\n return { call, isPending, error, data };\n}\n\nexport function useDataSync(callback: (event: DataChangedEvent) => void): void {\n const synapse = useSynapseContext();\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n return synapse.onDataChanged((event) => callbackRef.current(event));\n }, [synapse]);\n}\n\nexport function useTheme(): SynapseTheme {\n const synapse = useSynapseContext();\n const [theme, setTheme] = useState<SynapseTheme>(() => synapse.getTheme());\n\n useEffect(() => {\n // Sync in case theme changed between render and effect\n setTheme(synapse.getTheme());\n return synapse.onThemeChanged(setTheme);\n }, [synapse]);\n\n return theme;\n}\n\nexport function useAction(): (action: string, params?: Record<string, unknown>) => void {\n const synapse = useSynapseContext();\n return useCallback(\n (action: string, params?: Record<string, unknown>) => synapse.action(action, params),\n [synapse],\n );\n}\n\nexport function useChat(): (\n message: string,\n context?: { action?: string; entity?: string },\n) => void {\n const synapse = useSynapseContext();\n return useCallback(\n (message: string, context?: { action?: string; entity?: string }) =>\n synapse.chat(message, context),\n [synapse],\n );\n}\n\nexport function useVisibleState(): (state: Record<string, unknown>, summary?: string) => void {\n const synapse = useSynapseContext();\n return useCallback(\n (state: Record<string, unknown>, summary?: string) => synapse.setVisibleState(state, summary),\n [synapse],\n );\n}\n\nexport function useStore<TState, TActions extends Record<string, ActionReducer<TState, any>>>(\n store: Store<TState, TActions>,\n): {\n state: TState;\n dispatch: StoreDispatch<TActions>;\n} {\n const state = useSyncExternalStore(\n (onStoreChange) => store.subscribe(onStoreChange),\n () => store.getState(),\n () => store.getState(),\n );\n\n return { state, dispatch: store.dispatch };\n}\n"]}
@@ -0,0 +1,30 @@
1
+ import { S as SynapseOptions, T as ToolCallResult, D as DataChangedEvent, A as ActionReducer, c as Store, e as StoreDispatch, a as Synapse, f as SynapseTheme } from '../types-BP0SNrpo.cjs';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import { ReactNode } from 'react';
4
+
5
+ interface SynapseProviderProps extends SynapseOptions {
6
+ children: ReactNode;
7
+ }
8
+ declare function SynapseProvider({ children, ...options }: SynapseProviderProps): react_jsx_runtime.JSX.Element;
9
+
10
+ declare function useSynapse(): Synapse;
11
+ declare function useCallTool<TOutput = unknown>(toolName: string): {
12
+ call: (args?: Record<string, unknown>) => Promise<ToolCallResult<TOutput>>;
13
+ isPending: boolean;
14
+ error: Error | null;
15
+ data: TOutput | null;
16
+ };
17
+ declare function useDataSync(callback: (event: DataChangedEvent) => void): void;
18
+ declare function useTheme(): SynapseTheme;
19
+ declare function useAction(): (action: string, params?: Record<string, unknown>) => void;
20
+ declare function useChat(): (message: string, context?: {
21
+ action?: string;
22
+ entity?: string;
23
+ }) => void;
24
+ declare function useVisibleState(): (state: Record<string, unknown>, summary?: string) => void;
25
+ declare function useStore<TState, TActions extends Record<string, ActionReducer<TState, any>>>(store: Store<TState, TActions>): {
26
+ state: TState;
27
+ dispatch: StoreDispatch<TActions>;
28
+ };
29
+
30
+ export { SynapseProvider, type SynapseProviderProps, useAction, useCallTool, useChat, useDataSync, useStore, useSynapse, useTheme, useVisibleState };
@@ -0,0 +1,30 @@
1
+ import { S as SynapseOptions, T as ToolCallResult, D as DataChangedEvent, A as ActionReducer, c as Store, e as StoreDispatch, a as Synapse, f as SynapseTheme } from '../types-BP0SNrpo.js';
2
+ import * as react_jsx_runtime from 'react/jsx-runtime';
3
+ import { ReactNode } from 'react';
4
+
5
+ interface SynapseProviderProps extends SynapseOptions {
6
+ children: ReactNode;
7
+ }
8
+ declare function SynapseProvider({ children, ...options }: SynapseProviderProps): react_jsx_runtime.JSX.Element;
9
+
10
+ declare function useSynapse(): Synapse;
11
+ declare function useCallTool<TOutput = unknown>(toolName: string): {
12
+ call: (args?: Record<string, unknown>) => Promise<ToolCallResult<TOutput>>;
13
+ isPending: boolean;
14
+ error: Error | null;
15
+ data: TOutput | null;
16
+ };
17
+ declare function useDataSync(callback: (event: DataChangedEvent) => void): void;
18
+ declare function useTheme(): SynapseTheme;
19
+ declare function useAction(): (action: string, params?: Record<string, unknown>) => void;
20
+ declare function useChat(): (message: string, context?: {
21
+ action?: string;
22
+ entity?: string;
23
+ }) => void;
24
+ declare function useVisibleState(): (state: Record<string, unknown>, summary?: string) => void;
25
+ declare function useStore<TState, TActions extends Record<string, ActionReducer<TState, any>>>(store: Store<TState, TActions>): {
26
+ state: TState;
27
+ dispatch: StoreDispatch<TActions>;
28
+ };
29
+
30
+ export { SynapseProvider, type SynapseProviderProps, useAction, useCallTool, useChat, useDataSync, useStore, useSynapse, useTheme, useVisibleState };