@first-to-fly/orchestrator-mcp 0.1.0

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/README.md ADDED
@@ -0,0 +1,137 @@
1
+ # @firsttofly/orchestrator-mcp
2
+
3
+ Persistent memory for Claude Code via MCP. Store decisions, patterns, errors, and context that survive across sessions.
4
+
5
+ ## Quick Start
6
+
7
+ 1. **Sign up** at [orchestrator.firsttofly.com](https://orchestrator.firsttofly.com) and create a project
8
+ 2. **Generate an API key** from the project's Quick Start page
9
+ 3. **Run the init command** in your project directory:
10
+
11
+ ```bash
12
+ npx @firsttofly/orchestrator-mcp init
13
+ ```
14
+
15
+ This will:
16
+ - Prompt for your API URL, key, and project slug
17
+ - Create `.mcp.json` with the MCP server config
18
+ - Append the orchestrator protocol to `CLAUDE.md`
19
+ - Set up hooks in `.claude/settings.local.json` for auto-inject
20
+
21
+ 4. **Start a new Claude Code session** — the orchestrator auto-connects
22
+
23
+ ## Manual Setup
24
+
25
+ If you prefer to configure manually, create these files in your project root.
26
+
27
+ ### Environment Variables
28
+
29
+ | Variable | Description | Required |
30
+ |----------|-------------|----------|
31
+ | `ORCHESTRATOR_API_URL` | API endpoint (e.g. `https://orchestrator-api.firsttofly.com/api/v1`) | Yes |
32
+ | `ORCHESTRATOR_API_KEY` | Project API key (starts with `ftfo_`) | Yes |
33
+ | `ORCHESTRATOR_PROJECT` | Project slug | Yes |
34
+
35
+ ### .mcp.json
36
+
37
+ ```json
38
+ {
39
+ "mcpServers": {
40
+ "orchestrator": {
41
+ "command": "npx",
42
+ "args": ["@firsttofly/orchestrator-mcp"],
43
+ "env": {
44
+ "ORCHESTRATOR_API_URL": "https://orchestrator-api.firsttofly.com/api/v1",
45
+ "ORCHESTRATOR_API_KEY": "ftfo_your_key_here",
46
+ "ORCHESTRATOR_PROJECT": "your-project-slug"
47
+ }
48
+ }
49
+ }
50
+ }
51
+ ```
52
+
53
+ ### CLAUDE.md Protocol
54
+
55
+ Append this to your project's `CLAUDE.md`:
56
+
57
+ ```markdown
58
+ ## Orchestrator Protocol
59
+
60
+ ### Session Start
61
+ - Context is auto-injected via hook (last session + recalled memory)
62
+ - Call `recall_context` with your task description for relevant knowledge
63
+
64
+ ### Progressive Retrieval
65
+ - `recall_context` and `search_memory` return summaries by default
66
+ - Use `get_entity(type, id)` only for entities you need full content from
67
+
68
+ ### Error Resolution
69
+ - Call `check_error` before debugging from scratch — it may have a known fix
70
+
71
+ ### Save Triggers
72
+ | Trigger | Entity Type |
73
+ |---------|------------|
74
+ | Architectural choice | `decision` |
75
+ | Reusable pattern found | `pattern` |
76
+ | Bug fixed | `error` |
77
+ | Task completed | `task` |
78
+ | Module created | `module` |
79
+ | Requirement clarified | `requirement` |
80
+ | Quick insight | `observation` |
81
+
82
+ ### Relationships
83
+ Link related entities: `depends_on`, `supersedes`, `caused_by`, `implements`, `part_of`, `relates_to`
84
+
85
+ ### Session Handoff
86
+ Before ending a session, call `save_session_summary` with:
87
+ - summary, tasksCompleted, tasksInProgress, blockers, filesModified, decisionsMade, nextSteps
88
+
89
+ ### Maintenance
90
+ - `prune_stale` — remove unaccessed entities (dry run by default)
91
+ - `list_recent` — browse stored knowledge
92
+ - `search_memory` — find specific entities
93
+ ```
94
+
95
+ ## Available Tools
96
+
97
+ ### Read
98
+
99
+ | Tool | Description |
100
+ |------|-------------|
101
+ | `recall_context` | Recall relevant memory for a task |
102
+ | `search_memory` | Search memory by keyword |
103
+ | `list_recent` | List recent entities, optionally by type |
104
+ | `get_entity` | Fetch full entity content by type and ID |
105
+ | `check_error` | Check if a similar error was seen/resolved before |
106
+ | `get_last_session` | Get last session summary |
107
+
108
+ ### Write
109
+
110
+ | Tool | Description |
111
+ |------|-------------|
112
+ | `store_entity` | Store a knowledge entity (deduplicates by type+name) |
113
+ | `store_entities` | Bulk store entities (max 50) |
114
+ | `update_entity` | Update an existing entity |
115
+ | `delete_entity` | Delete an entity by type and ID |
116
+ | `store_relationship` | Link two entities with a typed relationship |
117
+ | `add_observation` | Quick shortcut to store an observation |
118
+ | `save_session_summary` | Save session handoff summary |
119
+
120
+ ### Maintenance
121
+
122
+ | Tool | Description |
123
+ |------|-------------|
124
+ | `prune_stale` | Remove stale, unaccessed entities (dry run by default) |
125
+
126
+ ## Hooks
127
+
128
+ The `init` command sets up two hooks in `.claude/settings.local.json`:
129
+
130
+ - **SessionStart**: Auto-injects the last session summary when Claude Code starts, so context carries over between sessions
131
+ - **Stop**: Reminds Claude to call `save_session_summary` before the session ends
132
+
133
+ ## Links
134
+
135
+ - [Web App](https://orchestrator.firsttofly.com)
136
+ - [GitHub](https://github.com/first-to-fly/firsttofly-orchestrator)
137
+ - [Issues](https://github.com/first-to-fly/firsttofly-orchestrator/issues)
@@ -0,0 +1,137 @@
1
+ import type { OrchestratorConfig } from './config';
2
+ export declare class OrchestratorClient {
3
+ private config;
4
+ private sessionId;
5
+ private timeout;
6
+ constructor(config: OrchestratorConfig, sessionId: string);
7
+ private get baseUrl();
8
+ private get headers();
9
+ private request;
10
+ createEntity(entity: {
11
+ name: string;
12
+ type: string;
13
+ content: string;
14
+ tags?: string[];
15
+ status?: string;
16
+ source?: string;
17
+ evidenceRefs?: string[];
18
+ }): Promise<unknown>;
19
+ bulkCreateEntities(entities: Array<{
20
+ name: string;
21
+ type: string;
22
+ content: string;
23
+ tags?: string[];
24
+ status?: string;
25
+ source?: string;
26
+ evidenceRefs?: string[];
27
+ }>): Promise<{
28
+ items: any[];
29
+ }>;
30
+ getEntity(type: string, id: string): Promise<any>;
31
+ updateEntity(type: string, id: string, updates: {
32
+ name?: string;
33
+ content?: string;
34
+ tags?: string[];
35
+ status?: string;
36
+ expectedVersion?: number;
37
+ }): Promise<unknown>;
38
+ deleteEntity(type: string, id: string, options?: {
39
+ dryRun?: boolean;
40
+ approvalId?: string;
41
+ }): Promise<any>;
42
+ listEntities(options?: {
43
+ type?: string;
44
+ limit?: number;
45
+ }): Promise<{
46
+ items: any[];
47
+ cursor?: string;
48
+ }>;
49
+ createRelationship(rel: {
50
+ fromEntityId: string;
51
+ fromEntityType: string;
52
+ toEntityId: string;
53
+ toEntityType: string;
54
+ type: string;
55
+ }): Promise<unknown>;
56
+ search(query: string, options?: {
57
+ types?: string[];
58
+ limit?: number;
59
+ mode?: string;
60
+ previewChars?: number;
61
+ }): Promise<any[]>;
62
+ recall(context: string, options?: {
63
+ types?: string[];
64
+ limit?: number;
65
+ mode?: string;
66
+ pinnedEntityIds?: string[];
67
+ previewChars?: number;
68
+ scope?: string;
69
+ }): Promise<{
70
+ entities: any[];
71
+ relationships: any[];
72
+ peripheralEntities?: any[];
73
+ }>;
74
+ saveSession(data: {
75
+ summary: string;
76
+ tasksCompleted?: string[];
77
+ tasksInProgress?: string[];
78
+ blockers?: string[];
79
+ filesModified?: string[];
80
+ decisionsMade?: string[];
81
+ nextSteps?: string[];
82
+ cost?: {
83
+ inputTokens?: number;
84
+ outputTokens?: number;
85
+ cacheReadTokens?: number;
86
+ estimatedCost?: number;
87
+ model?: string;
88
+ durationMinutes?: number;
89
+ };
90
+ }): Promise<any>;
91
+ getLastSession(): Promise<any>;
92
+ searchSessions(query: string, options?: {
93
+ limit?: number;
94
+ previewChars?: number;
95
+ }): Promise<any[]>;
96
+ checkStaleness(): Promise<any[]>;
97
+ pruneStale(options?: {
98
+ olderThanDays?: number;
99
+ confirm?: boolean;
100
+ }): Promise<any>;
101
+ checkError(data: {
102
+ errorMessage: string;
103
+ stackTrace?: string;
104
+ module?: string;
105
+ limit?: number;
106
+ }): Promise<any[]>;
107
+ getRecipe(id: string): Promise<any>;
108
+ getRecipeByName(name: string): Promise<any>;
109
+ listRecipes(): Promise<any[]>;
110
+ renderRecipe(id: string, variables?: Record<string, string>): Promise<{
111
+ rendered: string;
112
+ }>;
113
+ matchRecipes(context: string): Promise<any[]>;
114
+ claimNextTask(agentId: string): Promise<any>;
115
+ completeTask(id: string, resultSummary: string, claimToken?: string, artifacts?: Array<{
116
+ type: string;
117
+ value: string;
118
+ }>): Promise<any>;
119
+ failTask(id: string, errorDetails: string, claimToken?: string): Promise<any>;
120
+ heartbeat(id: string, claimToken: string): Promise<any>;
121
+ requestApproval(data: {
122
+ scope: string;
123
+ riskLevel?: string;
124
+ context?: Record<string, any>;
125
+ }): Promise<any>;
126
+ checkApproval(id: string): Promise<any>;
127
+ logToolCall(tool: string, durationMs: number, isError: boolean): Promise<void>;
128
+ reportSessionCost(data: {
129
+ inputTokens: number;
130
+ outputTokens: number;
131
+ cacheReadTokens?: number;
132
+ estimatedCost: number;
133
+ model: string;
134
+ durationMinutes?: number;
135
+ }): Promise<any>;
136
+ }
137
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAElD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,OAAO,CAAQ;gBAEX,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM;IAKzD,OAAO,KAAK,OAAO,GAElB;IAED,OAAO,KAAK,OAAO,GAMlB;YAEa,OAAO;IA6Bf,YAAY,CAAC,MAAM,EAAE;QACzB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;KACxB;IAOK,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC;QACvC,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;KACxB,CAAC;eAC6B,GAAG,EAAE;;IAQ9B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAIlC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;QACpD,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,eAAe,CAAC,EAAE,MAAM,CAAA;KACzB;IAIK,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAQ1F,YAAY,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;eAK/B,GAAG,EAAE;iBAAW,MAAM;;IAI/C,kBAAkB,CAAC,GAAG,EAAE;QAC5B,YAAY,EAAE,MAAM,CAAA;QACpB,cAAc,EAAE,MAAM,CAAA;QACtB,UAAU,EAAE,MAAM,CAAA;QAClB,YAAY,EAAE,MAAM,CAAA;QACpB,IAAI,EAAE,MAAM,CAAA;KACb;IAKK,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;IAW1G,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;kBAC5H,GAAG,EAAE;uBAAiB,GAAG,EAAE;6BAAuB,GAAG,EAAE;;IAYnF,WAAW,CAAC,IAAI,EAAE;QACtB,OAAO,EAAE,MAAM,CAAA;QACf,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;QACzB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;QAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;QACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;QACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;QACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;QACpB,IAAI,CAAC,EAAE;YACL,WAAW,CAAC,EAAE,MAAM,CAAA;YACpB,YAAY,CAAC,EAAE,MAAM,CAAA;YACrB,eAAe,CAAC,EAAE,MAAM,CAAA;YACxB,aAAa,CAAC,EAAE,MAAM,CAAA;YACtB,KAAK,CAAC,EAAE,MAAM,CAAA;YACd,eAAe,CAAC,EAAE,MAAM,CAAA;SACzB,CAAA;KACF;IAIK,cAAc;IAKd,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE;IASjF,cAAc;IAKd,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;IAKlE,UAAU,CAAC,IAAI,EAAE;QACrB,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,CAAA;KACf;IAKK,SAAS,CAAC,EAAE,EAAE,MAAM;IAIpB,eAAe,CAAC,IAAI,EAAE,MAAM;IAM5B,WAAW;IAIX,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;kBAC/B,MAAM;;IAGlC,YAAY,CAAC,OAAO,EAAE,MAAM;IAM5B,aAAa,CAAC,OAAO,EAAE,MAAM;IAI7B,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAIvH,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAI9D,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAKxC,eAAe,CAAC,IAAI,EAAE;QAC1B,KAAK,EAAE,MAAM,CAAA;QACb,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAC9B;IAIK,aAAa,CAAC,EAAE,EAAE,MAAM;IAKxB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAS9D,iBAAiB,CAAC,IAAI,EAAE;QAC5B,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,EAAE,MAAM,CAAA;QACpB,eAAe,CAAC,EAAE,MAAM,CAAA;QACxB,aAAa,EAAE,MAAM,CAAA;QACrB,KAAK,EAAE,MAAM,CAAA;QACb,eAAe,CAAC,EAAE,MAAM,CAAA;KACzB;CAIF"}
package/dist/client.js ADDED
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OrchestratorClient = void 0;
4
+ class OrchestratorClient {
5
+ config;
6
+ sessionId;
7
+ timeout = 10000;
8
+ constructor(config, sessionId) {
9
+ this.config = config;
10
+ this.sessionId = sessionId;
11
+ }
12
+ get baseUrl() {
13
+ return `${this.config.apiUrl}/projects/${this.config.project}`;
14
+ }
15
+ get headers() {
16
+ return {
17
+ 'Content-Type': 'application/json',
18
+ 'x-api-key': this.config.apiKey,
19
+ 'x-session-id': this.sessionId,
20
+ };
21
+ }
22
+ async request(method, path, body) {
23
+ const controller = new AbortController();
24
+ const timer = setTimeout(() => controller.abort(), this.timeout);
25
+ try {
26
+ const response = await fetch(`${this.baseUrl}${path}`, {
27
+ method,
28
+ headers: this.headers,
29
+ body: body ? JSON.stringify(body) : undefined,
30
+ signal: controller.signal,
31
+ });
32
+ if (response.status === 204) {
33
+ return undefined;
34
+ }
35
+ const data = await response.json();
36
+ if (!response.ok || !data.success) {
37
+ throw new Error(data.error?.message || `API error: ${response.status}`);
38
+ }
39
+ return data.data;
40
+ }
41
+ finally {
42
+ clearTimeout(timer);
43
+ }
44
+ }
45
+ // Entities
46
+ async createEntity(entity) {
47
+ return this.request('POST', '/entities', {
48
+ ...entity,
49
+ source: entity.source || 'claude-code',
50
+ });
51
+ }
52
+ async bulkCreateEntities(entities) {
53
+ return this.request('POST', '/entities/bulk', {
54
+ entities: entities.map((e) => ({
55
+ ...e,
56
+ source: e.source || 'claude-code',
57
+ })),
58
+ });
59
+ }
60
+ async getEntity(type, id) {
61
+ return this.request('GET', `/entities/${type}/${id}`);
62
+ }
63
+ async updateEntity(type, id, updates) {
64
+ return this.request('PATCH', `/entities/${type}/${id}`, updates);
65
+ }
66
+ async deleteEntity(type, id, options) {
67
+ const params = new URLSearchParams();
68
+ if (options?.dryRun)
69
+ params.set('dry_run', 'true');
70
+ if (options?.approvalId)
71
+ params.set('approval_id', options.approvalId);
72
+ const qs = params.toString();
73
+ return this.request('DELETE', `/entities/${type}/${id}${qs ? `?${qs}` : ''}`);
74
+ }
75
+ async listEntities(options) {
76
+ const params = new URLSearchParams();
77
+ if (options?.type)
78
+ params.set('type', options.type);
79
+ if (options?.limit)
80
+ params.set('limit', String(options.limit));
81
+ const qs = params.toString();
82
+ return this.request('GET', `/entities${qs ? `?${qs}` : ''}`);
83
+ }
84
+ // Relationships
85
+ async createRelationship(rel) {
86
+ return this.request('POST', '/relationships', rel);
87
+ }
88
+ // Search
89
+ async search(query, options) {
90
+ return this.request('POST', '/search', {
91
+ query,
92
+ types: options?.types,
93
+ limit: options?.limit || 20,
94
+ mode: options?.mode,
95
+ previewChars: options?.previewChars,
96
+ });
97
+ }
98
+ // Recall
99
+ async recall(context, options) {
100
+ return this.request('POST', '/recall', {
101
+ context,
102
+ types: options?.types,
103
+ limit: options?.limit || 10,
104
+ mode: options?.mode,
105
+ pinnedEntityIds: options?.pinnedEntityIds,
106
+ previewChars: options?.previewChars,
107
+ scope: options?.scope,
108
+ });
109
+ }
110
+ // Sessions
111
+ async saveSession(data) {
112
+ return this.request('POST', '/sessions', data);
113
+ }
114
+ async getLastSession() {
115
+ return this.request('GET', '/sessions/last');
116
+ }
117
+ // Search sessions
118
+ async searchSessions(query, options) {
119
+ return this.request('POST', '/sessions/search', {
120
+ query,
121
+ limit: options?.limit,
122
+ previewChars: options?.previewChars,
123
+ });
124
+ }
125
+ // Check staleness
126
+ async checkStaleness() {
127
+ return this.request('GET', '/entities/staleness');
128
+ }
129
+ // Prune stale entities
130
+ async pruneStale(options) {
131
+ return this.request('POST', '/entities/prune', options || {});
132
+ }
133
+ // Error check
134
+ async checkError(data) {
135
+ return this.request('POST', '/check-error', data);
136
+ }
137
+ // Recipes
138
+ async getRecipe(id) {
139
+ return this.request('GET', `/recipes/${id}`);
140
+ }
141
+ async getRecipeByName(name) {
142
+ const recipes = await this.request('GET', '/recipes');
143
+ const normalized = name.toLowerCase().trim();
144
+ return (recipes || []).find((r) => r.name.toLowerCase().trim() === normalized) || null;
145
+ }
146
+ async listRecipes() {
147
+ return this.request('GET', '/recipes');
148
+ }
149
+ async renderRecipe(id, variables) {
150
+ return this.request('POST', `/recipes/${id}/render`, { variables });
151
+ }
152
+ async matchRecipes(context) {
153
+ const params = new URLSearchParams({ context });
154
+ return this.request('GET', `/recipes/match?${params.toString()}`);
155
+ }
156
+ // Work Queue
157
+ async claimNextTask(agentId) {
158
+ return this.request('POST', '/work-items/claim-next', { agentId });
159
+ }
160
+ async completeTask(id, resultSummary, claimToken, artifacts) {
161
+ return this.request('PATCH', `/work-items/${id}/complete`, { resultSummary, claimToken, artifacts });
162
+ }
163
+ async failTask(id, errorDetails, claimToken) {
164
+ return this.request('PATCH', `/work-items/${id}/fail`, { errorDetails, claimToken });
165
+ }
166
+ async heartbeat(id, claimToken) {
167
+ return this.request('PATCH', `/work-items/${id}/heartbeat`, { claimToken });
168
+ }
169
+ // Approvals
170
+ async requestApproval(data) {
171
+ return this.request('POST', '/approvals', data);
172
+ }
173
+ async checkApproval(id) {
174
+ return this.request('GET', `/approvals/${id}`);
175
+ }
176
+ // Tool call logging (fire-and-forget)
177
+ async logToolCall(tool, durationMs, isError) {
178
+ return this.request('POST', '/events/tool-call', {
179
+ tool,
180
+ durationMs,
181
+ isError,
182
+ });
183
+ }
184
+ // Cost reporting
185
+ async reportSessionCost(data) {
186
+ // Uses the events system directly via a custom endpoint
187
+ return this.request('POST', '/analytics/cost', data);
188
+ }
189
+ }
190
+ exports.OrchestratorClient = OrchestratorClient;
191
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";;;AAEA,MAAa,kBAAkB;IACrB,MAAM,CAAoB;IAC1B,SAAS,CAAQ;IACjB,OAAO,GAAG,KAAK,CAAA;IAEvB,YAAY,MAA0B,EAAE,SAAiB;QACvD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,IAAY,OAAO;QACjB,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,aAAa,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IAChE,CAAC;IAED,IAAY,OAAO;QACjB,OAAO;YACL,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC/B,cAAc,EAAE,IAAI,CAAC,SAAS;SAC/B,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,MAAc,EAAE,IAAY,EAAE,IAAc;QACnE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAEhE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;gBACrD,MAAM;gBACN,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAA;YAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,SAAc,CAAA;YACvB,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAiE,CAAA;YAEjG,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,cAAc,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;YACzE,CAAC;YAED,OAAO,IAAI,CAAC,IAAS,CAAA;QACvB,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IAED,WAAW;IACX,KAAK,CAAC,YAAY,CAAC,MAQlB;QACC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE;YACvC,GAAG,MAAM;YACT,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,aAAa;SACvC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,QAQvB;QACA,OAAO,IAAI,CAAC,OAAO,CAAmB,MAAM,EAAE,gBAAgB,EAAE;YAC9D,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,GAAG,CAAC;gBACJ,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,aAAa;aAClC,CAAC,CAAC;SACJ,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,EAAU;QACtC,OAAO,IAAI,CAAC,OAAO,CAAM,KAAK,EAAE,aAAa,IAAI,IAAI,EAAE,EAAE,CAAC,CAAA;IAC5D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,EAAU,EAAE,OAM5C;QACC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;IAClE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,EAAU,EAAE,OAAmD;QAC9F,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;QACpC,IAAI,OAAO,EAAE,MAAM;YAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAClD,IAAI,OAAO,EAAE,UAAU;YAAE,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;QACtE,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAM,QAAQ,EAAE,aAAa,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACpF,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAA2C;QAC5D,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;QACpC,IAAI,OAAO,EAAE,IAAI;YAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QACnD,IAAI,OAAO,EAAE,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAC9D,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAoC,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACjG,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,kBAAkB,CAAC,GAMxB;QACC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAA;IACpD,CAAC;IAED,SAAS;IACT,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,OAAoF;QAC9G,OAAO,IAAI,CAAC,OAAO,CAAQ,MAAM,EAAE,SAAS,EAAE;YAC5C,KAAK;YACL,KAAK,EAAE,OAAO,EAAE,KAAK;YACrB,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE;YAC3B,IAAI,EAAE,OAAO,EAAE,IAAI;YACnB,YAAY,EAAE,OAAO,EAAE,YAAY;SACpC,CAAC,CAAA;IACJ,CAAC;IAED,SAAS;IACT,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,OAAgI;QAC5J,OAAO,IAAI,CAAC,OAAO,CAAwE,MAAM,EAAE,SAAS,EAAE;YAC5G,OAAO;YACP,KAAK,EAAE,OAAO,EAAE,KAAK;YACrB,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE;YAC3B,IAAI,EAAE,OAAO,EAAE,IAAI;YACnB,eAAe,EAAE,OAAO,EAAE,eAAe;YACzC,YAAY,EAAE,OAAO,EAAE,YAAY;YACnC,KAAK,EAAE,OAAO,EAAE,KAAK;SACtB,CAAC,CAAA;IACJ,CAAC;IAED,WAAW;IACX,KAAK,CAAC,WAAW,CAAC,IAgBjB;QACC,OAAO,IAAI,CAAC,OAAO,CAAM,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,OAAO,CAAM,KAAK,EAAE,gBAAgB,CAAC,CAAA;IACnD,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,OAAmD;QACrF,OAAO,IAAI,CAAC,OAAO,CAAQ,MAAM,EAAE,kBAAkB,EAAE;YACrD,KAAK;YACL,KAAK,EAAE,OAAO,EAAE,KAAK;YACrB,YAAY,EAAE,OAAO,EAAE,YAAY;SACpC,CAAC,CAAA;IACJ,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,cAAc;QAClB,OAAO,IAAI,CAAC,OAAO,CAAQ,KAAK,EAAE,qBAAqB,CAAC,CAAA;IAC1D,CAAC;IAED,uBAAuB;IACvB,KAAK,CAAC,UAAU,CAAC,OAAuD;QACtE,OAAO,IAAI,CAAC,OAAO,CAAM,MAAM,EAAE,iBAAiB,EAAE,OAAO,IAAI,EAAE,CAAC,CAAA;IACpE,CAAC;IAED,cAAc;IACd,KAAK,CAAC,UAAU,CAAC,IAKhB;QACC,OAAO,IAAI,CAAC,OAAO,CAAQ,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,CAAA;IAC1D,CAAC;IAED,UAAU;IACV,KAAK,CAAC,SAAS,CAAC,EAAU;QACxB,OAAO,IAAI,CAAC,OAAO,CAAM,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,CAAA;IACnD,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAY;QAChC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAQ,KAAK,EAAE,UAAU,CAAC,CAAA;QAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAA;QAC5C,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,UAAU,CAAC,IAAI,IAAI,CAAA;IAC7F,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,OAAO,CAAQ,KAAK,EAAE,UAAU,CAAC,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAU,EAAE,SAAkC;QAC/D,OAAO,IAAI,CAAC,OAAO,CAAuB,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAA;IAC3F,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe;QAChC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAQ,KAAK,EAAE,kBAAkB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IAC1E,CAAC;IAED,aAAa;IACb,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,OAAO,IAAI,CAAC,OAAO,CAAM,MAAM,EAAE,wBAAwB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;IACzE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,EAAU,EAAE,aAAqB,EAAE,UAAmB,EAAE,SAAkD;QAC3H,OAAO,IAAI,CAAC,OAAO,CAAM,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAA;IAC3G,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,YAAoB,EAAE,UAAmB;QAClE,OAAO,IAAI,CAAC,OAAO,CAAM,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAA;IAC3F,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU,EAAE,UAAkB;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAM,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;IAClF,CAAC;IAED,YAAY;IACZ,KAAK,CAAC,eAAe,CAAC,IAIrB;QACC,OAAO,IAAI,CAAC,OAAO,CAAM,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;IACtD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAU;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAM,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,CAAA;IACrD,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,UAAkB,EAAE,OAAgB;QAClE,OAAO,IAAI,CAAC,OAAO,CAAO,MAAM,EAAE,mBAAmB,EAAE;YACrD,IAAI;YACJ,UAAU;YACV,OAAO;SACR,CAAC,CAAA;IACJ,CAAC;IAED,iBAAiB;IACjB,KAAK,CAAC,iBAAiB,CAAC,IAOvB;QACC,wDAAwD;QACxD,OAAO,IAAI,CAAC,OAAO,CAAM,MAAM,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAA;IAC3D,CAAC;CACF;AArRD,gDAqRC"}
@@ -0,0 +1,7 @@
1
+ export interface OrchestratorConfig {
2
+ apiUrl: string;
3
+ apiKey: string;
4
+ project: string;
5
+ }
6
+ export declare function getConfig(): OrchestratorConfig;
7
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAgB,SAAS,IAAI,kBAAkB,CAU9C"}
package/dist/config.js ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getConfig = getConfig;
4
+ function getConfig() {
5
+ const apiUrl = process.env.ORCHESTRATOR_API_URL;
6
+ const apiKey = process.env.ORCHESTRATOR_API_KEY;
7
+ const project = process.env.ORCHESTRATOR_PROJECT;
8
+ if (!apiUrl)
9
+ throw new Error('ORCHESTRATOR_API_URL environment variable is required');
10
+ if (!apiKey)
11
+ throw new Error('ORCHESTRATOR_API_KEY environment variable is required');
12
+ if (!project)
13
+ throw new Error('ORCHESTRATOR_PROJECT environment variable is required');
14
+ return { apiUrl, apiKey, project };
15
+ }
16
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;AAMA,8BAUC;AAVD,SAAgB,SAAS;IACvB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAA;IAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAA;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAA;IAEhD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;IACrF,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;IACrF,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;IAEtF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AACpC,CAAC"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Claude Code SessionStart hook — auto-injects last session context.
4
+ *
5
+ * Walks up from cwd to find .mcp.json, reads orchestrator config,
6
+ * fetches last session, and outputs additionalContext JSON to stdout.
7
+ *
8
+ * Silent on errors (exit 0) — never blocks session start.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=session-start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Claude Code SessionStart hook — auto-injects last session context.
5
+ *
6
+ * Walks up from cwd to find .mcp.json, reads orchestrator config,
7
+ * fetches last session, and outputs additionalContext JSON to stdout.
8
+ *
9
+ * Silent on errors (exit 0) — never blocks session start.
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ const fs = __importStar(require("fs"));
46
+ const path = __importStar(require("path"));
47
+ function findMcpJson(startDir) {
48
+ let dir = startDir;
49
+ for (let i = 0; i < 20; i++) {
50
+ const candidate = path.join(dir, '.mcp.json');
51
+ if (fs.existsSync(candidate))
52
+ return candidate;
53
+ const parent = path.dirname(dir);
54
+ if (parent === dir)
55
+ break;
56
+ dir = parent;
57
+ }
58
+ return null;
59
+ }
60
+ function getOrchestratorConfig(mcpPath) {
61
+ try {
62
+ const raw = fs.readFileSync(mcpPath, 'utf-8');
63
+ const config = JSON.parse(raw);
64
+ const server = config.mcpServers?.['orchestrator'];
65
+ if (!server?.env)
66
+ return null;
67
+ const apiUrl = server.env['ORCHESTRATOR_API_URL'];
68
+ const apiKey = server.env['ORCHESTRATOR_API_KEY'];
69
+ const project = server.env['ORCHESTRATOR_PROJECT'];
70
+ if (!apiUrl || !apiKey || !project)
71
+ return null;
72
+ return { apiUrl, apiKey, project };
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ }
78
+ async function main() {
79
+ const mcpPath = findMcpJson(process.cwd());
80
+ if (!mcpPath)
81
+ return;
82
+ const config = getOrchestratorConfig(mcpPath);
83
+ if (!config)
84
+ return;
85
+ const controller = new AbortController();
86
+ const timer = setTimeout(() => controller.abort(), 5000);
87
+ try {
88
+ const url = `${config.apiUrl}/projects/${config.project}/sessions/last`;
89
+ const response = await fetch(url, {
90
+ headers: {
91
+ 'Content-Type': 'application/json',
92
+ 'x-api-key': config.apiKey,
93
+ },
94
+ signal: controller.signal,
95
+ });
96
+ if (!response.ok)
97
+ return;
98
+ const data = await response.json();
99
+ if (!data.success || !data.data)
100
+ return;
101
+ const session = data.data;
102
+ const context = `## Last Session: ${session.name}\n_Saved: ${session.createdAt}_\n\n${session.content}`;
103
+ console.log(JSON.stringify({ additionalContext: context }));
104
+ }
105
+ finally {
106
+ clearTimeout(timer);
107
+ }
108
+ }
109
+ main().catch(() => {
110
+ // Silent exit — never block session start
111
+ });
112
+ //# sourceMappingURL=session-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ if (process.argv[2] === 'init') {
4
+ require('./init');
5
+ }
6
+ else {
7
+ const { startServer } = require('./server');
8
+ startServer().catch((err) => {
9
+ console.error('Failed to start MCP server:', err);
10
+ process.exit(1);
11
+ });
12
+ }
13
+ //# sourceMappingURL=index.js.map