@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.
- package/dist/chunk-N26TYEUP.js +50 -0
- package/dist/chunk-N26TYEUP.js.map +1 -0
- package/dist/debug-log-SHNBLZWL.js +9 -0
- package/dist/debug-log-SHNBLZWL.js.map +1 -0
- package/dist/index.d.ts +847 -18
- package/dist/index.js +15731 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -2
- package/dist/api.d.ts +0 -20
- package/dist/api.d.ts.map +0 -1
- package/dist/api.js +0 -39
- package/dist/api.js.map +0 -1
- package/dist/auth-failure-tracker.d.ts +0 -22
- package/dist/auth-failure-tracker.d.ts.map +0 -1
- package/dist/auth-failure-tracker.js +0 -31
- package/dist/auth-failure-tracker.js.map +0 -1
- package/dist/auth.d.ts +0 -65
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -45
- package/dist/auth.js.map +0 -1
- package/dist/config.d.ts +0 -39
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -28
- package/dist/config.js.map +0 -1
- package/dist/context.d.ts +0 -24
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -22
- package/dist/context.js.map +0 -1
- package/dist/event-handler.d.ts +0 -16
- package/dist/event-handler.d.ts.map +0 -1
- package/dist/event-handler.js +0 -27
- package/dist/event-handler.js.map +0 -1
- package/dist/http-server.d.ts +0 -51
- package/dist/http-server.d.ts.map +0 -1
- package/dist/http-server.js +0 -163
- package/dist/http-server.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/ingress.d.ts +0 -133
- package/dist/ingress.d.ts.map +0 -1
- package/dist/ingress.js +0 -89
- package/dist/ingress.js.map +0 -1
- package/dist/logging.d.ts +0 -63
- package/dist/logging.d.ts.map +0 -1
- package/dist/logging.js +0 -171
- package/dist/logging.js.map +0 -1
- package/dist/sdk.d.ts +0 -197
- package/dist/sdk.d.ts.map +0 -1
- package/dist/sdk.js +0 -435
- package/dist/sdk.js.map +0 -1
- package/dist/tool-registry.d.ts +0 -49
- package/dist/tool-registry.d.ts.map +0 -1
- package/dist/tool-registry.js +0 -37
- package/dist/tool-registry.js.map +0 -1
- 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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"}
|