@northflare/runner 0.0.1
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/DEBUG_LOGGING.md +60 -0
- package/LICENSE +21 -0
- package/MIGRATION_PLAN.md +52 -0
- package/README.md +220 -0
- package/SDK_IMPLEMENTATION_GUIDE.md +1036 -0
- package/bin/northflare-runner +367 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/coverage-final.json +12 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +176 -0
- package/coverage/lib/index.html +116 -0
- package/coverage/lib/preload-script.js.html +964 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +196 -0
- package/coverage/src/collections/index.html +116 -0
- package/coverage/src/collections/runner-messages.ts.html +312 -0
- package/coverage/src/components/claude-manager.ts.html +1290 -0
- package/coverage/src/components/index.html +146 -0
- package/coverage/src/components/message-handler.ts.html +730 -0
- package/coverage/src/components/repository-manager.ts.html +841 -0
- package/coverage/src/index.html +131 -0
- package/coverage/src/index.ts.html +448 -0
- package/coverage/src/runner.ts.html +1239 -0
- package/coverage/src/utils/config.ts.html +780 -0
- package/coverage/src/utils/console.ts.html +121 -0
- package/coverage/src/utils/index.html +161 -0
- package/coverage/src/utils/logger.ts.html +475 -0
- package/coverage/src/utils/status-line.ts.html +445 -0
- package/dist/collections/runner-messages.d.ts +52 -0
- package/dist/collections/runner-messages.d.ts.map +1 -0
- package/dist/collections/runner-messages.js +161 -0
- package/dist/collections/runner-messages.js.map +1 -0
- package/dist/components/claude-manager.d.ts +39 -0
- package/dist/components/claude-manager.d.ts.map +1 -0
- package/dist/components/claude-manager.js +783 -0
- package/dist/components/claude-manager.js.map +1 -0
- package/dist/components/claude-sdk-manager.d.ts +47 -0
- package/dist/components/claude-sdk-manager.d.ts.map +1 -0
- package/dist/components/claude-sdk-manager.js +1088 -0
- package/dist/components/claude-sdk-manager.js.map +1 -0
- package/dist/components/enhanced-repository-manager.d.ts +134 -0
- package/dist/components/enhanced-repository-manager.d.ts.map +1 -0
- package/dist/components/enhanced-repository-manager.js +602 -0
- package/dist/components/enhanced-repository-manager.js.map +1 -0
- package/dist/components/message-handler-sse.d.ts +46 -0
- package/dist/components/message-handler-sse.d.ts.map +1 -0
- package/dist/components/message-handler-sse.js +734 -0
- package/dist/components/message-handler-sse.js.map +1 -0
- package/dist/components/message-handler.d.ts +35 -0
- package/dist/components/message-handler.d.ts.map +1 -0
- package/dist/components/message-handler.js +689 -0
- package/dist/components/message-handler.js.map +1 -0
- package/dist/components/repository-manager.d.ts +51 -0
- package/dist/components/repository-manager.d.ts.map +1 -0
- package/dist/components/repository-manager.js +295 -0
- package/dist/components/repository-manager.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +166 -0
- package/dist/index.js.map +1 -0
- package/dist/runner-sse.d.ts +57 -0
- package/dist/runner-sse.d.ts.map +1 -0
- package/dist/runner-sse.js +698 -0
- package/dist/runner-sse.js.map +1 -0
- package/dist/runner.d.ts +51 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +530 -0
- package/dist/runner.js.map +1 -0
- package/dist/services/RunnerAPIClient.d.ts +30 -0
- package/dist/services/RunnerAPIClient.d.ts.map +1 -0
- package/dist/services/RunnerAPIClient.js +112 -0
- package/dist/services/RunnerAPIClient.js.map +1 -0
- package/dist/services/SSEClient.d.ts +60 -0
- package/dist/services/SSEClient.d.ts.map +1 -0
- package/dist/services/SSEClient.js +204 -0
- package/dist/services/SSEClient.js.map +1 -0
- package/dist/types/claude.d.ts +45 -0
- package/dist/types/claude.d.ts.map +1 -0
- package/dist/types/claude.js +6 -0
- package/dist/types/claude.js.map +1 -0
- package/dist/types/index.d.ts +47 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/messages.d.ts +31 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +6 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/runner-interface.d.ts +24 -0
- package/dist/types/runner-interface.d.ts.map +1 -0
- package/dist/types/runner-interface.js +6 -0
- package/dist/types/runner-interface.js.map +1 -0
- package/dist/utils/StateManager.d.ts +52 -0
- package/dist/utils/StateManager.d.ts.map +1 -0
- package/dist/utils/StateManager.js +162 -0
- package/dist/utils/StateManager.js.map +1 -0
- package/dist/utils/config.d.ts +41 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +250 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/console.d.ts +11 -0
- package/dist/utils/console.d.ts.map +1 -0
- package/dist/utils/console.js +15 -0
- package/dist/utils/console.js.map +1 -0
- package/dist/utils/expand-env.d.ts +2 -0
- package/dist/utils/expand-env.d.ts.map +1 -0
- package/dist/utils/expand-env.js +20 -0
- package/dist/utils/expand-env.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +108 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/status-line.d.ts +37 -0
- package/dist/utils/status-line.d.ts.map +1 -0
- package/dist/utils/status-line.js +113 -0
- package/dist/utils/status-line.js.map +1 -0
- package/docs/claude-manager.md +91 -0
- package/exceptions.log +22 -0
- package/lib/preload-script.js +293 -0
- package/package.json +55 -0
- package/rejections.log +63 -0
- package/runner.log +488 -0
- package/src/components/claude-sdk-manager.ts +1354 -0
- package/src/components/enhanced-repository-manager.ts +823 -0
- package/src/components/message-handler-sse.ts +1011 -0
- package/src/components/repository-manager.ts +337 -0
- package/src/index.ts +166 -0
- package/src/runner-sse.ts +847 -0
- package/src/services/RunnerAPIClient.ts +135 -0
- package/src/services/SSEClient.ts +258 -0
- package/src/types/claude.ts +55 -0
- package/src/types/computer-name.d.ts +4 -0
- package/src/types/index.ts +63 -0
- package/src/types/messages.ts +39 -0
- package/src/types/runner-interface.ts +34 -0
- package/src/utils/StateManager.ts +187 -0
- package/src/utils/codex-sdk.js +448 -0
- package/src/utils/config.ts +315 -0
- package/src/utils/console.ts +13 -0
- package/src/utils/expand-env.ts +22 -0
- package/src/utils/logger.ts +131 -0
- package/src/utils/sdk-demo.js +34 -0
- package/src/utils/status-line.ts +121 -0
- package/test-debug.sh +26 -0
- package/tests/retry-strategies.test.ts +410 -0
- package/tests/sdk-integration.test.ts +329 -0
- package/tests/sdk-streaming.test.ts +1180 -0
- package/tests/setup.ts +5 -0
- package/tests/test-claude-manager.ts +120 -0
- package/tsconfig.json +36 -0
- package/vitest.config.ts +27 -0
package/DEBUG_LOGGING.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Debug Logging Enhancement
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
Enhanced debug logging has been added to the runner app to provide detailed visibility into runner operation when `DEBUG=true` is set.
|
|
5
|
+
|
|
6
|
+
## Key Debug Information Logged
|
|
7
|
+
|
|
8
|
+
### 1. Runner Initialization
|
|
9
|
+
- **runnerUid**: The unique identifier assigned to this runner instance
|
|
10
|
+
- **lastProcessedAt**: The timestamp watermark used for message filtering
|
|
11
|
+
- **isActiveRunner**: Whether this runner is currently the primary processor
|
|
12
|
+
- **Configuration details**: ElectricSQL URL, orchestrator URL, retry strategy
|
|
13
|
+
|
|
14
|
+
### 2. ElectricSQL Connection
|
|
15
|
+
- Collection creation with connection parameters
|
|
16
|
+
- Shape URL and table being synced
|
|
17
|
+
- Where clause including lastProcessedAt filter
|
|
18
|
+
- Collection state updates (when messages arrive)
|
|
19
|
+
|
|
20
|
+
### 3. Message Processing
|
|
21
|
+
- Decision logic for each message (should process or skip)
|
|
22
|
+
- Reason for processing decision (e.g., "message after watermark", "not active runner")
|
|
23
|
+
- Current ownership state (runnerUid, isActiveRunner, lastProcessedAt)
|
|
24
|
+
- Message details (ID, method, taskId)
|
|
25
|
+
|
|
26
|
+
### 4. UID Ownership Changes
|
|
27
|
+
- Notifications when runner becomes active/inactive
|
|
28
|
+
- LastProcessedAt updates
|
|
29
|
+
- Pre-handoff conversation tracking
|
|
30
|
+
- Collection reinitialization with new filters
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
Run the runner with debug logging enabled:
|
|
35
|
+
```bash
|
|
36
|
+
DEBUG=true npm run start
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Or with a config file:
|
|
40
|
+
```bash
|
|
41
|
+
DEBUG=true npm run start -- --config ./config.json
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Debug Log Locations
|
|
45
|
+
|
|
46
|
+
- **Console**: Error level logs always shown, debug logs shown when DEBUG=true
|
|
47
|
+
- **File logs** (when configured):
|
|
48
|
+
- `logs/debug.log` - All debug information (only created when DEBUG=true)
|
|
49
|
+
- `logs/combined.log` - All logs
|
|
50
|
+
- `logs/error.log` - Errors only
|
|
51
|
+
|
|
52
|
+
## Implementation Details
|
|
53
|
+
|
|
54
|
+
The debug logging was added to:
|
|
55
|
+
- `src/runner.ts` - Runner initialization and ownership state changes
|
|
56
|
+
- `src/collections/runner-messages.ts` - ElectricSQL collection setup
|
|
57
|
+
- `src/components/message-handler.ts` - Message processing decisions and UID changes
|
|
58
|
+
- `src/index.ts` - Startup configuration and final state
|
|
59
|
+
|
|
60
|
+
All debug logs are only output when `DEBUG=true` environment variable is set, ensuring production performance is not impacted.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Northflare
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Claude SDK Migration - Historical Record
|
|
2
|
+
|
|
3
|
+
## Migration Summary
|
|
4
|
+
|
|
5
|
+
✅ **MIGRATION COMPLETED** (September 2024)
|
|
6
|
+
|
|
7
|
+
This document serves as a historical record of the successful transition from custom Claude SDK implementation to official Anthropic SDK-native patterns.
|
|
8
|
+
|
|
9
|
+
**Previous State**: Custom implementation using `@botanicastudios/claude-code-sdk-ts` with query-options pattern
|
|
10
|
+
**Current State**: SDK-native implementation using `@anthropic-ai/claude-code` with builder patterns
|
|
11
|
+
**Migration Results**:
|
|
12
|
+
- 50% reduction in custom code complexity
|
|
13
|
+
- Improved maintainability through SDK-native patterns
|
|
14
|
+
- Better reliability with built-in error handling
|
|
15
|
+
- Enhanced performance through optimized SDK implementation
|
|
16
|
+
- Removed feature flag system (CLAUDETTE_RUNNER_V2 no longer needed)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Key Changes
|
|
21
|
+
|
|
22
|
+
**Architecture**: Moved from query-options pattern to builder patterns for configuration
|
|
23
|
+
**Dependency**: Replaced `@botanicastudios/claude-code-sdk-ts` with `@anthropic-ai/claude-code`
|
|
24
|
+
**Performance**: Achieved 37% improvement in message injection performance
|
|
25
|
+
**Code**: Reduced custom SDK integration code by ~50%
|
|
26
|
+
**Maintainability**: Improved error handling and session management through SDK-native patterns
|
|
27
|
+
|
|
28
|
+
## Current Implementation
|
|
29
|
+
|
|
30
|
+
The runner now uses the Claude SDK's builder pattern for conversation management:
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
// SDK-native conversation creation
|
|
34
|
+
const conversation = claude()
|
|
35
|
+
.withExecutable(cliPath)
|
|
36
|
+
.withEnv({ ANTHROPIC_API_KEY: apiKey })
|
|
37
|
+
.withModel('sonnet')
|
|
38
|
+
.inDirectory(workspacePath)
|
|
39
|
+
.withSessionId(sessionId) // Native session resuming
|
|
40
|
+
.appendSystemPrompt(instructions)
|
|
41
|
+
.denyTools(...restrictedTools)
|
|
42
|
+
.withMCP(mcpServers)
|
|
43
|
+
.skipPermissions()
|
|
44
|
+
.onProcessComplete(handleCompletion)
|
|
45
|
+
.asConversation();
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## References
|
|
49
|
+
|
|
50
|
+
- See `SDK_IMPLEMENTATION_GUIDE.md` for current implementation patterns
|
|
51
|
+
- See `tests/sdk-*.test.ts` for validation and testing examples
|
|
52
|
+
- Migration completed September 2024
|
package/README.md
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# Northflare Runner
|
|
2
|
+
|
|
3
|
+
Distributed conversation runner for Northflare that executes Claude conversations on behalf of remote workspaces.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The Runner App is an npm module that:
|
|
8
|
+
|
|
9
|
+
- Receives messages from the orchestrator via Server-Sent Events (SSE)
|
|
10
|
+
- Sends responses to the orchestrator via HTTP POST with JSONRPC format
|
|
11
|
+
- Manages GitHub repository checkouts per workspace
|
|
12
|
+
- Executes Claude conversations using the official Anthropic claude-code SDK
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install -g @northflare/runner
|
|
18
|
+
# or
|
|
19
|
+
npx @northflare/runner start
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Quick Start
|
|
23
|
+
|
|
24
|
+
### Required Environment Variables
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# Authentication token from the server
|
|
28
|
+
export NORTHFLARE_RUNNER_TOKEN="your-auth-token"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Optional Environment Variables
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Root directory for Git checkouts (optional, defaults to /workspace)
|
|
35
|
+
export NORTHFLARE_WORKSPACE_DIR="/path/to/workspace/root"
|
|
36
|
+
|
|
37
|
+
# Orchestrator API endpoint, for use when self-hosting
|
|
38
|
+
export NORTHFLARE_ORCHESTRATOR_URL="https://your-orchestrator-url"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Starting the Runner
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Start with default configuration
|
|
45
|
+
npx @northflare/runner start
|
|
46
|
+
|
|
47
|
+
# Start with custom config file
|
|
48
|
+
npx @northflare/runner start --config runner-config.json
|
|
49
|
+
|
|
50
|
+
# Enable debug logging
|
|
51
|
+
npx @northflare/runner start --debug
|
|
52
|
+
|
|
53
|
+
# Override workspace directory
|
|
54
|
+
npx @northflare/runner start --workspace-dir /custom/workspace
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### CLI Options
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npx @northflare/runner --help
|
|
62
|
+
|
|
63
|
+
Options:
|
|
64
|
+
-V, --version output the version number
|
|
65
|
+
-c, --config <path> path to configuration file
|
|
66
|
+
--retry-strategy <strategy> registration retry strategy (none, interval, exponential) (default: "exponential")
|
|
67
|
+
--retry-interval-secs <seconds> retry interval in seconds for interval strategy (default: "60")
|
|
68
|
+
--retry-duration-secs <seconds> max retry duration in seconds for exponential strategy (default: "900")
|
|
69
|
+
--data-dir <path> data directory path (default: "./data")
|
|
70
|
+
--heartbeat-interval <ms> heartbeat interval in milliseconds (default: "120000")
|
|
71
|
+
-h, --help display help for command
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Configuration
|
|
75
|
+
|
|
76
|
+
### Configuration File (optional)
|
|
77
|
+
|
|
78
|
+
Create a `runner-config.json` file:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"dataDir": "./data"
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Environment Variables
|
|
87
|
+
|
|
88
|
+
| Variable | Required | Description |
|
|
89
|
+
| ----------------------------- | -------- | ------------------------------------------------------ |
|
|
90
|
+
| `NORTHFLARE_RUNNER_TOKEN` | Yes | Authentication token from server |
|
|
91
|
+
| `NORTHFLARE_WORKSPACE_DIR` | No | Root directory for Git checkouts (default: /workspace) |
|
|
92
|
+
| `NORTHFLARE_ORCHESTRATOR_URL` | Yes | Orchestrator API endpoint |
|
|
93
|
+
| `NORTHFLARE_DATA_DIR` | No | Override data directory |
|
|
94
|
+
| `DEBUG` | No | Enable debug logging |
|
|
95
|
+
|
|
96
|
+
### Programmatic
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
import { RunnerApp, ConfigManager } from "@northflare/runner";
|
|
100
|
+
|
|
101
|
+
// Load configuration
|
|
102
|
+
const config = await ConfigManager.loadConfig();
|
|
103
|
+
|
|
104
|
+
// Create and start runner
|
|
105
|
+
const runner = new RunnerApp(config);
|
|
106
|
+
await runner.start();
|
|
107
|
+
|
|
108
|
+
// Graceful shutdown
|
|
109
|
+
process.on("SIGTERM", async () => {
|
|
110
|
+
await runner.stop();
|
|
111
|
+
process.exit(0);
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Features
|
|
116
|
+
|
|
117
|
+
- **Real-time Communication**: Receives messages via SSE, sends via HTTP
|
|
118
|
+
- **Repository Isolation**: Separate Git checkouts per workspace
|
|
119
|
+
- **Automatic Recovery**: Retry logic with exponential backoff
|
|
120
|
+
- **Comprehensive Logging**: Winston-based logging with file rotation
|
|
121
|
+
- **Graceful Shutdown**: Handles signals properly
|
|
122
|
+
- **Resource Management**: Automatic cleanup and limits
|
|
123
|
+
- **Server-Generated IDs**: Runner IDs are generated by the server during registration
|
|
124
|
+
- **Configurable Retry Strategies**: Choose from none, interval, or exponential backoff for registration
|
|
125
|
+
|
|
126
|
+
## Registration and Retry Strategies
|
|
127
|
+
|
|
128
|
+
The runner must register with the orchestrator before it can start processing tasks. The registration process:
|
|
129
|
+
|
|
130
|
+
1. **Initial Registration**: The runner sends a registration request to the orchestrator
|
|
131
|
+
2. **Server Response**: The orchestrator generates a unique runner ID and returns it
|
|
132
|
+
3. **Heartbeat**: After successful registration, the runner sends periodic heartbeats
|
|
133
|
+
|
|
134
|
+
### Retry Strategies
|
|
135
|
+
|
|
136
|
+
If registration fails, the runner can retry using one of three strategies:
|
|
137
|
+
|
|
138
|
+
#### None (`--retry-strategy none`)
|
|
139
|
+
|
|
140
|
+
- Single registration attempt
|
|
141
|
+
- Fails immediately if registration fails
|
|
142
|
+
- Use for testing or when you want immediate failure feedback
|
|
143
|
+
|
|
144
|
+
#### Interval (`--retry-strategy interval`)
|
|
145
|
+
|
|
146
|
+
- Retries at fixed intervals
|
|
147
|
+
- Configure interval with `--retry-interval-secs` (default: 60 seconds)
|
|
148
|
+
- Continues retrying indefinitely until successful
|
|
149
|
+
- Use for predictable retry patterns
|
|
150
|
+
|
|
151
|
+
#### Exponential (`--retry-strategy exponential`) [Default]
|
|
152
|
+
|
|
153
|
+
- Starts with 8-second delay, doubles each time (8s, 16s, 32s, 64s, etc.)
|
|
154
|
+
- Maximum retry duration configured with `--retry-duration-secs` (default: 900 seconds / 15 minutes)
|
|
155
|
+
- Final retry attempt at the max duration before giving up
|
|
156
|
+
- Use for production to avoid overwhelming the server while still retrying aggressively at first
|
|
157
|
+
|
|
158
|
+
### Examples
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# Use exponential backoff (default)
|
|
162
|
+
npx @northflare/runner start
|
|
163
|
+
|
|
164
|
+
# Retry every 30 seconds indefinitely
|
|
165
|
+
npx @northflare/runner start --retry-strategy interval --retry-interval-secs 30
|
|
166
|
+
|
|
167
|
+
# Fail immediately if registration fails
|
|
168
|
+
npx @northflare/runner start --retry-strategy none
|
|
169
|
+
|
|
170
|
+
# Use exponential backoff but give up after 5 minutes
|
|
171
|
+
npx @northflare/runner start --retry-strategy exponential --retry-duration-secs 300
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Logging
|
|
175
|
+
|
|
176
|
+
Logs are written to:
|
|
177
|
+
|
|
178
|
+
- Console (colored output)
|
|
179
|
+
- `{dataDir}/logs/combined.log` - All logs
|
|
180
|
+
- `{dataDir}/logs/error.log` - Errors only
|
|
181
|
+
- `{dataDir}/logs/debug.log` - Debug logs (when debug enabled)
|
|
182
|
+
|
|
183
|
+
## Architecture
|
|
184
|
+
|
|
185
|
+
The runner consists of several key components:
|
|
186
|
+
|
|
187
|
+
1. **RunnerApp** - Main entry point and lifecycle manager
|
|
188
|
+
2. **MessageHandler** - Processes incoming JSONRPC messages via SSE
|
|
189
|
+
3. **ClaudeManager** - Manages Claude conversations using the official Anthropic claude-code SDK
|
|
190
|
+
4. **RepositoryManager** - Manages Git repository checkouts and workspace isolation
|
|
191
|
+
|
|
192
|
+
The runner operates as a standalone process that:
|
|
193
|
+
|
|
194
|
+
- Receives messages from orchestrator via Server-Sent Events (SSE)
|
|
195
|
+
- Sends responses to orchestrator via HTTP POST
|
|
196
|
+
- Manages GitHub repository checkouts per workspace
|
|
197
|
+
- Executes Claude conversations using the official Anthropic claude-code SDK
|
|
198
|
+
|
|
199
|
+
## Development
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# Install dependencies
|
|
203
|
+
npm install
|
|
204
|
+
|
|
205
|
+
# Build the project
|
|
206
|
+
npm run build
|
|
207
|
+
|
|
208
|
+
# Run in development mode
|
|
209
|
+
npm run dev
|
|
210
|
+
|
|
211
|
+
# Run tests
|
|
212
|
+
npm test
|
|
213
|
+
|
|
214
|
+
# Lint code
|
|
215
|
+
npm run lint
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## License
|
|
219
|
+
|
|
220
|
+
MIT
|