@on-mission/sdk 0.1.4 → 0.1.9

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 +868 -18
  6. package/dist/index.js +15843 -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
package/dist/sdk.d.ts DELETED
@@ -1,197 +0,0 @@
1
- /**
2
- * Mission SDK — Main Entry
3
- *
4
- * Creates the SDK instance that a skill uses to interact with the
5
- * Mission platform. Communication is HTTP-native:
6
- *
7
- * Outbound (Skill → Mission API):
8
- * Standard REST calls via the API client.
9
- *
10
- * Inbound (Mission API → Skill):
11
- * HTTP requests to the skill's HTTP server, exposed via
12
- * Daytona Preview URLs.
13
- *
14
- * Lifecycle:
15
- * 1. const mission = createMissionSDK() — create SDK (no connection yet)
16
- * 2. await mission.connect() — start HTTP server, install logging
17
- * 3. // auth, config are now usable
18
- * 4. mission.tools.registerAll(handlers) — register tool handlers
19
- * 5. mission.ingress.on('name', handler) — register ingress handlers
20
- * 6. mission.on('event_type', handler) — register event handler
21
- * 7. mission.onShutdown(() => cleanup()) — register shutdown hooks
22
- * 8. await mission.ready() — signal readiness, accept traffic
23
- *
24
- * See docs/technical/architecture/skills/architecture.md §4 and §6.
25
- * See docs/technical/architecture/skills/sandbox-runtime.md.
26
- */
27
- import { type AuthModule } from './auth';
28
- import { type ConfigModule } from './config';
29
- import { type SkillContext } from './context';
30
- import { type EventHandler } from './event-handler';
31
- import { type IngressModule } from './ingress';
32
- import { type LogModule } from './logging';
33
- import { type ToolsModule } from './tool-registry';
34
- export type MissionSDKOptions = {
35
- /**
36
- * Override the skill context instead of reading from env.
37
- * Useful for testing or local development.
38
- */
39
- context?: Partial<SkillContext>;
40
- /**
41
- * Override the skill HTTP server port. Normally read from
42
- * MISSION_SKILL_PORT (assigned by the control plane).
43
- * Must be in the Daytona Preview URL range (3000-9999).
44
- */
45
- port?: number;
46
- };
47
- /**
48
- * A message from a skill to the agent.
49
- *
50
- * Skills process their domain-specific inbound data and produce
51
- * human-readable messages that agents can reason about.
52
- */
53
- export type AgentMessage = {
54
- /**
55
- * Human-readable message describing what happened.
56
- * This is what the agent sees and reasons about.
57
- */
58
- message: string;
59
- /**
60
- * Structured context data the agent can reference.
61
- * Include IDs, metadata, and any data that helps the agent
62
- * take follow-up actions using the skill's tools.
63
- */
64
- context?: Record<string, unknown>;
65
- /**
66
- * Optional deduplication key to prevent duplicate processing.
67
- * If the platform has already processed a message with this key,
68
- * it will be silently dropped.
69
- */
70
- deduplicationKey?: string;
71
- };
72
- export type MissionSDK = {
73
- /** The resolved skill context. */
74
- context: SkillContext;
75
- /** Get authentication credentials (user-provided secrets and/or OAuth tokens). */
76
- auth: AuthModule;
77
- /** Fetch per-installation configuration. */
78
- config: ConfigModule;
79
- /** Register ingress handlers and discover public URLs. */
80
- ingress: IngressModule;
81
- /** Structured logger — logs are batched and shipped to the Mission platform. */
82
- log: LogModule;
83
- /** Register tool handlers that the platform can invoke. */
84
- tools: ToolsModule;
85
- /**
86
- * Subscribe to typed events delivered by the platform.
87
- * Use '*' to subscribe to all event types.
88
- *
89
- * @example
90
- * ```ts
91
- * mission.on('mailbox_activity', async (event) => {
92
- * await mission.emit({ message: '...', context: event.payload })
93
- * })
94
- * ```
95
- */
96
- on: (eventName: string, handler: EventHandler) => void;
97
- /**
98
- * Send a message to the agent about an external event.
99
- * The platform routes it to the appropriate agent(s) based on
100
- * the workspace's routing configuration.
101
- *
102
- * Sends an agent message to the platform for processing.
103
- *
104
- * @example
105
- * ```ts
106
- * await mission.emit({
107
- * message: 'New email from john@example.com',
108
- * context: { emailAddress: 'john@example.com' },
109
- * deduplicationKey: 'gmail-push-12345'
110
- * })
111
- * ```
112
- */
113
- emit: (message: AgentMessage) => Promise<void>;
114
- /**
115
- * Connect to the Mission platform.
116
- *
117
- * This starts the skill's HTTP server (for inbound tool calls and
118
- * ingress traffic), installs the console override for structured
119
- * logging, and begins the keep-alive heartbeat loop.
120
- *
121
- * After this call, `auth`, `config`, `emit`, and `ingress.getPublicUrl`
122
- * are usable.
123
- */
124
- connect: () => Promise<void>;
125
- /**
126
- * Signal readiness and start accepting tool calls and ingress traffic.
127
- *
128
- * Call this AFTER registering all tools, ingress handlers, and event handlers.
129
- * The returned promise resolves when the process receives a shutdown
130
- * signal (SIGTERM/SIGINT) and graceful shutdown completes.
131
- */
132
- ready: () => Promise<void>;
133
- /**
134
- * Register a callback to run during graceful shutdown.
135
- * Multiple handlers can be registered; they run in order.
136
- *
137
- * Shutdown is triggered by SIGTERM or SIGINT (standard container signals).
138
- * The SDK stops the HTTP server, drains in-flight requests, runs
139
- * shutdown handlers, then exits.
140
- *
141
- * @example
142
- * ```ts
143
- * mission.onShutdown(async () => {
144
- * await database.close()
145
- * await cache.flush()
146
- * })
147
- * ```
148
- */
149
- onShutdown: (handler: () => Promise<void> | void) => void;
150
- /**
151
- * Register a health check handler for install-time smoke testing.
152
- *
153
- * The handler is called by the platform after the skill process starts
154
- * during installation. It should verify that the skill can reach its
155
- * external dependencies (e.g., API keys work, OAuth tokens are valid).
156
- *
157
- * This is NOT a tool — it is never exposed to the LLM or listed in
158
- * reported tools. It is served on an internal HTTP endpoint
159
- * (`POST /_mission/health-check`) that only the platform calls.
160
- *
161
- * If no handler is registered, the health check is skipped (not failed).
162
- *
163
- * @example
164
- * ```ts
165
- * mission.onHealthCheck(async () => {
166
- * await gmail.listLabels()
167
- * return { ok: true }
168
- * })
169
- * ```
170
- */
171
- onHealthCheck: (handler: () => Promise<unknown> | unknown) => void;
172
- };
173
- /**
174
- * Create a Mission SDK instance.
175
- *
176
- * @example
177
- * ```ts
178
- * import { createMissionSDK } from '@mission/sdk'
179
- *
180
- * const mission = createMissionSDK()
181
- * await mission.connect()
182
- *
183
- * const auth = await mission.auth.get()
184
- * const config = await mission.config.get<MyConfig>(defaults)
185
- *
186
- * mission.tools.registerAll(handlers)
187
- * mission.ingress.on('webhook', handler)
188
- * mission.on('mailbox_activity', async (event) => {
189
- * await mission.emit({ message: '...', context: event.payload })
190
- * })
191
- * mission.onShutdown(() => cleanup())
192
- *
193
- * await mission.ready()
194
- * ```
195
- */
196
- export declare function createMissionSDK(options?: MissionSDKOptions): MissionSDK;
197
- //# sourceMappingURL=sdk.d.ts.map
package/dist/sdk.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAAE,KAAK,UAAU,EAAoB,MAAM,QAAQ,CAAA;AAE1D,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,UAAU,CAAA;AAChE,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,WAAW,CAAA;AACjE,OAAO,EAA8B,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE/E,OAAO,EAEL,KAAK,aAAa,EAEnB,MAAM,WAAW,CAAA;AAClB,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,WAAW,CAAA;AAClB,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAA;AAIxB,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;IAC/B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAEjC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,kCAAkC;IAClC,OAAO,EAAE,YAAY,CAAA;IACrB,kFAAkF;IAClF,IAAI,EAAE,UAAU,CAAA;IAChB,4CAA4C;IAC5C,MAAM,EAAE,YAAY,CAAA;IACpB,0DAA0D;IAC1D,OAAO,EAAE,aAAa,CAAA;IACtB,gFAAgF;IAChF,GAAG,EAAE,SAAS,CAAA;IACd,2DAA2D;IAC3D,KAAK,EAAE,WAAW,CAAA;IAElB;;;;;;;;;;OAUG;IACH,EAAE,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,KAAK,IAAI,CAAA;IAEtD;;;;;;;;;;;;;;;OAeG;IACH,IAAI,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAE9C;;;;;;;;;OASG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAE5B;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAE1B;;;;;;;;;;;;;;;OAeG;IACH,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;IAEzD;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,KAAK,IAAI,CAAA;CACnE,CAAA;AAaD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAkbxE"}
package/dist/sdk.js DELETED
@@ -1,435 +0,0 @@
1
- /**
2
- * Mission SDK — Main Entry
3
- *
4
- * Creates the SDK instance that a skill uses to interact with the
5
- * Mission platform. Communication is HTTP-native:
6
- *
7
- * Outbound (Skill → Mission API):
8
- * Standard REST calls via the API client.
9
- *
10
- * Inbound (Mission API → Skill):
11
- * HTTP requests to the skill's HTTP server, exposed via
12
- * Daytona Preview URLs.
13
- *
14
- * Lifecycle:
15
- * 1. const mission = createMissionSDK() — create SDK (no connection yet)
16
- * 2. await mission.connect() — start HTTP server, install logging
17
- * 3. // auth, config are now usable
18
- * 4. mission.tools.registerAll(handlers) — register tool handlers
19
- * 5. mission.ingress.on('name', handler) — register ingress handlers
20
- * 6. mission.on('event_type', handler) — register event handler
21
- * 7. mission.onShutdown(() => cleanup()) — register shutdown hooks
22
- * 8. await mission.ready() — signal readiness, accept traffic
23
- *
24
- * See docs/technical/architecture/skills/architecture.md §4 and §6.
25
- * See docs/technical/architecture/skills/sandbox-runtime.md.
26
- */
27
- import { TRPCClientError } from '@trpc/client';
28
- import { createApiClient } from './api.js';
29
- import { createAuthModule } from './auth.js';
30
- import { createAuthFailureTracker } from './auth-failure-tracker.js';
31
- import { createConfigModule } from './config.js';
32
- import { readContextFromEnv } from './context.js';
33
- import { createEventHandlerRegistry } from './event-handler.js';
34
- import { createHttpServer } from './http-server.js';
35
- import { createIngressRegistry } from './ingress.js';
36
- import { createLogModule, flushAndStop, installLogging } from './logging.js';
37
- import { createToolRegistry } from './tool-registry.js';
38
- // ─── Factory ─────────────────────────────────────────────────────────────────
39
- /** Interval between keep-alive heartbeats (in ms). */
40
- const HEARTBEAT_INTERVAL_MS = 10 * 60 * 1000; // 10 minutes
41
- /** How often to check if the JWT needs refreshing (in ms). */
42
- const TOKEN_REFRESH_CHECK_MS = 5 * 60 * 1000; // 5 minutes
43
- /** Refresh the JWT when it has this much time left (in ms). */
44
- const TOKEN_REFRESH_BUFFER_MS = 15 * 60 * 1000; // 15 minutes before expiry
45
- /**
46
- * Create a Mission SDK instance.
47
- *
48
- * @example
49
- * ```ts
50
- * import { createMissionSDK } from '@mission/sdk'
51
- *
52
- * const mission = createMissionSDK()
53
- * await mission.connect()
54
- *
55
- * const auth = await mission.auth.get()
56
- * const config = await mission.config.get<MyConfig>(defaults)
57
- *
58
- * mission.tools.registerAll(handlers)
59
- * mission.ingress.on('webhook', handler)
60
- * mission.on('mailbox_activity', async (event) => {
61
- * await mission.emit({ message: '...', context: event.payload })
62
- * })
63
- * mission.onShutdown(() => cleanup())
64
- *
65
- * await mission.ready()
66
- * ```
67
- */
68
- export function createMissionSDK(options) {
69
- const envContext = readContextFromEnv();
70
- const context = {
71
- ...envContext,
72
- ...options?.context
73
- };
74
- // Port priority: explicit option > env var (in context) > 3000
75
- const port = options?.port ?? context.skillPort;
76
- // Core modules
77
- const api = createApiClient(context);
78
- const httpServer = createHttpServer();
79
- const toolRegistry = createToolRegistry();
80
- const ingressRegistry = createIngressRegistry(api);
81
- const eventHandlerRegistry = createEventHandlerRegistry();
82
- const shutdownHandlers = [];
83
- const authTracker = createAuthFailureTracker(() => {
84
- console.error('[SDK] FATAL: 3 consecutive UNAUTHORIZED responses. ' +
85
- 'Self-terminating to trigger sandbox restart with fresh credentials.');
86
- process.exit(1);
87
- });
88
- let healthCheckHandler = null;
89
- let isShuttingDown = false;
90
- let heartbeatTimer = null;
91
- let tokenRefreshTimer = null;
92
- let shutdownResolve = null;
93
- // ─── Keep-alive heartbeat ───────────────────────────────────────────
94
- function startHeartbeat() {
95
- heartbeatTimer = setInterval(() => {
96
- // Send heartbeat to Mission API.
97
- // The API responds by pinging our HTTP server's /_mission/ping
98
- // endpoint, which resets Daytona's auto-stop timer.
99
- void api.trpc.skill.heartbeat
100
- .mutate({})
101
- .then(() => {
102
- authTracker.recordSuccess();
103
- })
104
- .catch((err) => {
105
- console.error('[SDK] heartbeat failed:', err);
106
- if (err instanceof TRPCClientError &&
107
- err.data?.code === 'UNAUTHORIZED') {
108
- authTracker.recordFailure();
109
- }
110
- });
111
- }, HEARTBEAT_INTERVAL_MS);
112
- // Don't let the heartbeat timer prevent process exit
113
- if (heartbeatTimer.unref) {
114
- heartbeatTimer.unref();
115
- }
116
- }
117
- function stopHeartbeat() {
118
- if (heartbeatTimer) {
119
- clearInterval(heartbeatTimer);
120
- heartbeatTimer = null;
121
- }
122
- }
123
- // ─── JWT token refresh ────────────────────────────────────────────
124
- function getTokenExpiry() {
125
- const token = api.getToken();
126
- if (!token)
127
- return null;
128
- try {
129
- const payload = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString());
130
- return typeof payload.exp === 'number' ? payload.exp * 1000 : null;
131
- }
132
- catch {
133
- return null;
134
- }
135
- }
136
- function startTokenRefresh() {
137
- tokenRefreshTimer = setInterval(async () => {
138
- const expiry = getTokenExpiry();
139
- if (!expiry)
140
- return;
141
- const timeLeft = expiry - Date.now();
142
- if (timeLeft > TOKEN_REFRESH_BUFFER_MS)
143
- return;
144
- try {
145
- const result = await api.trpc.skill.tokenRefresh.mutate({});
146
- if (!result || typeof result !== 'object' || !('token' in result)) {
147
- throw new Error('Invalid token refresh response');
148
- }
149
- api.setToken(result.token);
150
- authTracker.recordSuccess();
151
- console.error('[SDK] JWT refreshed successfully');
152
- }
153
- catch (err) {
154
- if (err instanceof TRPCClientError &&
155
- err.data?.code === 'UNAUTHORIZED') {
156
- authTracker.recordFailure();
157
- }
158
- console.error('[SDK] JWT refresh failed:', err);
159
- }
160
- }, TOKEN_REFRESH_CHECK_MS);
161
- if (tokenRefreshTimer.unref) {
162
- tokenRefreshTimer.unref();
163
- }
164
- }
165
- function stopTokenRefresh() {
166
- if (tokenRefreshTimer) {
167
- clearInterval(tokenRefreshTimer);
168
- tokenRefreshTimer = null;
169
- }
170
- }
171
- // ─── Graceful shutdown ──────────────────────────────────────────────
172
- async function handleShutdown() {
173
- if (isShuttingDown)
174
- return;
175
- isShuttingDown = true;
176
- console.error('[SDK] Shutdown signal received — running cleanup handlers');
177
- // 1. Stop timers
178
- stopHeartbeat();
179
- stopTokenRefresh();
180
- // 2. Run skill shutdown handlers
181
- for (const handler of shutdownHandlers) {
182
- try {
183
- await handler();
184
- }
185
- catch (err) {
186
- console.error('[SDK] Shutdown handler error:', err);
187
- }
188
- }
189
- // 3. Flush remaining logs
190
- try {
191
- await flushAndStop();
192
- }
193
- catch (err) {
194
- console.error('[SDK] Error flushing logs:', err);
195
- }
196
- // 4. Stop the HTTP server
197
- try {
198
- await httpServer.stop();
199
- }
200
- catch (err) {
201
- console.error('[SDK] Error stopping HTTP server:', err);
202
- }
203
- console.error('[SDK] Shutdown complete');
204
- // 4. Resolve the ready() promise so the process can exit
205
- if (shutdownResolve) {
206
- shutdownResolve();
207
- }
208
- }
209
- // ─── Wire up HTTP server routes ─────────────────────────────────────
210
- function installRoutes() {
211
- // Health check
212
- httpServer.route('GET', '/_mission/health', async () => {
213
- return {
214
- status: 200,
215
- body: JSON.stringify({
216
- status: 'healthy',
217
- installationId: context.installationId,
218
- timestamp: new Date().toISOString()
219
- })
220
- };
221
- });
222
- // Install-time smoke test (platform calls this after activation)
223
- httpServer.route('POST', '/_mission/health-check', async () => {
224
- if (!healthCheckHandler) {
225
- return {
226
- status: 200,
227
- body: JSON.stringify({ ok: true, skipped: true })
228
- };
229
- }
230
- const HEALTH_CHECK_TIMEOUT_MS = 10_000;
231
- try {
232
- const result = await Promise.race([
233
- Promise.resolve(healthCheckHandler()),
234
- new Promise((_, reject) => setTimeout(() => reject(new Error('Health check timed out')), HEALTH_CHECK_TIMEOUT_MS))
235
- ]);
236
- return {
237
- status: 200,
238
- body: JSON.stringify({ ok: true, result })
239
- };
240
- }
241
- catch (err) {
242
- const rawMessage = err instanceof Error ? err.message : String(err);
243
- const message = rawMessage.length > 300 ? `${rawMessage.slice(0, 300)}…` : rawMessage;
244
- return {
245
- status: 500,
246
- body: JSON.stringify({
247
- ok: false,
248
- error: { code: 'HEALTH_CHECK_FAILED', message }
249
- })
250
- };
251
- }
252
- });
253
- // Keep-alive ping (Mission API calls this to reset Daytona auto-stop)
254
- httpServer.route('GET', '/_mission/ping', async () => {
255
- return {
256
- status: 200,
257
- body: JSON.stringify({ pong: true })
258
- };
259
- });
260
- // Tool calls: POST /_mission/tools/:toolName
261
- httpServer.route('POST', '/_mission/tools/:toolName', async (req) => {
262
- const toolName = req.params.toolName;
263
- if (!req.body) {
264
- return {
265
- status: 400,
266
- body: JSON.stringify({ error: 'Missing request body' })
267
- };
268
- }
269
- let parsed;
270
- try {
271
- parsed = JSON.parse(req.body);
272
- }
273
- catch {
274
- return {
275
- status: 400,
276
- body: JSON.stringify({ error: 'Invalid JSON body' })
277
- };
278
- }
279
- try {
280
- const result = await toolRegistry.dispatch(toolName, {
281
- params: parsed.args,
282
- context: parsed.context
283
- });
284
- return {
285
- status: 200,
286
- body: JSON.stringify({ result })
287
- };
288
- }
289
- catch (err) {
290
- const message = err instanceof Error ? err.message : String(err);
291
- console.error(`[SDK] Tool call '${toolName}' failed:`, message);
292
- return {
293
- status: err instanceof Error && err.message.startsWith('Unknown tool')
294
- ? 404
295
- : 500,
296
- body: JSON.stringify({ error: message })
297
- };
298
- }
299
- });
300
- // Provider events: POST /_mission/events
301
- httpServer.route('POST', '/_mission/events', async (req) => {
302
- if (!req.body) {
303
- return {
304
- status: 400,
305
- body: JSON.stringify({ error: 'Missing request body' })
306
- };
307
- }
308
- let parsed;
309
- try {
310
- parsed = JSON.parse(req.body);
311
- }
312
- catch {
313
- return {
314
- status: 400,
315
- body: JSON.stringify({ error: 'Invalid JSON body' })
316
- };
317
- }
318
- const result = await eventHandlerRegistry.dispatch(parsed);
319
- return {
320
- status: 200,
321
- body: JSON.stringify(result)
322
- };
323
- });
324
- // Ingress HTTP endpoints: POST /_ingress/:endpointName
325
- // (also accepts GET for webhook verification flows like Slack challenge)
326
- httpServer.route('POST', '/_ingress/:endpointName', async (req) => {
327
- const endpointName = req.params.endpointName;
328
- const ingressReq = {
329
- method: req.method,
330
- path: req.path,
331
- headers: req.headers,
332
- body: req.body,
333
- query: req.query
334
- };
335
- const result = await ingressRegistry.dispatch(endpointName, ingressReq);
336
- return {
337
- status: result.status,
338
- headers: result.headers,
339
- body: result.body
340
- };
341
- });
342
- httpServer.route('GET', '/_ingress/:endpointName', async (req) => {
343
- const endpointName = req.params.endpointName;
344
- const ingressReq = {
345
- method: req.method,
346
- path: req.path,
347
- headers: req.headers,
348
- body: req.body,
349
- query: req.query
350
- };
351
- const result = await ingressRegistry.dispatch(endpointName, ingressReq);
352
- return {
353
- status: result.status,
354
- headers: result.headers,
355
- body: result.body
356
- };
357
- });
358
- }
359
- // ─── SDK instance ───────────────────────────────────────────────────
360
- const sdk = {
361
- context,
362
- auth: createAuthModule(api),
363
- config: createConfigModule(api),
364
- ingress: ingressRegistry,
365
- log: createLogModule(),
366
- tools: toolRegistry,
367
- on: (eventName, handler) => {
368
- eventHandlerRegistry.on(eventName, handler);
369
- },
370
- emit: async (message) => {
371
- void api.trpc.skill.sendEvent.mutate(message).catch((err) => {
372
- console.error('[Events] emit failed:', err);
373
- });
374
- },
375
- connect: async () => {
376
- // 1. Install console override for structured logging
377
- installLogging(api, authTracker);
378
- // 2. Install HTTP routes
379
- installRoutes();
380
- // 3. Start the HTTP server
381
- await httpServer.start(port);
382
- // 4. Start keep-alive heartbeat
383
- startHeartbeat();
384
- // 5. Start JWT token refresh timer
385
- startTokenRefresh();
386
- console.error(`[SDK] Connected — HTTP server on port ${port}, auth/config/emit available`);
387
- },
388
- ready: async () => {
389
- // 1. Signal to the Mission API that we're ready for traffic
390
- const toolNames = toolRegistry.getToolNames();
391
- const ingressEndpoints = ingressRegistry.getHttpEndpointNames();
392
- const streamEndpoints = ingressRegistry.getStreamEndpointNames();
393
- await api.trpc.skill.ready.mutate({
394
- tools: toolNames,
395
- ingress: ingressEndpoints,
396
- streams: streamEndpoints,
397
- events: eventHandlerRegistry.hasHandlers(),
398
- port
399
- });
400
- console.error(`[SDK] Ready — ${toolNames.length} tools: ${toolNames.join(', ')}`);
401
- if (ingressEndpoints.length > 0) {
402
- console.error(`[SDK] Ingress endpoints: ${ingressEndpoints.join(', ')}`);
403
- }
404
- if (streamEndpoints.length > 0) {
405
- console.error(`[SDK] Stream endpoints: ${streamEndpoints.join(', ')}`);
406
- }
407
- // 2. Install signal handlers for graceful shutdown
408
- process.on('SIGTERM', () => {
409
- handleShutdown().catch(err => {
410
- console.error('[SDK] Fatal shutdown error:', err);
411
- process.exit(1);
412
- });
413
- });
414
- process.on('SIGINT', () => {
415
- handleShutdown().catch(err => {
416
- console.error('[SDK] Fatal shutdown error:', err);
417
- process.exit(1);
418
- });
419
- });
420
- console.error('[SDK] Accepting traffic — skill is live');
421
- // 3. Keep alive until shutdown signal
422
- await new Promise(resolve => {
423
- shutdownResolve = resolve;
424
- });
425
- },
426
- onShutdown: (handler) => {
427
- shutdownHandlers.push(handler);
428
- },
429
- onHealthCheck: (handler) => {
430
- healthCheckHandler = handler;
431
- }
432
- };
433
- return sdk;
434
- }
435
- //# sourceMappingURL=sdk.js.map
package/dist/sdk.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"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"}