trellis 3.1.35 → 3.2.2
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.
- package/CHANGELOG.md +23 -5
- package/README.md +63 -156
- package/bin/trellis.mjs +2 -75
- package/dist/{better-sqlite-backend-ahx5p0br.js → better-sqlite-backend-2P4F6AOJ.js} +91 -29
- package/dist/boot-middleware-MHLHFCUC.js +9 -0
- package/dist/browser/index.d.ts +18 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +95 -0
- package/dist/{index-53f3b8p8.js → chunk-2W3MHTMG.js} +552 -213
- package/dist/chunk-44FFQKQX.js +142 -0
- package/dist/chunk-4HYPLFJD.js +150 -0
- package/dist/chunk-4XIVMVHC.js +361 -0
- package/dist/{index-yp88he8n.js → chunk-6CTA6MCE.js} +88 -64
- package/dist/chunk-6GEZ6DN5.js +394 -0
- package/dist/chunk-7ZFRVCUE.js +211 -0
- package/dist/chunk-CAG4FULI.js +121 -0
- package/dist/chunk-FF36CQHZ.js +61 -0
- package/dist/{index-h32txmxe.js → chunk-FKQO5A3H.js} +6 -13
- package/dist/{index-nq520y6k.js → chunk-FWRS4CSC.js} +46 -32
- package/dist/chunk-GFZCJ4EH.js +108 -0
- package/dist/chunk-GLM4HGN4.js +55 -0
- package/dist/{index-4cdr7x2x.js → chunk-GU374KWZ.js} +182 -111
- package/dist/chunk-H6JB3PZ3.js +45 -0
- package/dist/chunk-IZX2PLIB.js +1240 -0
- package/dist/chunk-J2TXUFCZ.js +289 -0
- package/dist/chunk-J3WYZO3Q.js +211 -0
- package/dist/{index-xzym9w0m.js → chunk-JA7AIHRK.js} +12 -7
- package/dist/chunk-JHHEXEDM.js +162 -0
- package/dist/chunk-JUEMDWLU.js +233 -0
- package/dist/chunk-KFQGP6VL.js +33 -0
- package/dist/chunk-KIJITUZB.js +419 -0
- package/dist/{index-4wxa8xz4.js → chunk-KQ4A2D2P.js} +162 -23
- package/dist/chunk-KSU2GW22.js +958 -0
- package/dist/{index-rv1p47gp.js → chunk-L5N5PR2S.js} +3015 -2480
- package/dist/{index-h9e2efx4.js → chunk-LNUIGRDZ.js} +71 -55
- package/dist/{index-skhn0agf.js → chunk-MLC5BUYO.js} +19 -20
- package/dist/chunk-MPXUVGT3.js +104 -0
- package/dist/chunk-N6MYZT4O.js +68 -0
- package/dist/chunk-O2AV5WMN.js +48 -0
- package/dist/chunk-PZ4XYZ4J.js +143 -0
- package/dist/chunk-QB5ISE47.js +419 -0
- package/dist/chunk-RSWUFTO2.js +857 -0
- package/dist/chunk-S3XLFZ27.js +1095 -0
- package/dist/{index-w5wccer3.js → chunk-S6GBJ2ZB.js} +28 -12
- package/dist/{index-7pjz3tsy.js → chunk-SGMDTWJJ.js} +57 -15
- package/dist/chunk-SPSPV5BC.js +390 -0
- package/dist/chunk-TCKXSOBP.js +123 -0
- package/dist/chunk-UBGUDMUV.js +59 -0
- package/dist/{index-wt8rz4gn.js → chunk-UQISRW6T.js} +97 -26
- package/dist/chunk-USEINYUL.js +12 -0
- package/dist/{index-bmyt7k8n.js → chunk-UZRUP7QW.js} +12 -4
- package/dist/{index-xhcp6xrn.js → chunk-VBYUTRXX.js} +695 -514
- package/dist/{index-vkpkfwhq.js → chunk-VDAKEOML.js} +234 -194
- package/dist/chunk-WXSWA3MV.js +0 -0
- package/dist/{index-n9f2qyh5.js → chunk-X5FLTRUB.js} +55 -33
- package/dist/{index-h7zxhhhh.js → chunk-XMQ7G77X.js} +46 -38
- package/dist/{index-w7ng765c.js → chunk-YCM7ZYEZ.js} +102 -49
- package/dist/cli/deploy-cli.d.ts +18 -0
- package/dist/cli/deploy-cli.d.ts.map +1 -0
- package/dist/cli/errors.d.ts +6 -0
- package/dist/cli/errors.d.ts.map +1 -0
- package/dist/cli/examples.d.ts +23 -0
- package/dist/cli/examples.d.ts.map +1 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2426 -6225
- package/dist/client/index.browser.d.ts +29 -0
- package/dist/client/index.browser.d.ts.map +1 -0
- package/dist/client/index.browser.js +64 -0
- package/dist/client/index.d.ts +6 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +41 -21
- package/dist/client/live.d.ts +67 -0
- package/dist/client/live.d.ts.map +1 -0
- package/dist/client/reactive.d.ts +31 -0
- package/dist/client/reactive.d.ts.map +1 -0
- package/dist/client/sdk.browser.d.ts +104 -0
- package/dist/client/sdk.browser.d.ts.map +1 -0
- package/dist/client/sdk.browser.js +9 -0
- package/dist/client/sdk.d.ts +26 -2
- package/dist/client/sdk.d.ts.map +1 -1
- package/dist/client/sdk.js +9 -0
- package/dist/client/vcs-client.d.ts +129 -0
- package/dist/client/vcs-client.d.ts.map +1 -0
- package/dist/cms/index.js +171 -163
- package/dist/{config-8hczw0rs.js → config-PFTP67TR.js} +8 -9
- package/dist/core/computation/index.d.ts +5 -0
- package/dist/core/computation/index.d.ts.map +1 -0
- package/dist/core/computation/rollup.d.ts +18 -0
- package/dist/core/computation/rollup.d.ts.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +171 -104
- package/dist/core/kernel/boot-middleware.d.ts +10 -0
- package/dist/core/kernel/boot-middleware.d.ts.map +1 -0
- package/dist/core/kernel/logic-middleware.d.ts +7 -1
- package/dist/core/kernel/logic-middleware.d.ts.map +1 -1
- package/dist/core/kernel/trellis-kernel.d.ts.map +1 -1
- package/dist/core/ontology/types.d.ts +5 -0
- package/dist/core/ontology/types.d.ts.map +1 -1
- package/dist/core/persist/better-sqlite-backend.d.ts +9 -2
- package/dist/core/persist/better-sqlite-backend.d.ts.map +1 -1
- package/dist/core/persist/factory.d.ts +6 -7
- package/dist/core/persist/factory.d.ts.map +1 -1
- package/dist/core/persist/factory.js +2 -3
- package/dist/core/persist/sqljs-backend.js +2 -3
- package/dist/db/index.d.ts +4 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +67 -54
- package/dist/db/inspector.js +11 -19
- package/dist/db/trellis.css +1 -1
- package/dist/decisions/index.js +9 -10
- package/dist/deploy-LQ7GUGJ5.js +9 -0
- package/dist/deploy-YNVG5E4E.js +9 -0
- package/dist/deploy-cli-24BCHAXY.js +67 -0
- package/dist/deploy-cli-C35HTITO.js +67 -0
- package/dist/embeddings/auto-embed.d.ts +2 -2
- package/dist/embeddings/auto-embed.d.ts.map +1 -1
- package/dist/embeddings/index.js +20 -22
- package/dist/embeddings/search.d.ts +2 -1
- package/dist/embeddings/search.d.ts.map +1 -1
- package/dist/embeddings/store.d.ts +25 -4
- package/dist/embeddings/store.d.ts.map +1 -1
- package/dist/engine.d.ts +59 -19
- package/dist/engine.d.ts.map +1 -1
- package/dist/import-UZEKXU3B.js +10 -0
- package/dist/index.js +102 -93
- package/dist/launch-explorer-HZ4ZJA4X.js +95 -0
- package/dist/links/index.js +24 -26
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/plugins/agent-memory/index.js +316 -0
- package/dist/plugins/idea-garden/index.js +165 -0
- package/dist/plugins/plan-approval/index.js +579 -0
- package/dist/plugins/proactive-watcher/index.js +194 -0
- package/dist/{index-2r4jxwnb.js → query-XYLTJYSA.js} +14 -15
- package/dist/react/index.js +39 -70
- package/dist/react/realtime.js +11 -0
- package/dist/react/schema-hooks.js +87 -0
- package/dist/realtime/broadcast-channel-transport.d.ts +43 -0
- package/dist/realtime/broadcast-channel-transport.d.ts.map +1 -0
- package/dist/realtime/durable-object-relay-transport.d.ts +96 -0
- package/dist/realtime/durable-object-relay-transport.d.ts.map +1 -0
- package/dist/realtime/index.d.ts +44 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +40 -0
- package/dist/realtime/memory-hub.d.ts +32 -0
- package/dist/realtime/memory-hub.d.ts.map +1 -0
- package/dist/realtime/persistent-channel.d.ts +105 -0
- package/dist/realtime/persistent-channel.d.ts.map +1 -0
- package/dist/realtime/presence.d.ts +73 -0
- package/dist/realtime/presence.d.ts.map +1 -0
- package/dist/realtime/relay-persistence.d.ts +37 -0
- package/dist/realtime/relay-persistence.d.ts.map +1 -0
- package/dist/realtime/relay-persistence.js +107 -0
- package/dist/realtime/relay-server.d.ts +103 -0
- package/dist/realtime/relay-server.d.ts.map +1 -0
- package/dist/realtime/room.d.ts +98 -0
- package/dist/realtime/room.d.ts.map +1 -0
- package/dist/realtime/text.d.ts +73 -0
- package/dist/realtime/text.d.ts.map +1 -0
- package/dist/realtime/types.d.ts +89 -0
- package/dist/realtime/types.d.ts.map +1 -0
- package/dist/realtime/websocket-relay-transport.d.ts +28 -0
- package/dist/realtime/websocket-relay-transport.d.ts.map +1 -0
- package/dist/realtime.bundle.js +1100 -0
- package/dist/{remote-manager-xvbg4230.js → remote-manager-ODE3T2KR.js} +25 -15
- package/dist/scaffold/seed.d.ts.map +1 -1
- package/dist/scaffold/write.d.ts +1 -1
- package/dist/scaffold/write.d.ts.map +1 -1
- package/dist/schema/define.d.ts +137 -0
- package/dist/schema/define.d.ts.map +1 -0
- package/dist/schema/entity-projection.d.ts +34 -0
- package/dist/schema/entity-projection.d.ts.map +1 -0
- package/dist/schema/eql.d.ts +46 -0
- package/dist/schema/eql.d.ts.map +1 -0
- package/dist/schema/index.d.ts +21 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +46 -0
- package/dist/schema/kernel-resolve.d.ts +21 -0
- package/dist/schema/kernel-resolve.d.ts.map +1 -0
- package/dist/schema/mutations.d.ts +20 -0
- package/dist/schema/mutations.d.ts.map +1 -0
- package/dist/schema/resolve.d.ts +21 -0
- package/dist/schema/resolve.d.ts.map +1 -0
- package/dist/server/deploy-meta.d.ts +25 -0
- package/dist/server/deploy-meta.d.ts.map +1 -0
- package/dist/server/deploy.d.ts +7 -2
- package/dist/server/deploy.d.ts.map +1 -1
- package/dist/server/index.d.ts +7 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +100 -58
- package/dist/server/node-adapter.js +5 -104
- package/dist/server/realtime.d.ts +14 -3
- package/dist/server/realtime.d.ts.map +1 -1
- package/dist/server/server.d.ts +8 -16
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/sprites.d.ts +18 -1
- package/dist/server/sprites.d.ts.map +1 -1
- package/dist/server/tenancy.d.ts +4 -0
- package/dist/server/tenancy.d.ts.map +1 -1
- package/dist/server/usage-meter.d.ts +53 -0
- package/dist/server/usage-meter.d.ts.map +1 -0
- package/dist/server-MB3OPSPI.js +18 -0
- package/dist/server-ZVWGLLRF.js +18 -0
- package/dist/sprites-KQGTGM6W.js +27 -0
- package/dist/{sprites-vc4qbrp1.js → sprites-RU3E4XQN.js} +6 -7
- package/dist/svelte/index.d.ts +17 -0
- package/dist/svelte/index.d.ts.map +1 -0
- package/dist/svelte/index.js +51 -0
- package/dist/svelte/schema-hooks.d.ts +45 -0
- package/dist/svelte/schema-hooks.d.ts.map +1 -0
- package/dist/svelte/schema-hooks.js +71 -0
- package/dist/svelte/stores.d.ts +78 -0
- package/dist/svelte/stores.d.ts.map +1 -0
- package/dist/sync/http-transport.d.ts +3 -3
- package/dist/sync/http-transport.d.ts.map +1 -1
- package/dist/sync/index.d.ts +15 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +617 -0
- package/dist/sync/memory-room.d.ts +37 -0
- package/dist/sync/memory-room.d.ts.map +1 -0
- package/dist/sync/memory-transport.d.ts +3 -3
- package/dist/sync/memory-transport.d.ts.map +1 -1
- package/dist/sync/partykit-room.d.ts +40 -0
- package/dist/sync/partykit-room.d.ts.map +1 -0
- package/dist/sync/partykit-transport.d.ts +84 -0
- package/dist/sync/partykit-transport.d.ts.map +1 -0
- package/dist/sync/room-core.d.ts +53 -0
- package/dist/sync/room-core.d.ts.map +1 -0
- package/dist/sync/sync-engine.d.ts +40 -2
- package/dist/sync/sync-engine.d.ts.map +1 -1
- package/dist/sync/sync-room-server.d.ts +39 -0
- package/dist/sync/sync-room-server.d.ts.map +1 -0
- package/dist/sync/types.d.ts +70 -3
- package/dist/sync/types.d.ts.map +1 -1
- package/dist/sync/vcs-sync-peer.d.ts +63 -0
- package/dist/sync/vcs-sync-peer.d.ts.map +1 -0
- package/dist/sync/ws-transport.d.ts +2 -2
- package/dist/sync/ws-transport.d.ts.map +1 -1
- package/dist/tenancy-NBLLGCNJ.js +14 -0
- package/dist/tenancy-POMWQP6M.js +16 -0
- package/dist/ui/client.html +355 -67
- package/dist/ui/launch-explorer.d.ts +22 -0
- package/dist/ui/launch-explorer.d.ts.map +1 -0
- package/dist/ui/server.d.ts +1 -1
- package/dist/ui/server.d.ts.map +1 -1
- package/dist/vcs/blob-store.d.ts.map +1 -1
- package/dist/vcs/idb-op-log.d.ts +67 -0
- package/dist/vcs/idb-op-log.d.ts.map +1 -0
- package/dist/vcs/index.d.ts +1 -0
- package/dist/vcs/index.d.ts.map +1 -1
- package/dist/vcs/index.js +81 -72
- package/dist/vcs/issue.d.ts +22 -5
- package/dist/vcs/issue.d.ts.map +1 -1
- package/dist/vcs/lane-materialize.d.ts +5 -0
- package/dist/vcs/lane-materialize.d.ts.map +1 -1
- package/dist/vcs/op-log.d.ts +28 -2
- package/dist/vcs/op-log.d.ts.map +1 -1
- package/dist/vcs/ops.d.ts +10 -0
- package/dist/vcs/ops.d.ts.map +1 -1
- package/dist/vcs/types.d.ts +2 -0
- package/dist/vcs/types.d.ts.map +1 -1
- package/dist/{vm-config-6xhsj6b3.js → vm-config-JI4OXKDQ.js} +9 -10
- package/dist/vue/hooks.d.ts +64 -0
- package/dist/vue/hooks.d.ts.map +1 -0
- package/dist/vue/index.d.ts +19 -0
- package/dist/vue/index.d.ts.map +1 -0
- package/dist/vue/index.js +59 -0
- package/dist/vue/schema-hooks.d.ts +41 -0
- package/dist/vue/schema-hooks.d.ts.map +1 -0
- package/dist/vue/schema-hooks.js +64 -0
- package/package.json +130 -17
- package/dist/deploy-999q207z.js +0 -10
- package/dist/engine-y0724kjq.js +0 -8
- package/dist/import-s2b8e0ft.js +0 -11
- package/dist/index-a76rekgs.js +0 -67
- package/dist/index-c9h37r6h.js +0 -1
- package/dist/index-hr9qvv77.js +0 -860
- package/dist/index-k5b0xskw.js +0 -1
- package/dist/index-nzb3am4f.js +0 -80
- package/dist/index-wncptktd.js +0 -292
- package/dist/index-y6a4kj0p.js +0 -43
- package/dist/index-yhwjgfvj.js +0 -342
- package/dist/sdk-bepky0xs.js +0 -16
- package/dist/server-szdjx0nt.js +0 -13
- package/dist/sqlite-backend-0vsmc6qj.js +0 -8
- package/dist/tenancy-pjm32b4v.js +0 -14
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import "../../chunk-KFQGP6VL.js";
|
|
2
|
+
|
|
3
|
+
// src/plugins/proactive-watcher/ontology.ts
|
|
4
|
+
var proactiveWatcherOntology = {
|
|
5
|
+
id: "trellis:proactive-watcher",
|
|
6
|
+
name: "Proactive Watcher Schema",
|
|
7
|
+
description: "Schema for proactive agent suggestions",
|
|
8
|
+
version: "1.0.0",
|
|
9
|
+
entities: [
|
|
10
|
+
{
|
|
11
|
+
name: "AgentSuggestion",
|
|
12
|
+
description: "A proactive suggestion generated by an agent observing the graph",
|
|
13
|
+
attributes: [
|
|
14
|
+
{ name: "title", type: "string", required: true },
|
|
15
|
+
{ name: "description", type: "string", required: true },
|
|
16
|
+
{
|
|
17
|
+
name: "status",
|
|
18
|
+
type: "string",
|
|
19
|
+
enum: ["pending", "accepted", "rejected", "dismissed"],
|
|
20
|
+
required: true
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: "type",
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "Category of suggestion (e.g. task_proposal, documentation, refactor, config)",
|
|
26
|
+
required: true
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: "confidence",
|
|
30
|
+
type: "number",
|
|
31
|
+
description: "Confidence score from 0.0 to 1.0"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: "proposedAction",
|
|
35
|
+
type: "string",
|
|
36
|
+
description: "JSON serialized action payload representing what to do if accepted"
|
|
37
|
+
},
|
|
38
|
+
{ name: "createdAt", type: "string", required: true }
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
relations: [
|
|
43
|
+
{
|
|
44
|
+
name: "suggestsFor",
|
|
45
|
+
sourceTypes: ["AgentSuggestion"],
|
|
46
|
+
targetTypes: ["Any"],
|
|
47
|
+
// Can point to any entity that triggered the suggestion
|
|
48
|
+
description: "The entity this suggestion is about"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "generatedByRule",
|
|
52
|
+
sourceTypes: ["AgentSuggestion"],
|
|
53
|
+
targetTypes: ["Any"],
|
|
54
|
+
description: "The rule or agent definition that triggered this suggestion"
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
// src/plugins/proactive-watcher/watcher-manager.ts
|
|
60
|
+
var WatcherManager = class {
|
|
61
|
+
kernel;
|
|
62
|
+
harness;
|
|
63
|
+
ctx = null;
|
|
64
|
+
rules = [];
|
|
65
|
+
suggestionCounter = 0;
|
|
66
|
+
constructor(kernel, harness) {
|
|
67
|
+
this.kernel = kernel;
|
|
68
|
+
this.harness = harness;
|
|
69
|
+
}
|
|
70
|
+
setContext(ctx) {
|
|
71
|
+
this.ctx = ctx;
|
|
72
|
+
}
|
|
73
|
+
addRule(rule) {
|
|
74
|
+
this.rules.push(rule);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Called by the event handler on `op:applied`.
|
|
78
|
+
*/
|
|
79
|
+
async processOperation(data) {
|
|
80
|
+
if (!data || typeof data !== "object") return;
|
|
81
|
+
const op = data;
|
|
82
|
+
if (!op.kind || !op.hash) return;
|
|
83
|
+
if (op.facts?.some((f) => f.a === "type" && f.v === "AgentSuggestion")) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const matchedRules = this.rules.filter((rule) => {
|
|
87
|
+
try {
|
|
88
|
+
return rule.condition(op, this.kernel);
|
|
89
|
+
} catch {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
if (matchedRules.length === 0) return;
|
|
94
|
+
for (const rule of matchedRules) {
|
|
95
|
+
this.ctx?.log(`Rule "${rule.id}" matched op ${op.hash}. Spawning agent "${rule.agentId}"...`);
|
|
96
|
+
this._evaluateRule(rule, op).catch((err) => {
|
|
97
|
+
this.ctx?.log(`Error evaluating rule "${rule.id}": ${err}`);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async _evaluateRule(rule, op) {
|
|
102
|
+
let agent = this.harness.getAgent(rule.agentId);
|
|
103
|
+
if (!agent) {
|
|
104
|
+
agent = await this.harness.createAgent({
|
|
105
|
+
id: rule.agentId,
|
|
106
|
+
name: "Proactive Watcher Agent",
|
|
107
|
+
description: "Analyzes graph changes and proposes proactive suggestions",
|
|
108
|
+
model: "claude-3-5-sonnet-latest",
|
|
109
|
+
systemPrompt: `You are a proactive monitoring agent. Your job is to look at recent changes to the system graph
|
|
110
|
+
and generate helpful suggestions (AgentSuggestion) for the user.
|
|
111
|
+
If you decide a suggestion is warranted, use the 'createSuggestion' tool to submit it.
|
|
112
|
+
If no suggestion is needed, simply respond that no action is necessary.`,
|
|
113
|
+
tools: ["createSuggestion"],
|
|
114
|
+
status: "active"
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
if (!this.harness.getToolHandler("createSuggestion")) {
|
|
118
|
+
await this.harness.registerTool(
|
|
119
|
+
{
|
|
120
|
+
id: "createSuggestion",
|
|
121
|
+
name: "createSuggestion",
|
|
122
|
+
description: "Create an AgentSuggestion entity in the graph.",
|
|
123
|
+
schema: JSON.stringify({
|
|
124
|
+
type: "object",
|
|
125
|
+
properties: {
|
|
126
|
+
title: { type: "string" },
|
|
127
|
+
description: { type: "string" },
|
|
128
|
+
type: { type: "string" },
|
|
129
|
+
confidence: { type: "number" },
|
|
130
|
+
relatedEntityId: { type: "string" }
|
|
131
|
+
},
|
|
132
|
+
required: ["title", "description", "type"]
|
|
133
|
+
})
|
|
134
|
+
},
|
|
135
|
+
async (input) => {
|
|
136
|
+
const { title, description, type, confidence, relatedEntityId } = input;
|
|
137
|
+
const suggestionId = `suggestion:${Date.now()}:${++this.suggestionCounter}`;
|
|
138
|
+
await this.kernel.createEntity(suggestionId, "AgentSuggestion", {
|
|
139
|
+
title,
|
|
140
|
+
description,
|
|
141
|
+
type,
|
|
142
|
+
status: "pending",
|
|
143
|
+
...confidence !== void 0 ? { confidence } : {}
|
|
144
|
+
});
|
|
145
|
+
if (relatedEntityId) {
|
|
146
|
+
await this.kernel.addLink(suggestionId, "suggestsFor", relatedEntityId);
|
|
147
|
+
}
|
|
148
|
+
await this.kernel.addLink(suggestionId, "generatedByRule", rule.id);
|
|
149
|
+
return { success: true, output: { suggestionId } };
|
|
150
|
+
}
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
const prompt = rule.promptFactory(op);
|
|
154
|
+
try {
|
|
155
|
+
await this.harness.runAgentTask(agent.id, prompt);
|
|
156
|
+
} catch (err) {
|
|
157
|
+
this.ctx?.log(`Agent task failed for rule "${rule.id}": ${err.message}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
// src/plugins/proactive-watcher/plugin.ts
|
|
163
|
+
function createProactiveWatcherPlugin(kernel, harness) {
|
|
164
|
+
const manager = new WatcherManager(kernel, harness);
|
|
165
|
+
return {
|
|
166
|
+
id: "trellis:proactive-watcher",
|
|
167
|
+
name: "Proactive Watcher",
|
|
168
|
+
version: "1.0.0",
|
|
169
|
+
description: "Watches the graph for changes and proactively generates suggestions",
|
|
170
|
+
ontologies: [proactiveWatcherOntology],
|
|
171
|
+
eventHandlers: [
|
|
172
|
+
{
|
|
173
|
+
event: "op:applied",
|
|
174
|
+
handler: async (data) => {
|
|
175
|
+
await manager.processOperation(data);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
],
|
|
179
|
+
onLoad: async (ctx) => {
|
|
180
|
+
ctx.log("Proactive Watcher loaded");
|
|
181
|
+
manager.setContext(ctx);
|
|
182
|
+
},
|
|
183
|
+
onUnload: async (ctx) => {
|
|
184
|
+
ctx.log("Proactive Watcher unloaded");
|
|
185
|
+
manager.setContext(null);
|
|
186
|
+
},
|
|
187
|
+
manager
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
export {
|
|
191
|
+
WatcherManager,
|
|
192
|
+
createProactiveWatcherPlugin,
|
|
193
|
+
proactiveWatcherOntology
|
|
194
|
+
};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// @bun
|
|
2
1
|
import {
|
|
3
2
|
DatalogRuntime,
|
|
4
3
|
parseQuery,
|
|
@@ -7,26 +6,26 @@ import {
|
|
|
7
6
|
reverseReachabilityRules,
|
|
8
7
|
siblingRules,
|
|
9
8
|
transitiveClosureRules
|
|
10
|
-
} from "./
|
|
9
|
+
} from "./chunk-X5FLTRUB.js";
|
|
11
10
|
import {
|
|
12
11
|
QueryEngine,
|
|
13
12
|
isLiteral,
|
|
14
13
|
isVariable,
|
|
15
14
|
literal,
|
|
16
15
|
variable
|
|
17
|
-
} from "./
|
|
18
|
-
import"./
|
|
16
|
+
} from "./chunk-6CTA6MCE.js";
|
|
17
|
+
import "./chunk-KFQGP6VL.js";
|
|
19
18
|
export {
|
|
20
|
-
|
|
21
|
-
transitiveClosureRules,
|
|
22
|
-
siblingRules,
|
|
23
|
-
reverseReachabilityRules,
|
|
24
|
-
parseSimple,
|
|
25
|
-
parseRule,
|
|
26
|
-
parseQuery,
|
|
27
|
-
literal,
|
|
28
|
-
isVariable,
|
|
29
|
-
isLiteral,
|
|
19
|
+
DatalogRuntime,
|
|
30
20
|
QueryEngine,
|
|
31
|
-
|
|
21
|
+
isLiteral,
|
|
22
|
+
isVariable,
|
|
23
|
+
literal,
|
|
24
|
+
parseQuery,
|
|
25
|
+
parseRule,
|
|
26
|
+
parseSimple,
|
|
27
|
+
reverseReachabilityRules,
|
|
28
|
+
siblingRules,
|
|
29
|
+
transitiveClosureRules,
|
|
30
|
+
variable
|
|
32
31
|
};
|
package/dist/react/index.js
CHANGED
|
@@ -1,57 +1,17 @@
|
|
|
1
|
-
// @bun
|
|
2
1
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import"../index-7pjz3tsy.js";
|
|
7
|
-
import"../index-4wxa8xz4.js";
|
|
8
|
-
import"../index-yp88he8n.js";
|
|
9
|
-
import"../index-yhwjgfvj.js";
|
|
10
|
-
import"../index-h7zxhhhh.js";
|
|
11
|
-
import"../index-a76rekgs.js";
|
|
12
|
-
|
|
13
|
-
// src/react/provider.tsx
|
|
2
|
+
TrellisProvider,
|
|
3
|
+
useTrellis
|
|
4
|
+
} from "../chunk-H6JB3PZ3.js";
|
|
14
5
|
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
import
|
|
21
|
-
|
|
22
|
-
function TrellisProvider({
|
|
23
|
-
url,
|
|
24
|
-
apiKey,
|
|
25
|
-
tenantId,
|
|
26
|
-
children
|
|
27
|
-
}) {
|
|
28
|
-
const client = useMemo(() => {
|
|
29
|
-
const opts = { url };
|
|
30
|
-
if (apiKey)
|
|
31
|
-
opts.apiKey = apiKey;
|
|
32
|
-
if (tenantId)
|
|
33
|
-
opts.tenantId = tenantId;
|
|
34
|
-
return new TrellisDb(opts);
|
|
35
|
-
}, [url, apiKey, tenantId]);
|
|
36
|
-
useEffect(() => {
|
|
37
|
-
return () => {
|
|
38
|
-
client.disconnect();
|
|
39
|
-
};
|
|
40
|
-
}, [client]);
|
|
41
|
-
return /* @__PURE__ */ jsxDEV(TrellisContext.Provider, {
|
|
42
|
-
value: client,
|
|
43
|
-
children
|
|
44
|
-
}, undefined, false, undefined, this);
|
|
45
|
-
}
|
|
46
|
-
function useTrellis() {
|
|
47
|
-
const client = useContext(TrellisContext);
|
|
48
|
-
if (!client) {
|
|
49
|
-
throw new Error("useTrellis() must be used within a <TrellisProvider>. " + 'Wrap your app with <TrellisProvider url="...">.');
|
|
50
|
-
}
|
|
51
|
-
return client;
|
|
52
|
-
}
|
|
6
|
+
usePresence,
|
|
7
|
+
useRoom,
|
|
8
|
+
useSignal
|
|
9
|
+
} from "../chunk-O2AV5WMN.js";
|
|
10
|
+
import "../chunk-J2TXUFCZ.js";
|
|
11
|
+
import "../chunk-KFQGP6VL.js";
|
|
12
|
+
|
|
53
13
|
// src/react/hooks.ts
|
|
54
|
-
import { useState, useEffect
|
|
14
|
+
import { useState, useEffect, useCallback, useRef } from "react";
|
|
55
15
|
function useEntity(id, options = {}) {
|
|
56
16
|
const client = useTrellis();
|
|
57
17
|
const [data, setData] = useState(null);
|
|
@@ -74,12 +34,11 @@ function useEntity(id, options = {}) {
|
|
|
74
34
|
setLoading(false);
|
|
75
35
|
}
|
|
76
36
|
}, [client, id]);
|
|
77
|
-
|
|
37
|
+
useEffect(() => {
|
|
78
38
|
fetch();
|
|
79
39
|
}, [fetch]);
|
|
80
|
-
|
|
81
|
-
if (!options.pollInterval || !id)
|
|
82
|
-
return;
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
if (!options.pollInterval || !id) return;
|
|
83
42
|
const interval = setInterval(fetch, options.pollInterval);
|
|
84
43
|
return () => clearInterval(interval);
|
|
85
44
|
}, [fetch, options.pollInterval, id]);
|
|
@@ -109,12 +68,11 @@ function useEntities(options = {}) {
|
|
|
109
68
|
setLoading(false);
|
|
110
69
|
}
|
|
111
70
|
}, [client, options.type, options.limit, options.offset]);
|
|
112
|
-
|
|
71
|
+
useEffect(() => {
|
|
113
72
|
fetch();
|
|
114
73
|
}, [fetch]);
|
|
115
|
-
|
|
116
|
-
if (!options.pollInterval)
|
|
117
|
-
return;
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
if (!options.pollInterval) return;
|
|
118
76
|
const interval = setInterval(fetch, options.pollInterval);
|
|
119
77
|
return () => clearInterval(interval);
|
|
120
78
|
}, [fetch, options.pollInterval]);
|
|
@@ -127,8 +85,7 @@ function useQuery(eql, options = {}) {
|
|
|
127
85
|
const [error, setError] = useState(null);
|
|
128
86
|
const enabled = options.enabled !== false;
|
|
129
87
|
const refetch = useCallback(async () => {
|
|
130
|
-
if (!enabled || !eql.trim())
|
|
131
|
-
return;
|
|
88
|
+
if (!enabled || !eql.trim()) return;
|
|
132
89
|
try {
|
|
133
90
|
setLoading(true);
|
|
134
91
|
const result = await client.query(eql);
|
|
@@ -140,7 +97,7 @@ function useQuery(eql, options = {}) {
|
|
|
140
97
|
setLoading(false);
|
|
141
98
|
}
|
|
142
99
|
}, [client, eql, enabled]);
|
|
143
|
-
|
|
100
|
+
useEffect(() => {
|
|
144
101
|
if (!enabled || !eql.trim()) {
|
|
145
102
|
setData([]);
|
|
146
103
|
setLoading(false);
|
|
@@ -175,16 +132,28 @@ function useMutation() {
|
|
|
175
132
|
setLoading(false);
|
|
176
133
|
}
|
|
177
134
|
}
|
|
178
|
-
const create = useCallback(
|
|
179
|
-
|
|
180
|
-
|
|
135
|
+
const create = useCallback(
|
|
136
|
+
(type, attributes = {}) => run(() => client.create(type, attributes)),
|
|
137
|
+
[client]
|
|
138
|
+
);
|
|
139
|
+
const update = useCallback(
|
|
140
|
+
(id, attributes) => run(() => client.update(id, attributes)),
|
|
141
|
+
[client]
|
|
142
|
+
);
|
|
143
|
+
const remove = useCallback(
|
|
144
|
+
(id) => run(() => client.delete(id)),
|
|
145
|
+
[client]
|
|
146
|
+
);
|
|
181
147
|
return { create, update, remove, loading, error };
|
|
182
148
|
}
|
|
183
149
|
export {
|
|
184
|
-
|
|
185
|
-
useQuery,
|
|
186
|
-
useMutation,
|
|
187
|
-
useEntity,
|
|
150
|
+
TrellisProvider,
|
|
188
151
|
useEntities,
|
|
189
|
-
|
|
152
|
+
useEntity,
|
|
153
|
+
useMutation,
|
|
154
|
+
usePresence,
|
|
155
|
+
useQuery,
|
|
156
|
+
useRoom,
|
|
157
|
+
useSignal,
|
|
158
|
+
useTrellis
|
|
190
159
|
};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useTrellis
|
|
3
|
+
} from "../chunk-H6JB3PZ3.js";
|
|
4
|
+
import {
|
|
5
|
+
useSignal
|
|
6
|
+
} from "../chunk-O2AV5WMN.js";
|
|
7
|
+
import {
|
|
8
|
+
liveEntities,
|
|
9
|
+
liveEntity
|
|
10
|
+
} from "../chunk-J3WYZO3Q.js";
|
|
11
|
+
import {
|
|
12
|
+
entityMutations
|
|
13
|
+
} from "../chunk-USEINYUL.js";
|
|
14
|
+
import "../chunk-JUEMDWLU.js";
|
|
15
|
+
import "../chunk-J2TXUFCZ.js";
|
|
16
|
+
import {
|
|
17
|
+
Signal
|
|
18
|
+
} from "../chunk-UBGUDMUV.js";
|
|
19
|
+
import "../chunk-KFQGP6VL.js";
|
|
20
|
+
|
|
21
|
+
// src/react/schema-hooks.ts
|
|
22
|
+
import { useEffect, useMemo } from "react";
|
|
23
|
+
var IDLE = new Signal({
|
|
24
|
+
data: [],
|
|
25
|
+
loading: false,
|
|
26
|
+
error: null
|
|
27
|
+
});
|
|
28
|
+
var IDLE_SINGLE = new Signal({
|
|
29
|
+
data: null,
|
|
30
|
+
loading: false,
|
|
31
|
+
error: null
|
|
32
|
+
});
|
|
33
|
+
function parseReadOptions(opts) {
|
|
34
|
+
if (!opts) return {};
|
|
35
|
+
if ("resolve" in opts || "where" in opts) return opts;
|
|
36
|
+
return { where: opts };
|
|
37
|
+
}
|
|
38
|
+
function useLiveEntities(schema, opts) {
|
|
39
|
+
const client = useTrellis();
|
|
40
|
+
const parsed = parseReadOptions(opts);
|
|
41
|
+
const optsKey = JSON.stringify(parsed);
|
|
42
|
+
const res = useMemo(
|
|
43
|
+
() => schema ? liveEntities(client, schema, parsed) : null,
|
|
44
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
45
|
+
[client, schema, optsKey]
|
|
46
|
+
);
|
|
47
|
+
useEffect(() => res?.start(), [res]);
|
|
48
|
+
return useSignal(res?.signal ?? IDLE);
|
|
49
|
+
}
|
|
50
|
+
function useLiveEntity(schema, id, opts) {
|
|
51
|
+
const client = useTrellis();
|
|
52
|
+
const optsKey = JSON.stringify(opts ?? {});
|
|
53
|
+
const res = useMemo(
|
|
54
|
+
() => schema && id ? liveEntity(client, schema, id, opts) : null,
|
|
55
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
56
|
+
[client, schema, id, optsKey]
|
|
57
|
+
);
|
|
58
|
+
useEffect(() => res?.start(), [res]);
|
|
59
|
+
return useSignal(
|
|
60
|
+
res?.signal ?? IDLE_SINGLE
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
function useEntities(schema, opts) {
|
|
64
|
+
const state = useLiveEntities(schema, opts);
|
|
65
|
+
return {
|
|
66
|
+
data: state.data,
|
|
67
|
+
loading: state.loading,
|
|
68
|
+
error: state.error
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function useEntity(schema, id, opts) {
|
|
72
|
+
const state = useLiveEntity(id ? schema : null, id, opts);
|
|
73
|
+
return {
|
|
74
|
+
data: state.data,
|
|
75
|
+
loading: state.loading,
|
|
76
|
+
error: state.error
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function useMutation(schema) {
|
|
80
|
+
const client = useTrellis();
|
|
81
|
+
return useMemo(() => entityMutations(client, schema), [client, schema]);
|
|
82
|
+
}
|
|
83
|
+
export {
|
|
84
|
+
useEntities,
|
|
85
|
+
useEntity,
|
|
86
|
+
useMutation
|
|
87
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serverless cross-tab realtime transport using the browser BroadcastChannel
|
|
3
|
+
* API. All tabs/windows of the same origin that open a channel with the same
|
|
4
|
+
* name form a broadcast mesh — no server required.
|
|
5
|
+
*
|
|
6
|
+
* BroadcastChannel does not deliver a message back to the posting channel
|
|
7
|
+
* object, so the mesh semantics (no self-echo) hold naturally.
|
|
8
|
+
*/
|
|
9
|
+
import type { RealtimeMessage, RealtimeTransport } from './types.js';
|
|
10
|
+
interface BroadcastChannelLike {
|
|
11
|
+
postMessage(message: unknown): void;
|
|
12
|
+
close(): void;
|
|
13
|
+
onmessage: ((event: {
|
|
14
|
+
data: unknown;
|
|
15
|
+
}) => void) | null;
|
|
16
|
+
addEventListener?(type: 'message', listener: (event: {
|
|
17
|
+
data: unknown;
|
|
18
|
+
}) => void): void;
|
|
19
|
+
removeEventListener?(type: 'message', listener: (event: {
|
|
20
|
+
data: unknown;
|
|
21
|
+
}) => void): void;
|
|
22
|
+
}
|
|
23
|
+
type BroadcastChannelCtor = new (name: string) => BroadcastChannelLike;
|
|
24
|
+
export interface BroadcastChannelTransportOptions {
|
|
25
|
+
/** Local peer identity. */
|
|
26
|
+
id: string;
|
|
27
|
+
/** Channel name — all peers in the room share this. */
|
|
28
|
+
channel: string;
|
|
29
|
+
/** Injectable implementation for tests / non-browser hosts. */
|
|
30
|
+
BroadcastChannelImpl?: BroadcastChannelCtor;
|
|
31
|
+
}
|
|
32
|
+
export declare class BroadcastChannelTransport implements RealtimeTransport {
|
|
33
|
+
readonly id: string;
|
|
34
|
+
private bc;
|
|
35
|
+
private handlers;
|
|
36
|
+
private closed;
|
|
37
|
+
constructor(opts: BroadcastChannelTransportOptions);
|
|
38
|
+
send(message: RealtimeMessage): void;
|
|
39
|
+
onMessage(handler: (message: RealtimeMessage) => void): () => void;
|
|
40
|
+
close(): void;
|
|
41
|
+
}
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=broadcast-channel-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast-channel-transport.d.ts","sourceRoot":"","sources":["../../src/realtime/broadcast-channel-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAErE,UAAU,oBAAoB;IAC5B,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,KAAK,IAAI,IAAI,CAAC;IACd,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IACvD,gBAAgB,CAAC,CACf,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAC3C,IAAI,CAAC;IACR,mBAAmB,CAAC,CAClB,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAC3C,IAAI,CAAC;CACT;AAED,KAAK,oBAAoB,GAAG,KAAK,IAAI,EAAE,MAAM,KAAK,oBAAoB,CAAC;AAEvE,MAAM,WAAW,gCAAgC;IAC/C,2BAA2B;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAC7C;AAED,qBAAa,yBAA0B,YAAW,iBAAiB;IACjE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,QAAQ,CAAiD;IACjE,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,gCAAgC;IAgClD,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAKpC,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAOlE,KAAK,IAAI,IAAI;CAUd"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser transport for a hosted relay room — the paid-tier accelerator.
|
|
3
|
+
*
|
|
4
|
+
* Functionally a {@link WebSocketRelayTransport} with three additions a hosted
|
|
5
|
+
* deployment needs: a room-aware URL convention, an auth token, and automatic
|
|
6
|
+
* reconnect with backoff. The server it talks to is the same dumb fan-out +
|
|
7
|
+
* disposable replay contract as {@link createRealtimeRelay} — whether that
|
|
8
|
+
* server is a Cloudflare Durable Object, a self-hosted relay, or PartyKit is
|
|
9
|
+
* irrelevant to this code. The name reflects the *recommended* hosted target
|
|
10
|
+
* (DO: single-writer-per-object matches Trellis's per-graph causality), not a
|
|
11
|
+
* hard dependency on it.
|
|
12
|
+
*
|
|
13
|
+
* Telos alignment: this is one swappable {@link RealtimeTransport} behind the
|
|
14
|
+
* stable seam. Local/free presence uses {@link BroadcastChannelTransport}; this
|
|
15
|
+
* is what you inject when "sync" is enabled. An Iroh gossip transport slots in
|
|
16
|
+
* the same way later with zero client change.
|
|
17
|
+
*
|
|
18
|
+
* new DurableObjectRelayTransport({
|
|
19
|
+
* id: peerId,
|
|
20
|
+
* url: 'wss://relay.example.com',
|
|
21
|
+
* room: 'doc:42',
|
|
22
|
+
* auth: sessionToken,
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* Reconnect self-heals presence for free: the room's heartbeat re-announces
|
|
26
|
+
* local presence after the socket comes back, and this transport re-sends a
|
|
27
|
+
* `hello` on every (re)open so the relay replays peers/chat tail immediately.
|
|
28
|
+
*/
|
|
29
|
+
import type { RealtimeMessage, RealtimeTransport } from './types.js';
|
|
30
|
+
interface SocketLike {
|
|
31
|
+
readyState: number;
|
|
32
|
+
send(data: string): void;
|
|
33
|
+
close(): void;
|
|
34
|
+
addEventListener(type: string, listener: (event: unknown) => void): void;
|
|
35
|
+
}
|
|
36
|
+
type SocketCtor = new (url: string) => SocketLike;
|
|
37
|
+
export interface DurableObjectRelayReconnect {
|
|
38
|
+
/** Max reconnect attempts after an unexpected close. 0 = unlimited. Default 0. */
|
|
39
|
+
maxAttempts?: number;
|
|
40
|
+
/** Initial backoff (ms). Default 500. */
|
|
41
|
+
baseDelayMs?: number;
|
|
42
|
+
/** Max backoff (ms). Default 10_000. */
|
|
43
|
+
maxDelayMs?: number;
|
|
44
|
+
}
|
|
45
|
+
export interface DurableObjectRelayTransportOptions {
|
|
46
|
+
/** Local peer identity. */
|
|
47
|
+
id: string;
|
|
48
|
+
/**
|
|
49
|
+
* Base relay URL, e.g. `wss://relay.example.com` or
|
|
50
|
+
* `wss://x.partykit.dev/parties/main`. The room segment and auth token are
|
|
51
|
+
* appended per {@link buildUrl} unless you pass a fully-formed URL and omit
|
|
52
|
+
* `room`/`auth`.
|
|
53
|
+
*/
|
|
54
|
+
url: string;
|
|
55
|
+
/** Logical room id, appended as a path segment (`/{room}`) when set. */
|
|
56
|
+
room?: string;
|
|
57
|
+
/** Auth token, appended as `?token=` (or `&token=`) when set. */
|
|
58
|
+
auth?: string;
|
|
59
|
+
/**
|
|
60
|
+
* Override URL assembly entirely (e.g. a different DO routing convention).
|
|
61
|
+
* Receives the constructor options; returns the final `ws(s)://…` URL.
|
|
62
|
+
*/
|
|
63
|
+
buildUrl?: (opts: {
|
|
64
|
+
url: string;
|
|
65
|
+
room?: string;
|
|
66
|
+
auth?: string;
|
|
67
|
+
}) => string;
|
|
68
|
+
/** Reconnect policy. Pass `false` to disable reconnect. */
|
|
69
|
+
reconnect?: DurableObjectRelayReconnect | false;
|
|
70
|
+
/** Cap on frames buffered while disconnected (oldest dropped). Default 128. */
|
|
71
|
+
maxPending?: number;
|
|
72
|
+
/** Injectable WebSocket for tests / non-browser hosts. */
|
|
73
|
+
WebSocketImpl?: SocketCtor;
|
|
74
|
+
}
|
|
75
|
+
export declare class DurableObjectRelayTransport implements RealtimeTransport {
|
|
76
|
+
readonly id: string;
|
|
77
|
+
private readonly url;
|
|
78
|
+
private readonly WS;
|
|
79
|
+
private readonly reconnect;
|
|
80
|
+
private readonly maxPending;
|
|
81
|
+
private ws;
|
|
82
|
+
private handlers;
|
|
83
|
+
private pending;
|
|
84
|
+
private closed;
|
|
85
|
+
private attempts;
|
|
86
|
+
private reconnectTimer;
|
|
87
|
+
constructor(opts: DurableObjectRelayTransportOptions);
|
|
88
|
+
send(message: RealtimeMessage): void;
|
|
89
|
+
onMessage(handler: (message: RealtimeMessage) => void): () => void;
|
|
90
|
+
close(): void;
|
|
91
|
+
private open;
|
|
92
|
+
private scheduleReconnect;
|
|
93
|
+
private flushPending;
|
|
94
|
+
}
|
|
95
|
+
export {};
|
|
96
|
+
//# sourceMappingURL=durable-object-relay-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-object-relay-transport.d.ts","sourceRoot":"","sources":["../../src/realtime/durable-object-relay-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAErE,UAAU,UAAU;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;CAC1E;AAED,KAAK,UAAU,GAAG,KAAK,GAAG,EAAE,MAAM,KAAK,UAAU,CAAC;AAElD,MAAM,WAAW,2BAA2B;IAC1C,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kCAAkC;IACjD,2BAA2B;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX;;;;;OAKG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IAC3E,2DAA2D;IAC3D,SAAS,CAAC,EAAE,2BAA2B,GAAG,KAAK,CAAC;IAChD,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,UAAU,CAAC;CAC5B;AAmBD,qBAAa,2BAA4B,YAAW,iBAAiB;IACnE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+C;IACzE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,OAAO,CAAC,EAAE,CAA2B;IACrC,OAAO,CAAC,QAAQ,CAAiD;IACjE,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,cAAc,CAA8C;gBAExD,IAAI,EAAE,kCAAkC;IAsBpD,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAYpC,SAAS,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAOlE,KAAK,IAAI,IAAI;IAeb,OAAO,CAAC,IAAI;IA+CZ,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,YAAY;CAOrB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trellis Realtime — Public Surface
|
|
3
|
+
*
|
|
4
|
+
* Ephemeral presence + broadcast primitives for multiplayer UI: active-user
|
|
5
|
+
* avatars, chat, live cursors, and collaborative text. Distinct from the
|
|
6
|
+
* persisted VCS op log — realtime data is mesh-broadcast and never written to
|
|
7
|
+
* the causal history.
|
|
8
|
+
*
|
|
9
|
+
* @module trellis/realtime
|
|
10
|
+
*
|
|
11
|
+
* import {
|
|
12
|
+
* RealtimeRoom,
|
|
13
|
+
* BroadcastChannelTransport,
|
|
14
|
+
* WebSocketRelayTransport,
|
|
15
|
+
* } from 'trellis/realtime';
|
|
16
|
+
*
|
|
17
|
+
* const room = RealtimeRoom.join({
|
|
18
|
+
* transport: new BroadcastChannelTransport({ id, channel: 'room:42' }),
|
|
19
|
+
* initialPresence: { name: 'Ada', color: '#6d5bfa' },
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* // Or relay across browsers:
|
|
23
|
+
* new WebSocketRelayTransport({ id, url: 'ws://localhost:8231/rt' });
|
|
24
|
+
*/
|
|
25
|
+
export { RealtimeRoom } from './room.js';
|
|
26
|
+
export type { RealtimeRoomOptions } from './room.js';
|
|
27
|
+
export { MemoryHub, MemoryRealtimeTransport } from './memory-hub.js';
|
|
28
|
+
export { BroadcastChannelTransport } from './broadcast-channel-transport.js';
|
|
29
|
+
export type { BroadcastChannelTransportOptions } from './broadcast-channel-transport.js';
|
|
30
|
+
export { WebSocketRelayTransport } from './websocket-relay-transport.js';
|
|
31
|
+
export type { WebSocketRelayTransportOptions } from './websocket-relay-transport.js';
|
|
32
|
+
export { DurableObjectRelayTransport } from './durable-object-relay-transport.js';
|
|
33
|
+
export type { DurableObjectRelayTransportOptions, DurableObjectRelayReconnect, } from './durable-object-relay-transport.js';
|
|
34
|
+
export { joinPresence, createPresenceTransport } from './presence.js';
|
|
35
|
+
export type { PresenceOptions } from './presence.js';
|
|
36
|
+
export { RelayPersistence, DEFAULT_MAX_CHAT, DEFAULT_MAX_TEXT_OPS, } from './relay-persistence.js';
|
|
37
|
+
export type { RelayPersistenceOptions } from './relay-persistence.js';
|
|
38
|
+
export { PersistentChannel, localStorageChannelStore, DEFAULT_MAX_RECORDS, } from './persistent-channel.js';
|
|
39
|
+
export type { ChannelRecord, ChannelStore, PersistentChannelOptions, } from './persistent-channel.js';
|
|
40
|
+
export { RealtimeText } from './text.js';
|
|
41
|
+
export type { RealtimeTextOptions, TextNode, TextOp } from './text.js';
|
|
42
|
+
export { REALTIME_PROTOCOL } from './types.js';
|
|
43
|
+
export type { PresenceState, PresencePeer, BroadcastEvent, RealtimeMessage, RealtimeTransport, } from './types.js';
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|