@shardworks/spider-apparatus 0.1.225 → 0.1.227
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/oculus-routes.d.ts +17 -2
- package/dist/oculus-routes.d.ts.map +1 -1
- package/dist/oculus-routes.js +9 -79
- package/dist/oculus-routes.js.map +1 -1
- package/package.json +9 -9
- package/src/static/spider-ui.test.ts +500 -0
- package/src/static/spider.js +583 -269
package/dist/oculus-routes.d.ts
CHANGED
|
@@ -4,11 +4,17 @@
|
|
|
4
4
|
* Contributes:
|
|
5
5
|
* - GET /api/spider/config — aggregated snapshot of Spider config
|
|
6
6
|
* - GET /api/spider/session-transcript — session transcript and status
|
|
7
|
-
* - GET /api/spider/session-stream — SSE stream of real-time session chunks
|
|
8
7
|
*
|
|
9
8
|
* Does NOT import from @shardworks/oculus-apparatus to avoid a circular
|
|
10
9
|
* package dependency. The route shape is compatible with RouteContribution
|
|
11
10
|
* from the Oculus types.
|
|
11
|
+
*
|
|
12
|
+
* The former /api/spider/session-stream (SSE) route was removed when the
|
|
13
|
+
* Spider UI switched to uniform 2 s polling of /api/spider/session-transcript.
|
|
14
|
+
* The SSE path only worked for in-process (attached) sessions and silently
|
|
15
|
+
* dropped data for detached (cross-process) sessions because the Animator's
|
|
16
|
+
* subscribeToSession cannot bridge processes. Polling the Stacks-backed
|
|
17
|
+
* transcript works uniformly for both attached and detached sessions.
|
|
12
18
|
*/
|
|
13
19
|
import type { Context } from 'hono';
|
|
14
20
|
export declare const spiderRoutes: ({
|
|
@@ -48,6 +54,15 @@ export declare const spiderRoutes: ({
|
|
|
48
54
|
} | {
|
|
49
55
|
method: string;
|
|
50
56
|
path: string;
|
|
51
|
-
handler: (c: Context) => Promise<Response
|
|
57
|
+
handler: (c: Context) => Promise<(Response & import("hono").TypedResponse<{
|
|
58
|
+
error: string;
|
|
59
|
+
}, 400, "json">) | (Response & import("hono").TypedResponse<{
|
|
60
|
+
error: string;
|
|
61
|
+
}, 404, "json">) | (Response & import("hono").TypedResponse<{
|
|
62
|
+
messages: {
|
|
63
|
+
[x: string]: import("hono/utils/types").JSONValue;
|
|
64
|
+
}[];
|
|
65
|
+
sessionStatus: "completed" | "failed" | "cancelled" | "timeout" | "pending" | "running";
|
|
66
|
+
}, import("hono/utils/http-status").ContentfulStatusCode, "json">)>;
|
|
52
67
|
})[];
|
|
53
68
|
//# sourceMappingURL=oculus-routes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oculus-routes.d.ts","sourceRoot":"","sources":["../src/oculus-routes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"oculus-routes.d.ts","sourceRoot":"","sources":["../src/oculus-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAcpC,eAAO,MAAM,YAAY;;;iBAIR,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgBD,OAAO;;;;;;;;;;IA8B7B,CAAC"}
|
package/dist/oculus-routes.js
CHANGED
|
@@ -4,13 +4,18 @@
|
|
|
4
4
|
* Contributes:
|
|
5
5
|
* - GET /api/spider/config — aggregated snapshot of Spider config
|
|
6
6
|
* - GET /api/spider/session-transcript — session transcript and status
|
|
7
|
-
* - GET /api/spider/session-stream — SSE stream of real-time session chunks
|
|
8
7
|
*
|
|
9
8
|
* Does NOT import from @shardworks/oculus-apparatus to avoid a circular
|
|
10
9
|
* package dependency. The route shape is compatible with RouteContribution
|
|
11
10
|
* from the Oculus types.
|
|
11
|
+
*
|
|
12
|
+
* The former /api/spider/session-stream (SSE) route was removed when the
|
|
13
|
+
* Spider UI switched to uniform 2 s polling of /api/spider/session-transcript.
|
|
14
|
+
* The SSE path only worked for in-process (attached) sessions and silently
|
|
15
|
+
* dropped data for detached (cross-process) sessions because the Animator's
|
|
16
|
+
* subscribeToSession cannot bridge processes. Polling the Stacks-backed
|
|
17
|
+
* transcript works uniformly for both attached and detached sessions.
|
|
12
18
|
*/
|
|
13
|
-
import { streamSSE } from 'hono/streaming';
|
|
14
19
|
import { guild } from '@shardworks/nexus-core';
|
|
15
20
|
export const spiderRoutes = [
|
|
16
21
|
{
|
|
@@ -45,8 +50,8 @@ export const spiderRoutes = [
|
|
|
45
50
|
}
|
|
46
51
|
// Read transcript regardless of status. Detached sessions (babysitter)
|
|
47
52
|
// write transcript chunks to SQLite incrementally while the session is
|
|
48
|
-
// still 'running' or 'pending'; the client polls this endpoint
|
|
49
|
-
// refresh the engine view's session log in flight.
|
|
53
|
+
// still 'running' or 'pending'; the client polls this endpoint every
|
|
54
|
+
// 2 s to refresh the engine view's session log in flight.
|
|
50
55
|
const transcriptsBook = stacks.readBook('animator', 'transcripts');
|
|
51
56
|
const transcript = await transcriptsBook.get(sessionId);
|
|
52
57
|
return c.json({
|
|
@@ -55,80 +60,5 @@ export const spiderRoutes = [
|
|
|
55
60
|
});
|
|
56
61
|
},
|
|
57
62
|
},
|
|
58
|
-
{
|
|
59
|
-
method: 'GET',
|
|
60
|
-
path: '/api/spider/session-stream',
|
|
61
|
-
handler: async (c) => {
|
|
62
|
-
const sessionId = c.req.query('sessionId');
|
|
63
|
-
if (!sessionId) {
|
|
64
|
-
return c.json({ error: 'sessionId is required' }, 400);
|
|
65
|
-
}
|
|
66
|
-
const g = guild();
|
|
67
|
-
const stacks = g.apparatus('stacks');
|
|
68
|
-
const sessionsBook = stacks.readBook('animator', 'sessions');
|
|
69
|
-
const session = await sessionsBook.get(sessionId);
|
|
70
|
-
if (!session) {
|
|
71
|
-
return c.json({ error: 'Session not found' }, 404);
|
|
72
|
-
}
|
|
73
|
-
// For already-completed sessions, stream the full transcript and close.
|
|
74
|
-
if (session.status !== 'running') {
|
|
75
|
-
const transcriptsBook = stacks.readBook('animator', 'transcripts');
|
|
76
|
-
const transcript = await transcriptsBook.get(sessionId);
|
|
77
|
-
return streamSSE(c, async (stream) => {
|
|
78
|
-
await stream.writeSSE({
|
|
79
|
-
event: 'transcript',
|
|
80
|
-
data: JSON.stringify({ messages: transcript?.messages ?? [] }),
|
|
81
|
-
});
|
|
82
|
-
await stream.writeSSE({
|
|
83
|
-
event: 'done',
|
|
84
|
-
data: JSON.stringify({ status: session.status }),
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
// For running sessions, subscribe to the Animator's in-process broadcaster.
|
|
89
|
-
const animator = g.apparatus('animator');
|
|
90
|
-
const chunkStream = animator.subscribeToSession(sessionId);
|
|
91
|
-
if (!chunkStream) {
|
|
92
|
-
// The session is marked running in Stacks but has no in-memory broadcaster
|
|
93
|
-
// (e.g. a server restart happened). Return an empty stream so the UI can
|
|
94
|
-
// show a meaningful "no data" state and fall back gracefully.
|
|
95
|
-
return streamSSE(c, async (stream) => {
|
|
96
|
-
await stream.writeSSE({
|
|
97
|
-
event: 'done',
|
|
98
|
-
data: JSON.stringify({ status: 'running', noStream: true }),
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
return streamSSE(c, async (stream) => {
|
|
103
|
-
try {
|
|
104
|
-
for await (const chunk of chunkStream) {
|
|
105
|
-
await stream.writeSSE({
|
|
106
|
-
event: 'chunk',
|
|
107
|
-
data: JSON.stringify(chunk),
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
// All chunks consumed — session has ended. Fetch and emit final transcript.
|
|
111
|
-
const transcriptsBook = stacks.readBook('animator', 'transcripts');
|
|
112
|
-
const transcript = await transcriptsBook.get(sessionId);
|
|
113
|
-
await stream.writeSSE({
|
|
114
|
-
event: 'transcript',
|
|
115
|
-
data: JSON.stringify({ messages: transcript?.messages ?? [] }),
|
|
116
|
-
});
|
|
117
|
-
const finalSession = await sessionsBook.get(sessionId);
|
|
118
|
-
await stream.writeSSE({
|
|
119
|
-
event: 'done',
|
|
120
|
-
data: JSON.stringify({ status: finalSession?.status ?? 'completed' }),
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
catch (err) {
|
|
124
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
125
|
-
await stream.writeSSE({
|
|
126
|
-
event: 'error',
|
|
127
|
-
data: JSON.stringify({ error: message }),
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
},
|
|
132
|
-
},
|
|
133
63
|
];
|
|
134
64
|
//# sourceMappingURL=oculus-routes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oculus-routes.js","sourceRoot":"","sources":["../src/oculus-routes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"oculus-routes.js","sourceRoot":"","sources":["../src/oculus-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAa/C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B;QACE,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,oBAAoB;QAC1B,OAAO,EAAE,CAAC,CAAU,EAAE,EAAE;YACtB,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;YAClB,MAAM,UAAU,GAAG,CAAC,CAAC,SAAS,CAAgB,YAAY,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAY,QAAQ,CAAC,CAAC;YAEhD,OAAO,CAAC,CAAC,IAAI,CAAC;gBACZ,SAAS,EAAE,MAAM,CAAC,aAAa,EAAE;gBACjC,gBAAgB,EAAE,MAAM,CAAC,oBAAoB,EAAE;gBAC/C,aAAa,EAAE,UAAU,CAAC,iBAAiB,EAAE;gBAC7C,UAAU,EAAE,MAAM,CAAC,cAAc,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;KACF;IACD;QACE,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,gCAAgC;QACtC,OAAO,EAAE,KAAK,EAAE,CAAU,EAAE,EAAE;YAC5B,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAE3C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,GAAG,CAAC,CAAC;YACzD,CAAC;YAED,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,CAAY,QAAQ,CAAC,CAAC;YAEhD,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAa,UAAU,EAAE,UAAU,CAAC,CAAC;YACzE,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAElD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;YACrD,CAAC;YAED,uEAAuE;YACvE,uEAAuE;YACvE,qEAAqE;YACrE,0DAA0D;YAC1D,MAAM,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAkB,UAAU,EAAE,aAAa,CAAC,CAAC;YACpF,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAExD,OAAO,CAAC,CAAC,IAAI,CAAC;gBACZ,QAAQ,EAAE,UAAU,EAAE,QAAQ,IAAI,EAAE;gBACpC,aAAa,EAAE,OAAO,CAAC,MAAM;aAC9B,CAAC,CAAC;QACL,CAAC;KACF;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shardworks/spider-apparatus",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.227",
|
|
4
4
|
"license": "ISC",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -22,17 +22,17 @@
|
|
|
22
22
|
"hono": "^4.7.11",
|
|
23
23
|
"yaml": "^2.0.0",
|
|
24
24
|
"zod": "4.3.6",
|
|
25
|
-
"@shardworks/fabricator-apparatus": "0.1.
|
|
26
|
-
"@shardworks/
|
|
27
|
-
"@shardworks/
|
|
28
|
-
"@shardworks/
|
|
29
|
-
"@shardworks/
|
|
30
|
-
"@shardworks/
|
|
31
|
-
"@shardworks/
|
|
25
|
+
"@shardworks/fabricator-apparatus": "0.1.227",
|
|
26
|
+
"@shardworks/stacks-apparatus": "0.1.227",
|
|
27
|
+
"@shardworks/tools-apparatus": "0.1.227",
|
|
28
|
+
"@shardworks/codexes-apparatus": "0.1.227",
|
|
29
|
+
"@shardworks/animator-apparatus": "0.1.227",
|
|
30
|
+
"@shardworks/loom-apparatus": "0.1.227",
|
|
31
|
+
"@shardworks/clerk-apparatus": "0.1.227"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@types/node": "25.5.0",
|
|
35
|
-
"@shardworks/nexus-core": "0.1.
|
|
35
|
+
"@shardworks/nexus-core": "0.1.227"
|
|
36
36
|
},
|
|
37
37
|
"files": [
|
|
38
38
|
"dist",
|