@on-mission/sdk 0.1.4 → 0.1.8

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 (54) hide show
  1. package/dist/chunk-N26TYEUP.js +50 -0
  2. package/dist/chunk-N26TYEUP.js.map +1 -0
  3. package/dist/debug-log-SHNBLZWL.js +9 -0
  4. package/dist/debug-log-SHNBLZWL.js.map +1 -0
  5. package/dist/index.d.ts +847 -18
  6. package/dist/index.js +15731 -11
  7. package/dist/index.js.map +1 -1
  8. package/package.json +1 -2
  9. package/dist/api.d.ts +0 -20
  10. package/dist/api.d.ts.map +0 -1
  11. package/dist/api.js +0 -39
  12. package/dist/api.js.map +0 -1
  13. package/dist/auth-failure-tracker.d.ts +0 -22
  14. package/dist/auth-failure-tracker.d.ts.map +0 -1
  15. package/dist/auth-failure-tracker.js +0 -31
  16. package/dist/auth-failure-tracker.js.map +0 -1
  17. package/dist/auth.d.ts +0 -65
  18. package/dist/auth.d.ts.map +0 -1
  19. package/dist/auth.js +0 -45
  20. package/dist/auth.js.map +0 -1
  21. package/dist/config.d.ts +0 -39
  22. package/dist/config.d.ts.map +0 -1
  23. package/dist/config.js +0 -28
  24. package/dist/config.js.map +0 -1
  25. package/dist/context.d.ts +0 -24
  26. package/dist/context.d.ts.map +0 -1
  27. package/dist/context.js +0 -22
  28. package/dist/context.js.map +0 -1
  29. package/dist/event-handler.d.ts +0 -16
  30. package/dist/event-handler.d.ts.map +0 -1
  31. package/dist/event-handler.js +0 -27
  32. package/dist/event-handler.js.map +0 -1
  33. package/dist/http-server.d.ts +0 -51
  34. package/dist/http-server.d.ts.map +0 -1
  35. package/dist/http-server.js +0 -163
  36. package/dist/http-server.js.map +0 -1
  37. package/dist/index.d.ts.map +0 -1
  38. package/dist/ingress.d.ts +0 -133
  39. package/dist/ingress.d.ts.map +0 -1
  40. package/dist/ingress.js +0 -89
  41. package/dist/ingress.js.map +0 -1
  42. package/dist/logging.d.ts +0 -63
  43. package/dist/logging.d.ts.map +0 -1
  44. package/dist/logging.js +0 -171
  45. package/dist/logging.js.map +0 -1
  46. package/dist/sdk.d.ts +0 -197
  47. package/dist/sdk.d.ts.map +0 -1
  48. package/dist/sdk.js +0 -435
  49. package/dist/sdk.js.map +0 -1
  50. package/dist/tool-registry.d.ts +0 -49
  51. package/dist/tool-registry.d.ts.map +0 -1
  52. package/dist/tool-registry.js +0 -37
  53. package/dist/tool-registry.js.map +0 -1
  54. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,163 +0,0 @@
1
- /**
2
- * HTTP Server
3
- *
4
- * Internal HTTP server that runs inside the skill's Daytona sandbox.
5
- * This is the inbound entrypoint for all traffic to the skill:
6
- *
7
- * Mission API → Daytona Preview URL → this server:
8
- * POST /_mission/tools/:toolName — tool call dispatch
9
- * GET /_mission/health — health check
10
- * GET /_mission/ping — keep-alive ping (resets Daytona auto-stop)
11
- *
12
- * External services → Daytona Signed Preview URL → this server:
13
- * POST /{ingressPath} — webhook delivery
14
- * GET /{ingressPath} (ws upgrade) — WebSocket stream (e.g., Twilio media)
15
- *
16
- * The server is started by mission.connect() and stopped during graceful shutdown.
17
- * Skill authors never interact with it directly — they register tool handlers
18
- * and ingress handlers through the SDK, and this server routes to them.
19
- *
20
- * See docs/technical/architecture/skills/architecture.md §4.1.
21
- * See docs/technical/architecture/skills/sandbox-runtime.md §2-3.
22
- */
23
- import * as http from 'node:http';
24
- // ─── Helpers ─────────────────────────────────────────────────────────────────
25
- function parseQueryString(qs) {
26
- const params = {};
27
- if (!qs)
28
- return params;
29
- for (const pair of qs.split('&')) {
30
- const [key, value] = pair.split('=');
31
- if (key) {
32
- params[decodeURIComponent(key)] = decodeURIComponent(value ?? '');
33
- }
34
- }
35
- return params;
36
- }
37
- function readBody(req) {
38
- return new Promise((resolve, reject) => {
39
- const chunks = [];
40
- req.on('data', (chunk) => chunks.push(chunk));
41
- req.on('end', () => resolve(Buffer.concat(chunks).toString('utf-8')));
42
- req.on('error', reject);
43
- });
44
- }
45
- function matchRoute(routes, method, path) {
46
- const pathSegments = path.split('/').filter(Boolean);
47
- for (const route of routes) {
48
- if (route.method !== method && route.method !== '*')
49
- continue;
50
- const routeSegments = route.segments;
51
- if (routeSegments.length !== pathSegments.length)
52
- continue;
53
- const params = {};
54
- let match = true;
55
- for (let i = 0; i < routeSegments.length; i++) {
56
- const routeSeg = routeSegments[i];
57
- const pathSeg = pathSegments[i];
58
- if (routeSeg.startsWith(':')) {
59
- params[routeSeg.slice(1)] = pathSeg;
60
- }
61
- else if (routeSeg !== pathSeg) {
62
- match = false;
63
- break;
64
- }
65
- }
66
- if (match)
67
- return { route, params };
68
- }
69
- return null;
70
- }
71
- // ─── Factory ─────────────────────────────────────────────────────────────────
72
- export function createHttpServer() {
73
- const routes = [];
74
- let server = null;
75
- let _listenPort = 0;
76
- const skillServer = {
77
- server: null,
78
- port: 0,
79
- route(method, pattern, handler) {
80
- routes.push({
81
- method: method.toUpperCase(),
82
- pattern,
83
- segments: pattern.split('/').filter(Boolean),
84
- handler
85
- });
86
- },
87
- start(port) {
88
- return new Promise((resolve, reject) => {
89
- server = http.createServer(async (req, res) => {
90
- const urlParts = (req.url ?? '/').split('?');
91
- const path = urlParts[0];
92
- const queryString = urlParts[1] ?? '';
93
- const method = (req.method ?? 'GET').toUpperCase();
94
- const matched = matchRoute(routes, method, path);
95
- if (!matched) {
96
- res.writeHead(404, { 'Content-Type': 'application/json' });
97
- res.end(JSON.stringify({ error: 'Not found', path }));
98
- return;
99
- }
100
- try {
101
- const body = await readBody(req);
102
- const headers = {};
103
- for (const [key, value] of Object.entries(req.headers)) {
104
- if (typeof value === 'string') {
105
- headers[key.toLowerCase()] = value;
106
- }
107
- }
108
- const parsed = {
109
- method,
110
- path,
111
- headers,
112
- body,
113
- query: parseQueryString(queryString),
114
- params: matched.params
115
- };
116
- const result = await matched.route.handler(parsed);
117
- const responseHeaders = {
118
- 'Content-Type': 'application/json',
119
- ...(result.headers ?? {})
120
- };
121
- res.writeHead(result.status, responseHeaders);
122
- res.end(result.body ?? '');
123
- }
124
- catch (err) {
125
- console.error('[HttpServer] Handler error:', err);
126
- res.writeHead(500, { 'Content-Type': 'application/json' });
127
- res.end(JSON.stringify({
128
- error: 'Internal server error',
129
- message: err instanceof Error ? err.message : String(err)
130
- }));
131
- }
132
- });
133
- server.on('error', reject);
134
- server.listen(port, () => {
135
- _listenPort = port;
136
- skillServer.server = server;
137
- skillServer.port = port;
138
- console.error(`[HttpServer] Listening on port ${port}`);
139
- resolve();
140
- });
141
- });
142
- },
143
- stop() {
144
- return new Promise((resolve, reject) => {
145
- if (!server) {
146
- resolve();
147
- return;
148
- }
149
- server.close(err => {
150
- if (err) {
151
- reject(err);
152
- }
153
- else {
154
- console.error('[HttpServer] Server stopped');
155
- resolve();
156
- }
157
- });
158
- });
159
- }
160
- };
161
- return skillServer;
162
- }
163
- //# sourceMappingURL=http-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,YAAY,EACV,IAAI,EACJ,YAAY,EACZ,sBAAsB,EACtB,QAAQ,EACT,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAC3E,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7C,YAAY,EACV,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACX,MAAM,iBAAiB,CAAA;AACxB,YAAY,EACV,cAAc,EACd,aAAa,EACb,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,UAAU,EACX,MAAM,WAAW,CAAA;AAClB,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC1C,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAA;AACxC,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,WAAW,EACZ,MAAM,iBAAiB,CAAA;AAIxB,wEAAwE;AACxE,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC,CAAA;AAED,kFAAkF;AAClF,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,OAAO,CAAA;CACd,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,eAAe,CAAA;CAC3B,CAAA"}
package/dist/ingress.d.ts DELETED
@@ -1,133 +0,0 @@
1
- /**
2
- * Ingress Module
3
- *
4
- * Handles inbound traffic from external services (webhooks, WebSocket streams).
5
- * Skills register handlers per endpoint name; the HTTP server routes traffic
6
- * to them.
7
- *
8
- * Traffic flow (HTTP-native, no WebSocket control plane):
9
- *
10
- * Tool calls from Mission API:
11
- * Mission API → Daytona Standard Preview URL → HTTP server → tool handler
12
- *
13
- * Webhooks from external services:
14
- * External service → Daytona Signed Preview URL → HTTP server → ingress handler
15
- *
16
- * WebSocket streams (e.g., Twilio media):
17
- * External service → Daytona Signed Preview URL → HTTP server → stream handler
18
- *
19
- * The HTTP server (started by mission.connect()) dispatches to the registered
20
- * handler and sends the response back as a standard HTTP response.
21
- *
22
- * For WebSocket endpoints: event-based model (connect, message, disconnect).
23
- * WebSocket support depends on Daytona Preview URL proxy supporting upgrades.
24
- *
25
- * Endpoint names are chosen by the skill author at registration time.
26
- * There is no need to pre-declare them in mission.json — the SDK registers
27
- * them dynamically and reports them to the control plane at ready().
28
- *
29
- * See docs/technical/architecture/skills/architecture.md §4.4.
30
- * See docs/technical/architecture/skills/sandbox-runtime.md §2-3.
31
- */
32
- import type { ApiClient } from './api';
33
- export type IngressRequest = {
34
- /** HTTP method (GET, POST, etc.). */
35
- method: string;
36
- /** Request path (relative to the ingress endpoint). */
37
- path: string;
38
- /** Request headers (lowercased keys). */
39
- headers: Record<string, string>;
40
- /** Raw request body as a string. */
41
- body: string;
42
- /** Parsed query parameters. */
43
- query: Record<string, string>;
44
- };
45
- export type IngressResponse = {
46
- /** HTTP status code. */
47
- status: number;
48
- /** Response headers. */
49
- headers?: Record<string, string>;
50
- /** Response body. */
51
- body?: string;
52
- };
53
- export type IngressHandler = (request: IngressRequest) => Promise<IngressResponse>;
54
- export type IngressStreamEvents = {
55
- /** Called when a new WebSocket connection is established. */
56
- onConnect: (streamId: string, metadata: Record<string, string>) => void;
57
- /** Called when a message is received on the WebSocket. */
58
- onMessage: (streamId: string, data: string) => void;
59
- /** Called when the WebSocket disconnects. */
60
- onDisconnect: (streamId: string) => void;
61
- };
62
- /**
63
- * Result from requesting a public ingress URL.
64
- * The URL is a Daytona Signed Preview URL with a configurable TTL.
65
- * The skill is responsible for monitoring expiry and re-requesting.
66
- */
67
- export type IngressUrl = {
68
- /** The public URL to register with external services. */
69
- url: string;
70
- /** ISO 8601 timestamp when this URL expires. */
71
- expiresAt: string;
72
- };
73
- export type IngressModule = {
74
- /**
75
- * Register a handler for an HTTP ingress endpoint.
76
- * The endpoint name is chosen by the skill author.
77
- *
78
- * @example
79
- * ```ts
80
- * mission.ingress.on('webhook', async (request) => {
81
- * const payload = JSON.parse(request.body)
82
- * // process webhook...
83
- * return { status: 200 }
84
- * })
85
- * ```
86
- */
87
- on: (endpointName: string, handler: IngressHandler) => void;
88
- /**
89
- * Register handlers for a WebSocket ingress endpoint.
90
- * The endpoint name is chosen by the skill author.
91
- *
92
- * @example
93
- * ```ts
94
- * mission.ingress.onStream('media', {
95
- * onConnect: (streamId, meta) => { startSession(streamId) },
96
- * onMessage: (streamId, data) => { processAudio(streamId, data) },
97
- * onDisconnect: (streamId) => { endSession(streamId) }
98
- * })
99
- * ```
100
- */
101
- onStream: (endpointName: string, handlers: IngressStreamEvents) => void;
102
- /**
103
- * Get a public URL for a named ingress endpoint.
104
- *
105
- * The control plane generates a Daytona Signed Preview URL with a
106
- * configurable TTL. The skill is responsible for:
107
- * 1. Registering this URL with the external service.
108
- * 2. Monitoring `expiresAt` and calling this again before expiry.
109
- * 3. Re-registering the new URL with the external service.
110
- *
111
- * On sandbox restart, skill processes restart and naturally
112
- * re-register during their startup sequence.
113
- *
114
- * @example
115
- * ```ts
116
- * const { url, expiresAt } = await mission.ingress.getPublicUrl('webhook')
117
- * await twilio.incomingPhoneNumbers(sid).update({ voiceUrl: url })
118
- * ```
119
- */
120
- getPublicUrl: (endpointName: string) => Promise<IngressUrl>;
121
- };
122
- export type IngressRegistry = IngressModule & {
123
- /** Dispatch an HTTP request to the registered handler. */
124
- dispatch: (endpointName: string, request: IngressRequest) => Promise<IngressResponse>;
125
- /** Dispatch WebSocket events to the registered stream handlers. */
126
- dispatchStreamEvent: (endpointName: string, event: 'connect' | 'message' | 'disconnect', streamId: string, data?: string, metadata?: Record<string, string>) => void;
127
- /** Get all registered HTTP endpoint names. */
128
- getHttpEndpointNames: () => string[];
129
- /** Get all registered stream endpoint names. */
130
- getStreamEndpointNames: () => string[];
131
- };
132
- export declare function createIngressRegistry(api: ApiClient): IngressRegistry;
133
- //# sourceMappingURL=ingress.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ingress.d.ts","sourceRoot":"","sources":["../src/ingress.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,MAAM,MAAM,cAAc,GAAG;IAC3B,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAA;IACZ,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,eAAe,CAAC,CAAA;AAI7B,MAAM,MAAM,mBAAmB,GAAG;IAChC,6DAA6D;IAC7D,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAA;IACvE,0DAA0D;IAC1D,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnD,6CAA6C;IAC7C,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;CACzC,CAAA;AAID;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,yDAAyD;IACzD,GAAG,EAAE,MAAM,CAAA;IACX,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B;;;;;;;;;;;;OAYG;IACH,EAAE,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,CAAA;IAE3D;;;;;;;;;;;;OAYG;IACH,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,KAAK,IAAI,CAAA;IAEvE;;;;;;;;;;;;;;;;;OAiBG;IACH,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;CAC5D,CAAA;AAID,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG;IAC5C,0DAA0D;IAC1D,QAAQ,EAAE,CACR,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,eAAe,CAAC,CAAA;IAC7B,mEAAmE;IACnE,mBAAmB,EAAE,CACnB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,YAAY,EAC3C,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC9B,IAAI,CAAA;IACT,8CAA8C;IAC9C,oBAAoB,EAAE,MAAM,MAAM,EAAE,CAAA;IACpC,gDAAgD;IAChD,sBAAsB,EAAE,MAAM,MAAM,EAAE,CAAA;CACvC,CAAA;AAID,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,SAAS,GAAG,eAAe,CA+ErE"}
package/dist/ingress.js DELETED
@@ -1,89 +0,0 @@
1
- /**
2
- * Ingress Module
3
- *
4
- * Handles inbound traffic from external services (webhooks, WebSocket streams).
5
- * Skills register handlers per endpoint name; the HTTP server routes traffic
6
- * to them.
7
- *
8
- * Traffic flow (HTTP-native, no WebSocket control plane):
9
- *
10
- * Tool calls from Mission API:
11
- * Mission API → Daytona Standard Preview URL → HTTP server → tool handler
12
- *
13
- * Webhooks from external services:
14
- * External service → Daytona Signed Preview URL → HTTP server → ingress handler
15
- *
16
- * WebSocket streams (e.g., Twilio media):
17
- * External service → Daytona Signed Preview URL → HTTP server → stream handler
18
- *
19
- * The HTTP server (started by mission.connect()) dispatches to the registered
20
- * handler and sends the response back as a standard HTTP response.
21
- *
22
- * For WebSocket endpoints: event-based model (connect, message, disconnect).
23
- * WebSocket support depends on Daytona Preview URL proxy supporting upgrades.
24
- *
25
- * Endpoint names are chosen by the skill author at registration time.
26
- * There is no need to pre-declare them in mission.json — the SDK registers
27
- * them dynamically and reports them to the control plane at ready().
28
- *
29
- * See docs/technical/architecture/skills/architecture.md §4.4.
30
- * See docs/technical/architecture/skills/sandbox-runtime.md §2-3.
31
- */
32
- // ─── Factory ─────────────────────────────────────────────────────────────────
33
- export function createIngressRegistry(api) {
34
- const httpHandlers = new Map();
35
- const streamHandlers = new Map();
36
- return {
37
- on(endpointName, handler) {
38
- if (httpHandlers.has(endpointName)) {
39
- console.error(`[Ingress] Warning: overwriting handler for '${endpointName}'`);
40
- }
41
- httpHandlers.set(endpointName, handler);
42
- },
43
- onStream(endpointName, handlers) {
44
- if (streamHandlers.has(endpointName)) {
45
- console.error(`[Ingress] Warning: overwriting stream handlers for '${endpointName}'`);
46
- }
47
- streamHandlers.set(endpointName, handlers);
48
- },
49
- getPublicUrl: async (endpointName) => {
50
- const result = (await api.trpc.skill.getIngressUrl.query({
51
- name: endpointName
52
- }));
53
- return result;
54
- },
55
- async dispatch(endpointName, request) {
56
- const handler = httpHandlers.get(endpointName);
57
- if (!handler) {
58
- console.error(`[Ingress] No handler registered for endpoint '${endpointName}'`);
59
- return { status: 404, body: `No handler for endpoint: ${endpointName}` };
60
- }
61
- return handler(request);
62
- },
63
- dispatchStreamEvent(endpointName, event, streamId, data, metadata) {
64
- const handlers = streamHandlers.get(endpointName);
65
- if (!handlers) {
66
- console.error(`[Ingress] No stream handlers for endpoint '${endpointName}'`);
67
- return;
68
- }
69
- switch (event) {
70
- case 'connect':
71
- handlers.onConnect(streamId, metadata ?? {});
72
- break;
73
- case 'message':
74
- handlers.onMessage(streamId, data ?? '');
75
- break;
76
- case 'disconnect':
77
- handlers.onDisconnect(streamId);
78
- break;
79
- }
80
- },
81
- getHttpEndpointNames() {
82
- return Array.from(httpHandlers.keys());
83
- },
84
- getStreamEndpointNames() {
85
- return Array.from(streamHandlers.keys());
86
- }
87
- };
88
- }
89
- //# sourceMappingURL=ingress.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ingress.js","sourceRoot":"","sources":["../src/ingress.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAmIH,gFAAgF;AAEhF,MAAM,UAAU,qBAAqB,CAAC,GAAc;IAClD,MAAM,YAAY,GAAG,IAAI,GAAG,EAA0B,CAAA;IACtD,MAAM,cAAc,GAAG,IAAI,GAAG,EAA+B,CAAA;IAE7D,OAAO;QACL,EAAE,CAAC,YAAoB,EAAE,OAAuB;YAC9C,IAAI,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,KAAK,CACX,+CAA+C,YAAY,GAAG,CAC/D,CAAA;YACH,CAAC;YACD,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QACzC,CAAC;QAED,QAAQ,CAAC,YAAoB,EAAE,QAA6B;YAC1D,IAAI,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,KAAK,CACX,uDAAuD,YAAY,GAAG,CACvE,CAAA;YACH,CAAC;YACD,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;QAC5C,CAAC;QAED,YAAY,EAAE,KAAK,EAAE,YAAoB,EAAuB,EAAE;YAChE,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;gBACvD,IAAI,EAAE,YAAY;aACnB,CAAC,CAAe,CAAA;YACjB,OAAO,MAAM,CAAA;QACf,CAAC;QAED,KAAK,CAAC,QAAQ,CACZ,YAAoB,EACpB,OAAuB;YAEvB,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;YAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CACX,iDAAiD,YAAY,GAAG,CACjE,CAAA;gBACD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,4BAA4B,YAAY,EAAE,EAAE,CAAA;YAC1E,CAAC;YACD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAA;QACzB,CAAC;QAED,mBAAmB,CACjB,YAAoB,EACpB,KAA2C,EAC3C,QAAgB,EAChB,IAAa,EACb,QAAiC;YAEjC,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;YACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CACX,8CAA8C,YAAY,GAAG,CAC9D,CAAA;gBACD,OAAM;YACR,CAAC;YACD,QAAQ,KAAK,EAAE,CAAC;gBACd,KAAK,SAAS;oBACZ,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAA;oBAC5C,MAAK;gBACP,KAAK,SAAS;oBACZ,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,CAAA;oBACxC,MAAK;gBACP,KAAK,YAAY;oBACf,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;oBAC/B,MAAK;YACT,CAAC;QACH,CAAC;QAED,oBAAoB;YAClB,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAA;QACxC,CAAC;QAED,sBAAsB;YACpB,OAAO,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAA;QAC1C,CAAC;KACF,CAAA;AACH,CAAC"}
package/dist/logging.d.ts DELETED
@@ -1,63 +0,0 @@
1
- /**
2
- * Logging Module
3
- *
4
- * Provides two logging mechanisms:
5
- *
6
- * 1. Console capture — overrides the global `console` object so that
7
- * skill authors who use `console.log()` naturally get their logs
8
- * forwarded to the Mission logging pipeline.
9
- *
10
- * 2. Structured logger — `mission.log.info(message, data?)` for skills
11
- * that want explicit, structured logging with context.
12
- *
13
- * Both paths feed into the same batched transport. Log entries are
14
- * buffered in memory and flushed every few seconds (or on threshold)
15
- * to the Gateway via `skill.ingestLogs`. The Gateway enriches entries
16
- * with installation metadata and forwards them to Better Stack.
17
- *
18
- * Transport: skill.ingestLogs tRPC mutation (batched, fire-and-forget).
19
- */
20
- import type { ApiClient } from './api';
21
- import type { AuthFailureTracker } from './auth-failure-tracker';
22
- type LogLevel = 'log' | 'error' | 'warn' | 'info' | 'debug';
23
- export type LogEntry = {
24
- level: LogLevel;
25
- message: string;
26
- data?: Record<string, unknown>;
27
- timestamp: string;
28
- };
29
- export type LogModule = {
30
- /** Log at info level. */
31
- info: (message: string, data?: Record<string, unknown>) => void;
32
- /** Log at warn level. */
33
- warn: (message: string, data?: Record<string, unknown>) => void;
34
- /** Log at error level. */
35
- error: (message: string, data?: Record<string, unknown>) => void;
36
- /** Log at debug level. */
37
- debug: (message: string, data?: Record<string, unknown>) => void;
38
- };
39
- /**
40
- * Override the global console to capture and forward all log output.
41
- *
42
- * This should be called once during SDK initialization (in connect()).
43
- * After this call, all console.log/error/warn/info/debug calls will
44
- * be intercepted, enriched with metadata, and batched for shipping.
45
- */
46
- export declare function installLogging(api: ApiClient, tracker?: AuthFailureTracker): void;
47
- /**
48
- * Create a structured log module.
49
- *
50
- * Unlike the console override (which captures string output), this
51
- * provides a typed API with structured data:
52
- *
53
- * mission.log.info('Searching inbox', { query, maxResults })
54
- * mission.log.error('Gmail API failed', { status: 401 })
55
- */
56
- export declare function createLogModule(): LogModule;
57
- /**
58
- * Flush any remaining logs and stop the timer.
59
- * Called during graceful shutdown.
60
- */
61
- export declare function flushAndStop(): Promise<void>;
62
- export {};
63
- //# sourceMappingURL=logging.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAIhE,KAAK,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAE3D,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,EAAE,QAAQ,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,yBAAyB;IACzB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAC/D,yBAAyB;IACzB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAC/D,0BAA0B;IAC1B,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAChE,0BAA0B;IAC1B,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CACjE,CAAA;AAmED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,SAAS,EACd,OAAO,CAAC,EAAE,kBAAkB,GAC3B,IAAI,CAkDN;AAID;;;;;;;;GAQG;AACH,wBAAgB,eAAe,IAAI,SAAS,CA4B3C;AAID;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlD"}
package/dist/logging.js DELETED
@@ -1,171 +0,0 @@
1
- /**
2
- * Logging Module
3
- *
4
- * Provides two logging mechanisms:
5
- *
6
- * 1. Console capture — overrides the global `console` object so that
7
- * skill authors who use `console.log()` naturally get their logs
8
- * forwarded to the Mission logging pipeline.
9
- *
10
- * 2. Structured logger — `mission.log.info(message, data?)` for skills
11
- * that want explicit, structured logging with context.
12
- *
13
- * Both paths feed into the same batched transport. Log entries are
14
- * buffered in memory and flushed every few seconds (or on threshold)
15
- * to the Gateway via `skill.ingestLogs`. The Gateway enriches entries
16
- * with installation metadata and forwards them to Better Stack.
17
- *
18
- * Transport: skill.ingestLogs tRPC mutation (batched, fire-and-forget).
19
- */
20
- import { TRPCClientError } from '@trpc/client';
21
- // ─── Constants ───────────────────────────────────────────────────────────────
22
- /** How often to flush the log buffer (ms). */
23
- const FLUSH_INTERVAL_MS = 5_000;
24
- /** Max entries before triggering an early flush. */
25
- const FLUSH_THRESHOLD = 50;
26
- // ─── Buffer ──────────────────────────────────────────────────────────────────
27
- let buffer = [];
28
- let flushTimer = null;
29
- let apiRef = null;
30
- let trackerRef = null;
31
- let originalConsole = null;
32
- function getOriginal() {
33
- // Return saved originals if we've installed console override,
34
- // otherwise return the current console (pre-install).
35
- return (originalConsole ?? {
36
- log: console.log.bind(console),
37
- error: console.error.bind(console),
38
- warn: console.warn.bind(console),
39
- info: console.info.bind(console),
40
- debug: console.debug.bind(console)
41
- });
42
- }
43
- function enqueue(entry) {
44
- buffer.push(entry);
45
- if (buffer.length >= FLUSH_THRESHOLD) {
46
- void flush();
47
- }
48
- }
49
- async function flush() {
50
- if (buffer.length === 0 || !apiRef)
51
- return;
52
- const entries = buffer;
53
- buffer = [];
54
- try {
55
- await apiRef.trpc.skill.ingestLogs.mutate({ entries });
56
- trackerRef?.recordSuccess();
57
- }
58
- catch (err) {
59
- getOriginal().error('[Logging] Flush failed:', err);
60
- if (err instanceof TRPCClientError && err.data?.code === 'UNAUTHORIZED') {
61
- trackerRef?.recordFailure();
62
- return; // Don't re-enqueue — they'd fail again with the same error
63
- }
64
- // Re-enqueue failed entries (drop if buffer is huge to avoid OOM)
65
- if (buffer.length < 500) {
66
- buffer.unshift(...entries);
67
- }
68
- }
69
- }
70
- // ─── Console Override ────────────────────────────────────────────────────────
71
- /**
72
- * Override the global console to capture and forward all log output.
73
- *
74
- * This should be called once during SDK initialization (in connect()).
75
- * After this call, all console.log/error/warn/info/debug calls will
76
- * be intercepted, enriched with metadata, and batched for shipping.
77
- */
78
- export function installLogging(api, tracker) {
79
- apiRef = api;
80
- trackerRef = tracker ?? null;
81
- // Preserve original console methods
82
- originalConsole = {
83
- log: console.log.bind(console),
84
- error: console.error.bind(console),
85
- warn: console.warn.bind(console),
86
- info: console.info.bind(console),
87
- debug: console.debug.bind(console)
88
- };
89
- const levels = ['log', 'error', 'warn', 'info', 'debug'];
90
- for (const level of levels) {
91
- console[level] = (...args) => {
92
- // 1. Still output to stdout/stderr for local visibility
93
- originalConsole[level](...args);
94
- // 2. Format the message
95
- const message = args
96
- .map(arg => {
97
- if (typeof arg === 'string')
98
- return arg;
99
- if (arg instanceof Error)
100
- return `${arg.name}: ${arg.message}`;
101
- try {
102
- return JSON.stringify(arg);
103
- }
104
- catch {
105
- return String(arg);
106
- }
107
- })
108
- .join(' ');
109
- // 3. Enqueue for batched shipping
110
- enqueue({
111
- level,
112
- message,
113
- timestamp: new Date().toISOString()
114
- });
115
- };
116
- }
117
- // Start the flush timer
118
- flushTimer = setInterval(() => {
119
- void flush();
120
- }, FLUSH_INTERVAL_MS);
121
- if (flushTimer.unref) {
122
- flushTimer.unref();
123
- }
124
- }
125
- // ─── Structured Logger ───────────────────────────────────────────────────────
126
- /**
127
- * Create a structured log module.
128
- *
129
- * Unlike the console override (which captures string output), this
130
- * provides a typed API with structured data:
131
- *
132
- * mission.log.info('Searching inbox', { query, maxResults })
133
- * mission.log.error('Gmail API failed', { status: 401 })
134
- */
135
- export function createLogModule() {
136
- const log = (level, message, data) => {
137
- // Also output to local console for sandbox visibility
138
- const orig = getOriginal();
139
- if (data) {
140
- orig[level](`[${level.toUpperCase()}]`, message, data);
141
- }
142
- else {
143
- orig[level](`[${level.toUpperCase()}]`, message);
144
- }
145
- enqueue({
146
- level,
147
- message,
148
- data,
149
- timestamp: new Date().toISOString()
150
- });
151
- };
152
- return {
153
- info: (message, data) => log('info', message, data),
154
- warn: (message, data) => log('warn', message, data),
155
- error: (message, data) => log('error', message, data),
156
- debug: (message, data) => log('debug', message, data)
157
- };
158
- }
159
- // ─── Lifecycle ───────────────────────────────────────────────────────────────
160
- /**
161
- * Flush any remaining logs and stop the timer.
162
- * Called during graceful shutdown.
163
- */
164
- export async function flushAndStop() {
165
- if (flushTimer) {
166
- clearInterval(flushTimer);
167
- flushTimer = null;
168
- }
169
- await flush();
170
- }
171
- //# sourceMappingURL=logging.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"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"}