@feltdb/core 0.6.10 → 0.6.11
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/dist/cli/application-lifecycle.js +112 -0
- package/dist/cli/application.js +10 -0
- package/dist/cli/commands.js +234 -64
- package/dist/cli/development-session.js +54 -0
- package/dist/cli/index.js +1 -1
- package/dist/cli/workspace-integration.js +146 -20
- package/dist/create/cli.js +4 -2
- package/dist/create/create.js +42 -6
- package/dist/create/frameworks.js +18 -0
- package/dist/create/package-versions.js +1 -1
- package/dist/create/workspace-initialization.js +4 -5
- package/dist/db.d.ts +4 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +56 -7
- package/dist/development-runtime-bridge.d.ts +60 -0
- package/dist/development-runtime-bridge.d.ts.map +1 -0
- package/dist/development-runtime-bridge.js +171 -0
- package/dist/index-core.d.ts +2 -0
- package/dist/index-core.d.ts.map +1 -1
- package/dist/index-core.js +2 -0
- package/dist/studio/app.d.ts +2 -1
- package/dist/studio/app.d.ts.map +1 -1
- package/dist/studio/components/StateExplorer.d.ts +2 -1
- package/dist/studio/components/StateExplorer.d.ts.map +1 -1
- package/dist/studio/components/index.js +1 -1
- package/dist/studio/{components-9kDSWiGL.js → components-C5p2TfIU.js} +25 -14
- package/dist/studio/index.js +234 -160
- package/dist/studio-app/assets/index-DospFFYE.js +28 -0
- package/dist/studio-app/index.html +1 -1
- package/dist/workspace/browser.d.ts +2 -2
- package/dist/workspace/browser.d.ts.map +1 -1
- package/dist/workspace/browser.js +1 -1
- package/dist/workspace/development-node.d.ts +16 -0
- package/dist/workspace/development-node.d.ts.map +1 -1
- package/dist/workspace/development-node.js +85 -1
- package/dist/workspace/index.d.ts +2 -2
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/index.js +1 -1
- package/dist/workspace/investigation-lifecycle-manager.d.ts +2 -0
- package/dist/workspace/investigation-lifecycle-manager.d.ts.map +1 -1
- package/dist/workspace/investigation-lifecycle-manager.js +33 -3
- package/dist/workspace/investigation-supervisor.d.ts.map +1 -1
- package/dist/workspace/investigation-supervisor.js +3 -1
- package/dist/workspace/runtime-investigation.d.ts +4 -0
- package/dist/workspace/runtime-investigation.d.ts.map +1 -1
- package/dist/workspace/runtime-investigation.js +4 -0
- package/dist/workspace/runtime-observation.d.ts +4 -1
- package/dist/workspace/runtime-observation.d.ts.map +1 -1
- package/dist/workspace/runtime-observation.js +20 -2
- package/dist/workspace/runtime-observer.d.ts +6 -0
- package/dist/workspace/runtime-observer.d.ts.map +1 -1
- package/dist/workspace/runtime-observer.js +4 -0
- package/dist/workspace/workspace-identity.d.ts +1 -1
- package/dist/workspace/workspace-identity.d.ts.map +1 -1
- package/dist/workspace/workspace-identity.js +4 -4
- package/dist/workspace/workspace-types.d.ts +95 -0
- package/dist/workspace/workspace-types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/studio-app/assets/index-D3rT0SJi.js +0 -28
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"development-runtime-bridge.d.ts","sourceRoot":"","sources":["../src/development-runtime-bridge.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iCAAiC;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,8BAA+B,SAAQ,iCAAiC;IACvF,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEzE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,MAAM,EAAE,uBAAuB,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,+BAA+B,CAAC;CACrJ;AAED,6FAA6F;AAC7F,eAAO,MAAM,oCAAoC,MAAM,CAAC;AAIxD,sFAAsF;AACtF,wBAAgB,iCAAiC,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,iCAAiC,CAAC,GAAG,IAAI,CAI5G;AA8BD,gFAAgF;AAChF,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,0BAA0B,CAAC;IAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAmHjG"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/** Maximum unsent events retained by a runtime. New events are dropped beyond this bound. */
|
|
2
|
+
export const DEVELOPMENT_OBSERVATION_BUFFER_LIMIT = 256;
|
|
3
|
+
let configuredSession;
|
|
4
|
+
/** Supply ephemeral `feltdb dev` identity. This is a no-op when values are absent. */
|
|
5
|
+
export function configureDevelopmentRuntimeBridge(session) {
|
|
6
|
+
if (!session) {
|
|
7
|
+
configuredSession = undefined;
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (!session.sessionId || !session.workspaceId || !session.namespace || !session.runtime || !session.authorityUrl || !session.bridgeUrl)
|
|
11
|
+
return;
|
|
12
|
+
configuredSession = session;
|
|
13
|
+
}
|
|
14
|
+
function randomId() {
|
|
15
|
+
const value = globalThis.crypto?.randomUUID?.().replace(/-/g, '')
|
|
16
|
+
?? `${Date.now().toString(36)}${Math.random().toString(36).slice(2)}${Math.random().toString(36).slice(2)}`;
|
|
17
|
+
return `runtime_${value}`;
|
|
18
|
+
}
|
|
19
|
+
function processSession() {
|
|
20
|
+
const environment = globalThis.process?.env;
|
|
21
|
+
if (!environment?.FELTDB_DEV_SESSION_ID)
|
|
22
|
+
return undefined;
|
|
23
|
+
return {
|
|
24
|
+
sessionId: environment.FELTDB_DEV_SESSION_ID,
|
|
25
|
+
workspaceId: environment.FELTDB_WORKSPACE_ID,
|
|
26
|
+
namespace: environment.FELTDB_NAMESPACE,
|
|
27
|
+
runtime: environment.FELTDB_RUNTIME,
|
|
28
|
+
authorityUrl: environment.FELTDB_AUTHORITY_URL || environment.FELTDB_WORKSPACE_ENDPOINT,
|
|
29
|
+
bridgeUrl: environment.FELTDB_DEV_BRIDGE_URL,
|
|
30
|
+
applicationUrl: environment.FELTDB_APPLICATION_URL,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function safeBridgeUrl(value) {
|
|
34
|
+
try {
|
|
35
|
+
const url = new URL(value);
|
|
36
|
+
if (url.protocol !== 'http:' || !['127.0.0.1', 'localhost', '::1', '[::1]'].includes(url.hostname))
|
|
37
|
+
return undefined;
|
|
38
|
+
return url.origin;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Internal, optional registration hook called by Core runtime construction. */
|
|
45
|
+
export function attachDevelopmentRuntimeBridge(input) {
|
|
46
|
+
const runtimeInstanceId = randomId();
|
|
47
|
+
let activeSession;
|
|
48
|
+
let heartbeat;
|
|
49
|
+
let flushTimer;
|
|
50
|
+
let flushing = false;
|
|
51
|
+
let closing = false;
|
|
52
|
+
let dropped = 0;
|
|
53
|
+
const observations = [];
|
|
54
|
+
const applicationId = input.applicationId
|
|
55
|
+
|| globalThis.document?.title
|
|
56
|
+
|| globalThis.process?.env?.npm_package_name
|
|
57
|
+
|| 'application';
|
|
58
|
+
const register = async (candidate) => {
|
|
59
|
+
const session = candidate || configuredSession || processSession();
|
|
60
|
+
const compatibleRuntime = session?.runtime === input.runtime
|
|
61
|
+
|| (input.runtime === 'remote' && ['managed', 'self-hosted', 'remote'].includes(session?.runtime || ''));
|
|
62
|
+
if (!session || session.namespace !== input.namespace || !compatibleRuntime)
|
|
63
|
+
return;
|
|
64
|
+
const bridgeUrl = safeBridgeUrl(session.bridgeUrl);
|
|
65
|
+
if (!bridgeUrl)
|
|
66
|
+
return;
|
|
67
|
+
activeSession = { ...session, bridgeUrl };
|
|
68
|
+
const registration = { ...activeSession, runtimeInstanceId, applicationId };
|
|
69
|
+
try {
|
|
70
|
+
const response = await fetch(`${bridgeUrl}/api/v1/development/runtime/register`, {
|
|
71
|
+
method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(registration),
|
|
72
|
+
});
|
|
73
|
+
if (!response.ok)
|
|
74
|
+
return;
|
|
75
|
+
if (!heartbeat) {
|
|
76
|
+
heartbeat = setInterval(() => { void register(activeSession); }, 2000);
|
|
77
|
+
heartbeat.unref?.();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch { /* Development tooling is optional. */ }
|
|
81
|
+
};
|
|
82
|
+
const flush = async () => {
|
|
83
|
+
if (flushing || !activeSession || observations.length === 0)
|
|
84
|
+
return;
|
|
85
|
+
flushing = true;
|
|
86
|
+
const batch = observations.splice(0, 32);
|
|
87
|
+
const droppedEvents = dropped;
|
|
88
|
+
dropped = 0;
|
|
89
|
+
try {
|
|
90
|
+
const response = await fetch(`${activeSession.bridgeUrl}/api/v1/development/runtime/${encodeURIComponent(runtimeInstanceId)}/observations`, {
|
|
91
|
+
method: 'POST', headers: { 'content-type': 'application/json' },
|
|
92
|
+
body: JSON.stringify({ sessionId: activeSession.sessionId, observations: batch, dropped: droppedEvents }),
|
|
93
|
+
});
|
|
94
|
+
if (!response.ok)
|
|
95
|
+
throw new Error('observation delivery failed');
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
if (!closing) {
|
|
99
|
+
const available = DEVELOPMENT_OBSERVATION_BUFFER_LIMIT - observations.length;
|
|
100
|
+
observations.unshift(...batch.slice(Math.max(0, batch.length - available)));
|
|
101
|
+
dropped += droppedEvents + Math.max(0, batch.length - available);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
flushing = false;
|
|
106
|
+
if (observations.length && !closing) {
|
|
107
|
+
flushTimer = setTimeout(() => { flushTimer = undefined; void flush(); }, 100);
|
|
108
|
+
flushTimer.unref?.();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
const enqueue = (event) => {
|
|
113
|
+
if (!activeSession || closing)
|
|
114
|
+
return;
|
|
115
|
+
if (observations.length >= DEVELOPMENT_OBSERVATION_BUFFER_LIMIT)
|
|
116
|
+
dropped++;
|
|
117
|
+
else
|
|
118
|
+
observations.push(event);
|
|
119
|
+
if (!flushTimer && !flushing) {
|
|
120
|
+
flushTimer = setTimeout(() => { flushTimer = undefined; void flush(); }, 0);
|
|
121
|
+
flushTimer.unref?.();
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
const observation = {
|
|
125
|
+
start(type, details = {}) {
|
|
126
|
+
const correlationId = `op_${randomId().slice(8)}`;
|
|
127
|
+
const startedAt = Date.now();
|
|
128
|
+
const emit = (status, metadata, error) => enqueue({
|
|
129
|
+
eventId: `evt_${randomId().slice(8)}`, correlationId, timestamp: Date.now(),
|
|
130
|
+
workspaceId: activeSession?.workspaceId, sessionId: activeSession?.sessionId, runtimeInstanceId,
|
|
131
|
+
operation: { type, collection: details.collection, transactionId: details.transactionId }, status,
|
|
132
|
+
durationMs: status === 'started' ? undefined : Date.now() - startedAt,
|
|
133
|
+
metadata: metadata || details.metadata,
|
|
134
|
+
error: status === 'failed' ? {
|
|
135
|
+
code: typeof error === 'object' && error && 'code' in error ? String(error.code) : undefined,
|
|
136
|
+
message: (error instanceof Error ? error.message : String(error)).slice(0, 500),
|
|
137
|
+
} : undefined,
|
|
138
|
+
});
|
|
139
|
+
emit('started');
|
|
140
|
+
return { complete: metadata => emit('completed', metadata), fail: error => emit('failed', undefined, error) };
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
const browser = globalThis.window;
|
|
144
|
+
const receive = (event) => {
|
|
145
|
+
if (event.source !== browser?.parent || event.data?.type !== 'feltdb:dev-session')
|
|
146
|
+
return;
|
|
147
|
+
void register(event.data.session);
|
|
148
|
+
};
|
|
149
|
+
browser?.addEventListener?.('message', receive);
|
|
150
|
+
void register();
|
|
151
|
+
const close = async () => {
|
|
152
|
+
closing = true;
|
|
153
|
+
if (heartbeat)
|
|
154
|
+
clearInterval(heartbeat);
|
|
155
|
+
if (flushTimer)
|
|
156
|
+
clearTimeout(flushTimer);
|
|
157
|
+
while (observations.length)
|
|
158
|
+
await flush();
|
|
159
|
+
browser?.removeEventListener?.('message', receive);
|
|
160
|
+
if (!activeSession)
|
|
161
|
+
return;
|
|
162
|
+
try {
|
|
163
|
+
await fetch(`${activeSession.bridgeUrl}/api/v1/development/runtime/${encodeURIComponent(runtimeInstanceId)}?sessionId=${encodeURIComponent(activeSession.sessionId)}`, {
|
|
164
|
+
method: 'DELETE', keepalive: true,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
catch { /* Lease expiry handles crashes and unavailable tooling. */ }
|
|
168
|
+
};
|
|
169
|
+
browser?.addEventListener?.('pagehide', () => { void close(); }, { once: true });
|
|
170
|
+
return { runtimeInstanceId, observation, close };
|
|
171
|
+
}
|
package/dist/index-core.d.ts
CHANGED
|
@@ -49,6 +49,7 @@ export * from './release.js';
|
|
|
49
49
|
export * from './observe.js';
|
|
50
50
|
export * from './provider.js';
|
|
51
51
|
export * from './identity.js';
|
|
52
|
+
export * from './development-runtime-bridge.js';
|
|
52
53
|
export * from './application-contract.js';
|
|
53
54
|
export { ProtocolHandler, type Message, type Operation as ProtocolOperation, type Response as ProtocolResponse, } from './protocol.js';
|
|
54
55
|
/**
|
|
@@ -75,4 +76,5 @@ export type { ProvenanceGraph, ProvenanceNode, ProvenanceEdge, ProvenanceEdgeTyp
|
|
|
75
76
|
* Shared development state for coordinating Browser, IDE, and Agent clients.
|
|
76
77
|
*/
|
|
77
78
|
export * from './workspace/browser.js';
|
|
79
|
+
export * from './development-runtime-bridge.js';
|
|
78
80
|
//# sourceMappingURL=index-core.d.ts.map
|
package/dist/index-core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-core.d.ts","sourceRoot":"","sources":["../src/index-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EACL,eAAe,EACf,KAAK,OAAO,EACZ,KAAK,SAAS,IAAI,iBAAiB,EACnC,KAAK,QAAQ,IAAI,gBAAgB,GAClC,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AAEnC;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACnE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzE;;GAEG;AACH,YAAY,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,cAAc,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index-core.d.ts","sourceRoot":"","sources":["../src/index-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,OAAO,EACL,eAAe,EACf,KAAK,OAAO,EACZ,KAAK,SAAS,IAAI,iBAAiB,EACnC,KAAK,QAAQ,IAAI,gBAAgB,GAClC,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AAEnC;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACnE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzE;;GAEG;AACH,YAAY,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC"}
|
package/dist/index-core.js
CHANGED
|
@@ -49,6 +49,7 @@ export * from './release.js';
|
|
|
49
49
|
export * from './observe.js';
|
|
50
50
|
export * from './provider.js';
|
|
51
51
|
export * from './identity.js';
|
|
52
|
+
export * from './development-runtime-bridge.js';
|
|
52
53
|
export * from './application-contract.js';
|
|
53
54
|
export { ProtocolHandler, } from './protocol.js';
|
|
54
55
|
/**
|
|
@@ -70,3 +71,4 @@ export { emitTelemetry, getTelemetryClient } from './telemetry.js';
|
|
|
70
71
|
* Shared development state for coordinating Browser, IDE, and Agent clients.
|
|
71
72
|
*/
|
|
72
73
|
export * from './workspace/browser.js';
|
|
74
|
+
export * from './development-runtime-bridge.js';
|
package/dist/studio/app.d.ts
CHANGED
|
@@ -7,8 +7,9 @@ export interface StudioAppProps {
|
|
|
7
7
|
namespace?: string;
|
|
8
8
|
deploymentRuntime?: string;
|
|
9
9
|
applicationUrl?: string;
|
|
10
|
+
developmentSession?: Record<string, string>;
|
|
10
11
|
onConnect?: (url: string, token: string) => void;
|
|
11
12
|
}
|
|
12
|
-
export declare function StudioApp({ db, remoteUrl, token, namespace, deploymentRuntime, applicationUrl, onConnect }: StudioAppProps): React.JSX.Element;
|
|
13
|
+
export declare function StudioApp({ db, remoteUrl, token, namespace, deploymentRuntime, applicationUrl, developmentSession, onConnect }: StudioAppProps): React.JSX.Element;
|
|
13
14
|
export default StudioApp;
|
|
14
15
|
//# sourceMappingURL=app.d.ts.map
|
package/dist/studio/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAmBnD,OAAO,EAAgC,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,WAAW,CAAC;AAEnB,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,YAAY,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,EAAE,SAAc,EAAE,KAAU,EAAE,SAAqB,EAAE,iBAA6B,EAAE,cAAmB,EAAE,SAAS,EAAE,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAA8B,MAAM,OAAO,CAAC;AAmBnD,OAAO,EAAgC,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,WAAW,CAAC;AAEnB,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,YAAY,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,EAAE,SAAc,EAAE,KAAU,EAAE,SAAqB,EAAE,iBAA6B,EAAE,cAAmB,EAAE,kBAAkB,EAAE,SAAS,EAAE,EAAE,cAAc,qBA6IrL;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -5,7 +5,8 @@ export interface StateExplorerProps {
|
|
|
5
5
|
model?: FlowSpec | null;
|
|
6
6
|
namespace?: string;
|
|
7
7
|
applicationUrl?: string;
|
|
8
|
+
developmentSession?: Record<string, string>;
|
|
8
9
|
}
|
|
9
|
-
export declare function StateExplorer({ db, model, namespace, applicationUrl }: StateExplorerProps): React.JSX.Element;
|
|
10
|
+
export declare function StateExplorer({ db, model, namespace, applicationUrl, developmentSession }: StateExplorerProps): React.JSX.Element;
|
|
10
11
|
export default StateExplorer;
|
|
11
12
|
//# sourceMappingURL=StateExplorer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StateExplorer.d.ts","sourceRoot":"","sources":["../../src/components/StateExplorer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,KAAK,EAAkB,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG3E,MAAM,WAAW,kBAAkB;IAAG,EAAE,CAAC,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE;
|
|
1
|
+
{"version":3,"file":"StateExplorer.d.ts","sourceRoot":"","sources":["../../src/components/StateExplorer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,KAAK,EAAkB,QAAQ,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG3E,MAAM,WAAW,kBAAkB;IAAG,EAAE,CAAC,EAAE,YAAY,CAAC;IAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE;AAoB5K,wBAAgB,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,SAAqB,EAAE,cAAmB,EAAE,kBAAkB,EAAE,EAAE,kBAAkB,qBA0B9H;AACD,eAAe,aAAa,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as e, c as t, d as n, f as r, i, l as a, m as o, n as s, o as c, p as l, r as u, s as d, t as f, u as p, x as m } from "../components-
|
|
1
|
+
import { a as e, c as t, d as n, f as r, i, l as a, m as o, n as s, o as c, p as l, r as u, s as d, t as f, u as p, x as m } from "../components-C5p2TfIU.js";
|
|
2
2
|
import { t as h } from "../KeyManagementPanel-DZuSeWBK.js";
|
|
3
3
|
import { ManagedInstancePanel as g } from "./ManagedInstancePanel.js";
|
|
4
4
|
export { c as AgentExplorer, f as ApplicationDesigner, p as CapabilityExplorer, t as ConflictExplorer, a as ExecutionViewer, s as GlobalSearch, i as HealthCenter, h as KeyManagementPanel, g as ManagedInstancePanel, r as OperationsExplorer, m as OverviewDashboard, n as PeerMap, e as ProvenanceViewer, l as ReferenceExplorer, u as SettingsPanel, o as StateExplorer, d as WorkflowVisualizer };
|
|
@@ -281,22 +281,27 @@ function C({ db: e, definition: t, namespace: n, bridgedItems: r }) {
|
|
|
281
281
|
]
|
|
282
282
|
});
|
|
283
283
|
}
|
|
284
|
-
function w({ db: e, model: t, namespace: r = "default", applicationUrl: o = "" }) {
|
|
285
|
-
let
|
|
284
|
+
function w({ db: e, model: t, namespace: r = "default", applicationUrl: o = "", developmentSession: l }) {
|
|
285
|
+
let u = i(null), [d, f] = a(null);
|
|
286
286
|
return n(() => {
|
|
287
287
|
if (!o) return;
|
|
288
|
-
let e = new URL(o).origin, t = () =>
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
288
|
+
let e = new URL(o).origin, t = () => {
|
|
289
|
+
l?.sessionId && u.current?.contentWindow?.postMessage({
|
|
290
|
+
type: "feltdb:dev-session",
|
|
291
|
+
session: l
|
|
292
|
+
}, e), u.current?.contentWindow?.postMessage({
|
|
293
|
+
type: "feltdb:studio:read",
|
|
294
|
+
requestId: "live"
|
|
295
|
+
}, e);
|
|
296
|
+
}, n = (n) => {
|
|
297
|
+
n.origin === e && (n.data?.type === "feltdb:studio:ready" && t(), n.data?.type === "feltdb:studio:data" && f(n.data.records));
|
|
293
298
|
};
|
|
294
299
|
window.addEventListener("message", n);
|
|
295
300
|
let r = window.setInterval(t, 1500);
|
|
296
301
|
return () => {
|
|
297
302
|
window.removeEventListener("message", n), window.clearInterval(r);
|
|
298
303
|
};
|
|
299
|
-
}, [o]), /* @__PURE__ */ c("div", {
|
|
304
|
+
}, [o, l]), /* @__PURE__ */ c("div", {
|
|
300
305
|
className: "studio-model-page",
|
|
301
306
|
children: [
|
|
302
307
|
/* @__PURE__ */ c("header", { children: [
|
|
@@ -308,14 +313,20 @@ function w({ db: e, model: t, namespace: r = "default", applicationUrl: o = "" }
|
|
|
308
313
|
/* @__PURE__ */ s("p", { children: "Live application records grouped by collection. Select a record to inspect every field." })
|
|
309
314
|
] }),
|
|
310
315
|
o && /* @__PURE__ */ s("iframe", {
|
|
311
|
-
ref:
|
|
316
|
+
ref: u,
|
|
312
317
|
className: "studio-data-bridge",
|
|
313
318
|
src: o,
|
|
314
319
|
title: "FeltDB application data bridge",
|
|
315
|
-
onLoad: () =>
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
320
|
+
onLoad: () => {
|
|
321
|
+
let e = new URL(o).origin;
|
|
322
|
+
l?.sessionId && u.current?.contentWindow?.postMessage({
|
|
323
|
+
type: "feltdb:dev-session",
|
|
324
|
+
session: l
|
|
325
|
+
}, e), u.current?.contentWindow?.postMessage({
|
|
326
|
+
type: "feltdb:studio:read",
|
|
327
|
+
requestId: "initial"
|
|
328
|
+
}, e);
|
|
329
|
+
}
|
|
319
330
|
}),
|
|
320
331
|
/* @__PURE__ */ c("div", {
|
|
321
332
|
className: "model-summary",
|
|
@@ -331,7 +342,7 @@ function w({ db: e, model: t, namespace: r = "default", applicationUrl: o = "" }
|
|
|
331
342
|
db: e ?? null,
|
|
332
343
|
definition: t,
|
|
333
344
|
namespace: r,
|
|
334
|
-
bridgedItems:
|
|
345
|
+
bridgedItems: d?.[t.name]
|
|
335
346
|
}, t.name)), !t?.collections.length && /* @__PURE__ */ c("div", {
|
|
336
347
|
className: "model-empty",
|
|
337
348
|
children: [
|