aicp-claude-agent 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 +161 -0
- package/dist/claude/sdk.d.ts +34 -0
- package/dist/claude/sdk.d.ts.map +1 -0
- package/dist/claude/sdk.js +112 -0
- package/dist/claude/sdk.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +32 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/resume.d.ts +6 -0
- package/dist/commands/resume.d.ts.map +1 -0
- package/dist/commands/resume.js +75 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +118 -0
- package/dist/config.js.map +1 -0
- package/dist/history.d.ts +9 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +87 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +344 -0
- package/dist/main.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +129 -0
- package/dist/setup.js.map +1 -0
- package/dist/terminal/prompt.d.ts +29 -0
- package/dist/terminal/prompt.d.ts.map +1 -0
- package/dist/terminal/prompt.js +764 -0
- package/dist/terminal/prompt.js.map +1 -0
- package/dist/terminal/spinner.d.ts +7 -0
- package/dist/terminal/spinner.d.ts.map +1 -0
- package/dist/terminal/spinner.js +114 -0
- package/dist/terminal/spinner.js.map +1 -0
- package/dist/types/protocol.d.ts +59 -0
- package/dist/types/protocol.d.ts.map +1 -0
- package/dist/types/protocol.js +4 -0
- package/dist/types/protocol.js.map +1 -0
- package/dist/update.d.ts +2 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +65 -0
- package/dist/update.js.map +1 -0
- package/dist/websocket/client.d.ts +8 -0
- package/dist/websocket/client.d.ts.map +1 -0
- package/dist/websocket/client.js +120 -0
- package/dist/websocket/client.js.map +1 -0
- package/package.json +39 -0
package/dist/history.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.addHistory = addHistory;
|
|
7
|
+
exports.historyLength = historyLength;
|
|
8
|
+
exports.getHistoryDisplay = getHistoryDisplay;
|
|
9
|
+
exports.getHistoryFull = getHistoryFull;
|
|
10
|
+
const fs_1 = __importDefault(require("fs"));
|
|
11
|
+
const path_1 = __importDefault(require("path"));
|
|
12
|
+
const config_1 = require("./config");
|
|
13
|
+
const MAX_ENTRIES = 500;
|
|
14
|
+
const HISTORY_FILE = 'history';
|
|
15
|
+
let entries = null; // lazy-loaded
|
|
16
|
+
function historyPath() {
|
|
17
|
+
return path_1.default.join((0, config_1.localAicpDir)(), HISTORY_FILE);
|
|
18
|
+
}
|
|
19
|
+
function load() {
|
|
20
|
+
if (entries)
|
|
21
|
+
return entries;
|
|
22
|
+
try {
|
|
23
|
+
const raw = fs_1.default.readFileSync(historyPath(), 'utf-8');
|
|
24
|
+
entries = raw
|
|
25
|
+
.split('\n')
|
|
26
|
+
.filter(line => line.trim())
|
|
27
|
+
.map(line => {
|
|
28
|
+
try {
|
|
29
|
+
return JSON.parse(line);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return { full: line };
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
entries = [];
|
|
38
|
+
}
|
|
39
|
+
return entries;
|
|
40
|
+
}
|
|
41
|
+
function save() {
|
|
42
|
+
if (!entries)
|
|
43
|
+
return;
|
|
44
|
+
const dir = (0, config_1.localAicpDir)();
|
|
45
|
+
if (!fs_1.default.existsSync(dir)) {
|
|
46
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
47
|
+
}
|
|
48
|
+
const data = entries.map(e => JSON.stringify(e)).join('\n') + '\n';
|
|
49
|
+
fs_1.default.writeFileSync(historyPath(), data);
|
|
50
|
+
}
|
|
51
|
+
/** Add a history entry. display is the collapsed version (only stored if different from full). */
|
|
52
|
+
function addHistory(full, display) {
|
|
53
|
+
const list = load();
|
|
54
|
+
const entry = { full };
|
|
55
|
+
if (display && display !== full)
|
|
56
|
+
entry.display = display;
|
|
57
|
+
// Dedupe: remove the most recent identical entry
|
|
58
|
+
if (list.length > 0 && list[list.length - 1].full === full) {
|
|
59
|
+
list.pop();
|
|
60
|
+
}
|
|
61
|
+
list.push(entry);
|
|
62
|
+
// Trim to max
|
|
63
|
+
if (list.length > MAX_ENTRIES) {
|
|
64
|
+
entries = list.slice(list.length - MAX_ENTRIES);
|
|
65
|
+
}
|
|
66
|
+
save();
|
|
67
|
+
}
|
|
68
|
+
/** Get history entries count */
|
|
69
|
+
function historyLength() {
|
|
70
|
+
return load().length;
|
|
71
|
+
}
|
|
72
|
+
/** Get the display text for a history entry (index 0 = oldest). Returns null if out of range. */
|
|
73
|
+
function getHistoryDisplay(index) {
|
|
74
|
+
const list = load();
|
|
75
|
+
if (index < 0 || index >= list.length)
|
|
76
|
+
return null;
|
|
77
|
+
const entry = list[index];
|
|
78
|
+
return entry.display || entry.full;
|
|
79
|
+
}
|
|
80
|
+
/** Get the full text for a history entry (index 0 = oldest). Returns null if out of range. */
|
|
81
|
+
function getHistoryFull(index) {
|
|
82
|
+
const list = load();
|
|
83
|
+
if (index < 0 || index >= list.length)
|
|
84
|
+
return null;
|
|
85
|
+
return list[index].full;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.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,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
41
|
+
dotenv_1.default.config({ path: '.env.local' });
|
|
42
|
+
const update_1 = require("./update");
|
|
43
|
+
// Check for updates before anything else (skipped in dev mode)
|
|
44
|
+
(0, update_1.checkAndUpdate)().then(() => {
|
|
45
|
+
// Handle --setup before loading config (which validates required fields)
|
|
46
|
+
if (process.argv.includes('--setup')) {
|
|
47
|
+
Promise.resolve().then(() => __importStar(require('./setup'))).then(({ runSetup }) => runSetup());
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
Promise.resolve().then(() => __importStar(require('./main'))).then(({ start }) => start());
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,oDAA4B;AAC5B,gBAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;AAEtC,qCAA0C;AAE1C,+DAA+D;AAC/D,IAAA,uBAAc,GAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IACzB,yEAAyE;IACzE,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,kDAAO,SAAS,IAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,kDAAO,QAAQ,IAAE,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC,CAAC,CAAC"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAuWA,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAa3C"}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.start = start;
|
|
4
|
+
const config_1 = require("./config");
|
|
5
|
+
const sdk_1 = require("./claude/sdk");
|
|
6
|
+
const client_1 = require("./websocket/client");
|
|
7
|
+
const prompt_1 = require("./terminal/prompt");
|
|
8
|
+
const spinner_1 = require("./terminal/spinner");
|
|
9
|
+
const commands_1 = require("./commands");
|
|
10
|
+
// ─── Execution state ────────────────────────────────────────────────
|
|
11
|
+
let agentStatus = 'idle';
|
|
12
|
+
let executing = false;
|
|
13
|
+
let currentPromptId = null;
|
|
14
|
+
let currentSessionId = null;
|
|
15
|
+
let resumeSessionId;
|
|
16
|
+
let shuttingDown = false;
|
|
17
|
+
let styledRL = null;
|
|
18
|
+
let lastContextInfo = null;
|
|
19
|
+
let progressBuffer = ''; // buffers partial lines from streaming output
|
|
20
|
+
let progressLineActive = false; // true when a partial line is showing via updateAbove
|
|
21
|
+
// ─── Helpers ────────────────────────────────────────────────────────
|
|
22
|
+
function setStatus(status) {
|
|
23
|
+
agentStatus = status;
|
|
24
|
+
(0, client_1.sendMessage)({ type: 'status', status });
|
|
25
|
+
}
|
|
26
|
+
function contextSuffix() {
|
|
27
|
+
if (lastContextInfo && lastContextInfo.contextWindow > 0) {
|
|
28
|
+
const pct = Math.round((lastContextInfo.inputTokens / lastContextInfo.contextWindow) * 100);
|
|
29
|
+
return ` · ${pct}% context`;
|
|
30
|
+
}
|
|
31
|
+
return '';
|
|
32
|
+
}
|
|
33
|
+
function statusText() {
|
|
34
|
+
if (executing) {
|
|
35
|
+
return `esc to interrupt${contextSuffix()}`;
|
|
36
|
+
}
|
|
37
|
+
return `⏵⏵ bypass permissions on${contextSuffix()}`;
|
|
38
|
+
}
|
|
39
|
+
function syncStatusBar() {
|
|
40
|
+
if (styledRL)
|
|
41
|
+
styledRL.setStatus(statusText());
|
|
42
|
+
}
|
|
43
|
+
// ─── Execution handler ─────────────────────────────────────────────
|
|
44
|
+
async function handleExecutePrompt(msg) {
|
|
45
|
+
currentPromptId = msg.prompt_id;
|
|
46
|
+
currentSessionId = msg.session_id;
|
|
47
|
+
executing = true;
|
|
48
|
+
setStatus('busy');
|
|
49
|
+
if (styledRL)
|
|
50
|
+
styledRL.setStatus('esc to interrupt');
|
|
51
|
+
// Echo user message as plain text in scrollback (always full expanded text)
|
|
52
|
+
for (const ln of msg.text.split('\n')) {
|
|
53
|
+
(0, prompt_1.writeAbove)(ln);
|
|
54
|
+
}
|
|
55
|
+
(0, prompt_1.writeAbove)('');
|
|
56
|
+
(0, client_1.sendMessage)({
|
|
57
|
+
type: 'message',
|
|
58
|
+
session_id: msg.session_id,
|
|
59
|
+
role: 'user',
|
|
60
|
+
content: msg.text,
|
|
61
|
+
timestamp: new Date().toISOString(),
|
|
62
|
+
});
|
|
63
|
+
let stats;
|
|
64
|
+
// Start spinner before entering execution loop
|
|
65
|
+
(0, spinner_1.startSpinner)();
|
|
66
|
+
try {
|
|
67
|
+
for await (const execMsg of (0, sdk_1.executePrompt)(msg.text, {
|
|
68
|
+
cwd: process.cwd(),
|
|
69
|
+
resumeSessionId,
|
|
70
|
+
onProgress: (text) => {
|
|
71
|
+
// Stop spinner before writing assistant text
|
|
72
|
+
(0, spinner_1.stopSpinner)();
|
|
73
|
+
// Buffer streaming text, flush complete lines via writeAbove,
|
|
74
|
+
// show partial lines via updateAbove for real-time feedback
|
|
75
|
+
const parts = text.split('\n');
|
|
76
|
+
for (let i = 0; i < parts.length; i++) {
|
|
77
|
+
progressBuffer += parts[i];
|
|
78
|
+
if (i < parts.length - 1) {
|
|
79
|
+
// Got a complete line — finalize it in scrollback
|
|
80
|
+
if (progressLineActive) {
|
|
81
|
+
// Line already exists in scrollback from writeAbove — overwrite with final content
|
|
82
|
+
// If it needs wrapping, flush wrapped continuation lines after
|
|
83
|
+
const wrapped = (0, prompt_1.wrapText)(progressBuffer);
|
|
84
|
+
(0, prompt_1.updateAbove)(wrapped[0]);
|
|
85
|
+
for (let w = 1; w < wrapped.length; w++)
|
|
86
|
+
(0, prompt_1.writeAbove)(wrapped[w]);
|
|
87
|
+
progressLineActive = false;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
(0, prompt_1.writeAbove)(progressBuffer);
|
|
91
|
+
}
|
|
92
|
+
progressBuffer = '';
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Show partial line in-place so user sees streaming text
|
|
96
|
+
if (progressBuffer) {
|
|
97
|
+
if (!progressLineActive) {
|
|
98
|
+
(0, prompt_1.writeAbove)(progressBuffer);
|
|
99
|
+
progressLineActive = true;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
(0, prompt_1.updateAbove)(progressBuffer);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
onContextUpdate: (info) => {
|
|
107
|
+
if (info.contextWindow > 0) {
|
|
108
|
+
lastContextInfo = info;
|
|
109
|
+
}
|
|
110
|
+
else if (lastContextInfo) {
|
|
111
|
+
lastContextInfo = { ...lastContextInfo, inputTokens: info.inputTokens };
|
|
112
|
+
}
|
|
113
|
+
// Update spinner with token info
|
|
114
|
+
if (lastContextInfo && lastContextInfo.contextWindow > 0) {
|
|
115
|
+
const pct = Math.round((lastContextInfo.inputTokens / lastContextInfo.contextWindow) * 100);
|
|
116
|
+
(0, spinner_1.updateSpinnerTokens)(lastContextInfo.inputTokens, pct);
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
onToolEvent: (event) => {
|
|
120
|
+
if (event.type === 'tool_start') {
|
|
121
|
+
// Flush any partial progress line before spinner takes over (wrap long lines)
|
|
122
|
+
if (progressBuffer) {
|
|
123
|
+
if (progressLineActive) {
|
|
124
|
+
const wrapped = (0, prompt_1.wrapText)(progressBuffer);
|
|
125
|
+
(0, prompt_1.updateAbove)(wrapped[0]);
|
|
126
|
+
for (let w = 1; w < wrapped.length; w++)
|
|
127
|
+
(0, prompt_1.writeAbove)(wrapped[w]);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
(0, prompt_1.writeAbove)(progressBuffer);
|
|
131
|
+
}
|
|
132
|
+
progressBuffer = '';
|
|
133
|
+
progressLineActive = false;
|
|
134
|
+
}
|
|
135
|
+
// Restart spinner with tool verb
|
|
136
|
+
if (!(0, spinner_1.isSpinnerActive)())
|
|
137
|
+
(0, spinner_1.startSpinner)();
|
|
138
|
+
(0, spinner_1.updateSpinnerVerb)(event.toolName);
|
|
139
|
+
}
|
|
140
|
+
else if (event.type === 'tool_end') {
|
|
141
|
+
// Revert to "Thinking" after tool completes
|
|
142
|
+
(0, spinner_1.clearThinkingVerb)();
|
|
143
|
+
}
|
|
144
|
+
else if (event.type === 'tool_progress') {
|
|
145
|
+
(0, spinner_1.updateSpinnerVerb)(event.toolName);
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
})) {
|
|
149
|
+
if (!currentSessionId)
|
|
150
|
+
break;
|
|
151
|
+
(0, client_1.sendMessage)({
|
|
152
|
+
type: 'message',
|
|
153
|
+
session_id: currentSessionId,
|
|
154
|
+
role: execMsg.role,
|
|
155
|
+
content: execMsg.content,
|
|
156
|
+
timestamp: new Date().toISOString(),
|
|
157
|
+
});
|
|
158
|
+
if (execMsg.stats) {
|
|
159
|
+
stats = execMsg.stats;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
(0, prompt_1.printError)(`execution error: ${err}`);
|
|
165
|
+
}
|
|
166
|
+
// Ensure spinner is stopped
|
|
167
|
+
(0, spinner_1.stopSpinner)();
|
|
168
|
+
// Flush any remaining partial line from streaming output (wrap long lines)
|
|
169
|
+
if (progressBuffer) {
|
|
170
|
+
if (progressLineActive) {
|
|
171
|
+
const wrapped = (0, prompt_1.wrapText)(progressBuffer);
|
|
172
|
+
(0, prompt_1.updateAbove)(wrapped[0]);
|
|
173
|
+
for (let w = 1; w < wrapped.length; w++)
|
|
174
|
+
(0, prompt_1.writeAbove)(wrapped[w]);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
(0, prompt_1.writeAbove)(progressBuffer);
|
|
178
|
+
}
|
|
179
|
+
progressBuffer = '';
|
|
180
|
+
progressLineActive = false;
|
|
181
|
+
}
|
|
182
|
+
if (currentPromptId && currentSessionId) {
|
|
183
|
+
(0, client_1.sendMessage)({
|
|
184
|
+
type: 'execution_complete',
|
|
185
|
+
prompt_id: currentPromptId,
|
|
186
|
+
session_id: currentSessionId,
|
|
187
|
+
...(stats && {
|
|
188
|
+
token_usage: {
|
|
189
|
+
input_tokens: stats.input_tokens,
|
|
190
|
+
output_tokens: stats.output_tokens,
|
|
191
|
+
},
|
|
192
|
+
cost_usd: stats.cost_usd,
|
|
193
|
+
num_turns: stats.num_turns,
|
|
194
|
+
duration_ms: stats.duration_ms,
|
|
195
|
+
}),
|
|
196
|
+
});
|
|
197
|
+
if (stats) {
|
|
198
|
+
(0, prompt_1.writeAbove)('');
|
|
199
|
+
(0, prompt_1.printStatus)(`${stats.num_turns} turns | ${stats.input_tokens + stats.output_tokens} tokens | $${stats.cost_usd.toFixed(4)} | ${(stats.duration_ms / 1000).toFixed(1)}s`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Clear resume after first execution — subsequent prompts start fresh
|
|
203
|
+
resumeSessionId = undefined;
|
|
204
|
+
setStatus('idle');
|
|
205
|
+
executing = false;
|
|
206
|
+
currentPromptId = null;
|
|
207
|
+
currentSessionId = null;
|
|
208
|
+
(0, prompt_1.writeAbove)('');
|
|
209
|
+
syncStatusBar();
|
|
210
|
+
}
|
|
211
|
+
// ─── WebSocket message handler ──────────────────────────────────────
|
|
212
|
+
(0, client_1.onMessage)((msg) => {
|
|
213
|
+
if (msg.type === 'registered') {
|
|
214
|
+
(0, prompt_1.printInfo)(`connected: ${config_1.config.backendUrl}`);
|
|
215
|
+
(0, prompt_1.writeAbove)('');
|
|
216
|
+
setStatus('idle');
|
|
217
|
+
syncStatusBar();
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
if (msg.type !== 'execute_prompt')
|
|
221
|
+
return;
|
|
222
|
+
if (executing) {
|
|
223
|
+
(0, prompt_1.printInfo)(`ignoring execute_prompt (already executing ${currentPromptId})`);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
handleExecutePrompt(msg).catch(err => {
|
|
227
|
+
(0, prompt_1.printError)(`unhandled execution error: ${err}`);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
// ─── Stdin input ────────────────────────────────────────────────────
|
|
231
|
+
function startStdinInput() {
|
|
232
|
+
// SDK always runs with bypass permissions
|
|
233
|
+
styledRL = (0, prompt_1.createPrompt)({ statusLine: '⏵⏵ bypass permissions on' });
|
|
234
|
+
// Activate the pinned prompt area at the bottom of the terminal
|
|
235
|
+
styledRL.prompt();
|
|
236
|
+
styledRL.onSubmit(async (input, _displayInput) => {
|
|
237
|
+
const text = input.trim();
|
|
238
|
+
if (!text) {
|
|
239
|
+
syncStatusBar();
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
if (text === 'exit') {
|
|
243
|
+
shutdown(0);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (executing) {
|
|
247
|
+
(0, prompt_1.printInfo)('execution in progress, please wait');
|
|
248
|
+
syncStatusBar();
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
// Check for slash commands
|
|
252
|
+
if (text.startsWith('/')) {
|
|
253
|
+
const result = await (0, commands_1.dispatch)(text, styledRL.rl);
|
|
254
|
+
if (result.resumeSessionId) {
|
|
255
|
+
resumeSessionId = result.resumeSessionId;
|
|
256
|
+
(0, prompt_1.printStatus)(`Session loaded — next prompt will resume it`);
|
|
257
|
+
}
|
|
258
|
+
if (result.handled) {
|
|
259
|
+
(0, prompt_1.writeAbove)('');
|
|
260
|
+
syncStatusBar();
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Regular text — send to backend
|
|
265
|
+
(0, client_1.sendMessage)({ type: 'local_prompt', text });
|
|
266
|
+
});
|
|
267
|
+
// Double Ctrl-C to exit (like Claude Code)
|
|
268
|
+
let lastCtrlC = 0;
|
|
269
|
+
styledRL.onSigint(() => {
|
|
270
|
+
const now = Date.now();
|
|
271
|
+
if (now - lastCtrlC < 1500) {
|
|
272
|
+
shutdown(0);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
lastCtrlC = now;
|
|
276
|
+
// Show hint in the status area — no scrolling
|
|
277
|
+
styledRL.setStatus('Press Ctrl+C again to exit');
|
|
278
|
+
setTimeout(() => {
|
|
279
|
+
if (styledRL && Date.now() - lastCtrlC >= 1400) {
|
|
280
|
+
styledRL.setStatus(statusText());
|
|
281
|
+
}
|
|
282
|
+
}, 1500);
|
|
283
|
+
});
|
|
284
|
+
styledRL.onClose(() => {
|
|
285
|
+
if (!shuttingDown)
|
|
286
|
+
shutdown(0);
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
// ─── Shutdown ───────────────────────────────────────────────────────
|
|
290
|
+
function shutdown(exitCode = 0) {
|
|
291
|
+
if (shuttingDown)
|
|
292
|
+
return;
|
|
293
|
+
shuttingDown = true;
|
|
294
|
+
(0, spinner_1.stopSpinner)();
|
|
295
|
+
(0, prompt_1.writeAbove)('');
|
|
296
|
+
(0, prompt_1.printInfo)('shutting down...');
|
|
297
|
+
if (styledRL) {
|
|
298
|
+
styledRL.close();
|
|
299
|
+
styledRL = null;
|
|
300
|
+
}
|
|
301
|
+
// Restore terminal state before exit
|
|
302
|
+
if (process.stdin.isTTY) {
|
|
303
|
+
process.stdin.setRawMode?.(false);
|
|
304
|
+
}
|
|
305
|
+
process.stdin.pause();
|
|
306
|
+
(0, client_1.disconnect)();
|
|
307
|
+
process.exit(exitCode);
|
|
308
|
+
}
|
|
309
|
+
// SIGTERM from kill — immediate shutdown (no double-press needed)
|
|
310
|
+
process.on('SIGTERM', () => shutdown(0));
|
|
311
|
+
// ─── Project name fetch ─────────────────────────────────────────────
|
|
312
|
+
async function fetchProjectName() {
|
|
313
|
+
try {
|
|
314
|
+
// Derive HTTP base URL from WebSocket URL (ws://host/ws → http://host)
|
|
315
|
+
const wsUrl = new URL(config_1.config.backendUrl);
|
|
316
|
+
const httpProto = wsUrl.protocol === 'wss:' ? 'https:' : 'http:';
|
|
317
|
+
const baseUrl = `${httpProto}//${wsUrl.host}`;
|
|
318
|
+
const res = await fetch(`${baseUrl}/projects/${config_1.config.projectId}`, {
|
|
319
|
+
headers: { Authorization: `Bearer ${config_1.config.apiKey}` },
|
|
320
|
+
});
|
|
321
|
+
if (!res.ok)
|
|
322
|
+
return null;
|
|
323
|
+
const project = await res.json();
|
|
324
|
+
return project.name || null;
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// ─── Start ──────────────────────────────────────────────────────────
|
|
331
|
+
async function start() {
|
|
332
|
+
(0, prompt_1.printBanner)();
|
|
333
|
+
const projectName = await fetchProjectName();
|
|
334
|
+
if (projectName) {
|
|
335
|
+
(0, prompt_1.printInfo)(`project: ${projectName} (${config_1.config.projectId})`);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
(0, prompt_1.printInfo)(`project: ${config_1.config.projectId}`);
|
|
339
|
+
}
|
|
340
|
+
(0, prompt_1.printInfo)(`machine: ${config_1.config.machineName}`);
|
|
341
|
+
(0, client_1.connect)();
|
|
342
|
+
startStdinInput();
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/dist/setup.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAsEA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAmF9C"}
|
package/dist/setup.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.runSetup = runSetup;
|
|
7
|
+
const readline_1 = __importDefault(require("readline"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const http_1 = __importDefault(require("http"));
|
|
10
|
+
const https_1 = __importDefault(require("https"));
|
|
11
|
+
const config_1 = require("./config");
|
|
12
|
+
// ─── I/O helpers ────────────────────────────────────────────────────
|
|
13
|
+
function createPrompt() {
|
|
14
|
+
return readline_1.default.createInterface({
|
|
15
|
+
input: process.stdin,
|
|
16
|
+
output: process.stdout,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function ask(rl, question) {
|
|
20
|
+
return new Promise((resolve) => {
|
|
21
|
+
rl.question(question, (answer) => resolve(answer.trim()));
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function fetchJson(url, headers) {
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
const parsed = new URL(url);
|
|
27
|
+
const client = parsed.protocol === 'https:' ? https_1.default : http_1.default;
|
|
28
|
+
const opts = {
|
|
29
|
+
hostname: parsed.hostname,
|
|
30
|
+
port: parsed.port,
|
|
31
|
+
path: parsed.pathname + parsed.search,
|
|
32
|
+
method: 'GET',
|
|
33
|
+
headers: headers || {},
|
|
34
|
+
};
|
|
35
|
+
client.request(opts, (res) => {
|
|
36
|
+
let data = '';
|
|
37
|
+
res.on('data', (chunk) => (data += chunk));
|
|
38
|
+
res.on('end', () => {
|
|
39
|
+
if (res.statusCode && res.statusCode >= 400) {
|
|
40
|
+
reject(new Error(`HTTP ${res.statusCode}: ${data}`));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
resolve(JSON.parse(data));
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
reject(new Error(`Invalid JSON from ${url}`));
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}).on('error', reject).end();
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function wsUrlToHttpUrl(wsUrl) {
|
|
54
|
+
return wsUrl
|
|
55
|
+
.replace(/^wss:/, 'https:')
|
|
56
|
+
.replace(/^ws:/, 'http:')
|
|
57
|
+
.replace(/\/ws\/?$/, '');
|
|
58
|
+
}
|
|
59
|
+
// ─── Setup flow ─────────────────────────────────────────────────────
|
|
60
|
+
async function runSetup() {
|
|
61
|
+
const rl = createPrompt();
|
|
62
|
+
const global = (0, config_1.readGlobalConfig)();
|
|
63
|
+
console.log('\n AICP Agent Setup\n');
|
|
64
|
+
// Step 1: Backend URL
|
|
65
|
+
const defaultUrl = global.backend_url || 'ws://localhost:8080/ws';
|
|
66
|
+
const backendUrl = (await ask(rl, ` Backend WebSocket URL [${defaultUrl}]: `)) || defaultUrl;
|
|
67
|
+
// Step 2: Machine name
|
|
68
|
+
const defaultMachine = global.machine_name || os_1.default.hostname();
|
|
69
|
+
const machineName = (await ask(rl, ` Machine name [${defaultMachine}]: `)) || defaultMachine;
|
|
70
|
+
// Step 3: API key
|
|
71
|
+
const defaultApiKey = global.api_key || '';
|
|
72
|
+
const apiKeyDisplay = defaultApiKey ? `[${defaultApiKey.slice(0, 13)}...]` : '[none]';
|
|
73
|
+
const apiKeyInput = await ask(rl, ` API Key ${apiKeyDisplay}: `);
|
|
74
|
+
const apiKey = apiKeyInput || defaultApiKey;
|
|
75
|
+
if (!apiKey) {
|
|
76
|
+
console.error('\n API key is required. Generate one in the AICP web UI (Avatar → API Keys).');
|
|
77
|
+
rl.close();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (!apiKey.startsWith('aicp_')) {
|
|
81
|
+
console.error('\n Invalid API key format. Keys start with "aicp_".');
|
|
82
|
+
rl.close();
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Save global config
|
|
86
|
+
(0, config_1.writeGlobalConfig)({ backend_url: backendUrl, machine_name: machineName, api_key: apiKey });
|
|
87
|
+
console.log('\n Global config saved to ~/.aicp/config.json');
|
|
88
|
+
// Step 4: Project selection
|
|
89
|
+
const httpBase = wsUrlToHttpUrl(backendUrl);
|
|
90
|
+
let projects = [];
|
|
91
|
+
console.log(`\n Fetching projects from ${httpBase}...`);
|
|
92
|
+
try {
|
|
93
|
+
projects = await fetchJson(`${httpBase}/api/projects`, {
|
|
94
|
+
Authorization: `Bearer ${apiKey}`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
console.error(` Could not fetch projects: ${err.message}`);
|
|
99
|
+
console.error(' Check that your API key is valid.');
|
|
100
|
+
rl.close();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (projects.length === 0) {
|
|
104
|
+
console.log(' No projects found. Create one in the AICP web UI first.');
|
|
105
|
+
rl.close();
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const local = (0, config_1.readLocalConfig)();
|
|
109
|
+
console.log('');
|
|
110
|
+
for (let i = 0; i < projects.length; i++) {
|
|
111
|
+
const current = projects[i].id === local.project_id ? ' (current)' : '';
|
|
112
|
+
console.log(` ${i + 1}. ${projects[i].name}${current}`);
|
|
113
|
+
}
|
|
114
|
+
console.log('');
|
|
115
|
+
const choice = await ask(rl, ` Select project [1-${projects.length}]: `);
|
|
116
|
+
const index = parseInt(choice, 10) - 1;
|
|
117
|
+
if (isNaN(index) || index < 0 || index >= projects.length) {
|
|
118
|
+
console.error(' Invalid selection.');
|
|
119
|
+
rl.close();
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const selected = projects[index];
|
|
123
|
+
(0, config_1.writeLocalConfig)({ project_id: selected.id });
|
|
124
|
+
const localPath = (0, config_1.findLocalConfigPath)() || `${process.cwd()}/.aicp/aicp.json`;
|
|
125
|
+
console.log(`\n Project "${selected.name}" saved to ${localPath}`);
|
|
126
|
+
console.log('\n Setup complete. Run aicp-agent to start.\n');
|
|
127
|
+
rl.close();
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=setup.js.map
|