@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 +137 -0
- package/dist/client.d.ts +137 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +191 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +16 -0
- package/dist/config.js.map +1 -0
- package/dist/hooks/session-start.d.ts +11 -0
- package/dist/hooks/session-start.d.ts.map +1 -0
- package/dist/hooks/session-start.js +112 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +2 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +206 -0
- package/dist/init.js.map +1 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +92 -0
- package/dist/server.js.map +1 -0
- package/dist/tools.d.ts +16 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +1237 -0
- package/dist/tools.js.map +1 -0
- package/package.json +35 -0
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)
|
package/dist/client.d.ts
ADDED
|
@@ -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":"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"}
|
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":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|