argos-ai 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 +15 -0
- package/dist/commands/default.d.ts +9 -0
- package/dist/commands/default.d.ts.map +1 -0
- package/dist/commands/default.js +241 -0
- package/dist/commands/default.js.map +1 -0
- package/dist/commands/hook.d.ts +7 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +171 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/logout.d.ts +5 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +34 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +51 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +9 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +54 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/auth-flow.d.ts +12 -0
- package/dist/lib/auth-flow.d.ts.map +1 -0
- package/dist/lib/auth-flow.js +80 -0
- package/dist/lib/auth-flow.js.map +1 -0
- package/dist/lib/config.d.ts +12 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +48 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/hooks-inject.d.ts +8 -0
- package/dist/lib/hooks-inject.d.ts.map +1 -0
- package/dist/lib/hooks-inject.js +50 -0
- package/dist/lib/hooks-inject.js.map +1 -0
- package/dist/lib/project.d.ts +21 -0
- package/dist/lib/project.d.ts.map +1 -0
- package/dist/lib/project.js +52 -0
- package/dist/lib/project.js.map +1 -0
- package/dist/lib/transcript.d.ts +41 -0
- package/dist/lib/transcript.d.ts.map +1 -0
- package/dist/lib/transcript.js +110 -0
- package/dist/lib/transcript.js.map +1 -0
- package/package.json +29 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API client for making authenticated requests to Argos API
|
|
3
|
+
*/
|
|
4
|
+
export interface ApiRequestOptions extends RequestInit {
|
|
5
|
+
token?: string;
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function apiRequest<T>(path: string, options: ApiRequestOptions): Promise<T>;
|
|
9
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAsB,UAAU,CAAC,CAAC,EAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CAyDZ"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API client for making authenticated requests to Argos API
|
|
3
|
+
*/
|
|
4
|
+
export async function apiRequest(path, options) {
|
|
5
|
+
const { token, baseUrl, ...fetchOptions } = options;
|
|
6
|
+
const url = `${baseUrl || ''}${path}`;
|
|
7
|
+
const headers = {
|
|
8
|
+
'Content-Type': 'application/json',
|
|
9
|
+
};
|
|
10
|
+
// Merge existing headers
|
|
11
|
+
if (fetchOptions.headers) {
|
|
12
|
+
const existingHeaders = new Headers(fetchOptions.headers);
|
|
13
|
+
existingHeaders.forEach((value, key) => {
|
|
14
|
+
headers[key] = value;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
if (token) {
|
|
18
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
19
|
+
}
|
|
20
|
+
const controller = new AbortController();
|
|
21
|
+
const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout
|
|
22
|
+
try {
|
|
23
|
+
const response = await fetch(url, {
|
|
24
|
+
...fetchOptions,
|
|
25
|
+
headers,
|
|
26
|
+
signal: fetchOptions.signal || controller.signal,
|
|
27
|
+
});
|
|
28
|
+
clearTimeout(timeoutId);
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
const errorText = await response.text().catch(() => 'Unknown error');
|
|
31
|
+
let errorMessage;
|
|
32
|
+
try {
|
|
33
|
+
const errorJson = JSON.parse(errorText);
|
|
34
|
+
errorMessage = errorJson.error?.message || errorJson.message || response.statusText;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
errorMessage = errorText || response.statusText;
|
|
38
|
+
}
|
|
39
|
+
throw new Error(`API Error (${response.status}): ${errorMessage}`);
|
|
40
|
+
}
|
|
41
|
+
return await response.json();
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
clearTimeout(timeoutId);
|
|
45
|
+
if (err instanceof Error) {
|
|
46
|
+
if (err.name === 'AbortError') {
|
|
47
|
+
throw new Error('API request timed out');
|
|
48
|
+
}
|
|
49
|
+
throw err;
|
|
50
|
+
}
|
|
51
|
+
throw new Error('Unknown API error');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,OAA0B;IAE1B,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,CAAA;IAEnD,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,EAAE,GAAG,IAAI,EAAE,CAAA;IACrC,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAA;IAED,yBAAyB;IACzB,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;QACzD,eAAe,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACrC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACtB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAA;IAC9C,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAA,CAAC,oBAAoB;IAElF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,GAAG,YAAY;YACf,OAAO;YACP,MAAM,EAAE,YAAY,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM;SACjD,CAAC,CAAA;QAEF,YAAY,CAAC,SAAS,CAAC,CAAA;QAEvB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,CAAA;YACpE,IAAI,YAAoB,CAAA;YAExB,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;gBACvC,YAAY,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,IAAI,SAAS,CAAC,OAAO,IAAI,QAAQ,CAAC,UAAU,CAAA;YACrF,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY,GAAG,SAAS,IAAI,QAAQ,CAAC,UAAU,CAAA;YACjD,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,cAAc,QAAQ,CAAC,MAAM,MAAM,YAAY,EAAE,CAAC,CAAA;QACpE,CAAC;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,SAAS,CAAC,CAAA;QACvB,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;YAC1C,CAAC;YACD,MAAM,GAAG,CAAA;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACtC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { LoginResponse } from '@argos/shared';
|
|
2
|
+
/**
|
|
3
|
+
* Run interactive login flow
|
|
4
|
+
* Prompts for email and password, then calls API login endpoint
|
|
5
|
+
*/
|
|
6
|
+
export declare function runLoginFlow(apiUrl: string): Promise<LoginResponse>;
|
|
7
|
+
/**
|
|
8
|
+
* Run interactive registration flow
|
|
9
|
+
* Prompts for name, email, and password, then calls API register endpoint
|
|
10
|
+
*/
|
|
11
|
+
export declare function runRegisterFlow(apiUrl: string): Promise<LoginResponse>;
|
|
12
|
+
//# sourceMappingURL=auth-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-flow.d.ts","sourceRoot":"","sources":["../../src/lib/auth-flow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,aAAa,EAAE,MAAM,eAAe,CAAA;AAGxD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA8BzE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA4C5E"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { input, password } from '@inquirer/prompts';
|
|
2
|
+
import { apiRequest } from './api-client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Run interactive login flow
|
|
5
|
+
* Prompts for email and password, then calls API login endpoint
|
|
6
|
+
*/
|
|
7
|
+
export async function runLoginFlow(apiUrl) {
|
|
8
|
+
const email = await input({
|
|
9
|
+
message: '이메일을 입력하세요:',
|
|
10
|
+
validate: (value) => {
|
|
11
|
+
if (!value || !value.includes('@')) {
|
|
12
|
+
return '유효한 이메일을 입력하세요.';
|
|
13
|
+
}
|
|
14
|
+
return true;
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
const pwd = await password({
|
|
18
|
+
message: '비밀번호를 입력하세요:',
|
|
19
|
+
mask: '•',
|
|
20
|
+
});
|
|
21
|
+
try {
|
|
22
|
+
const response = await apiRequest(`${apiUrl}/api/auth/login`, {
|
|
23
|
+
method: 'POST',
|
|
24
|
+
body: JSON.stringify({ email, password: pwd }),
|
|
25
|
+
baseUrl: '',
|
|
26
|
+
});
|
|
27
|
+
return response;
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
31
|
+
throw new Error(`로그인 실패: ${errorMessage}\n계정이 없다면 argos register를 실행하세요.`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Run interactive registration flow
|
|
36
|
+
* Prompts for name, email, and password, then calls API register endpoint
|
|
37
|
+
*/
|
|
38
|
+
export async function runRegisterFlow(apiUrl) {
|
|
39
|
+
const name = await input({
|
|
40
|
+
message: '이름을 입력하세요:',
|
|
41
|
+
validate: (value) => {
|
|
42
|
+
if (!value || value.trim().length === 0) {
|
|
43
|
+
return '이름을 입력하세요.';
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
const email = await input({
|
|
49
|
+
message: '이메일을 입력하세요:',
|
|
50
|
+
validate: (value) => {
|
|
51
|
+
if (!value || !value.includes('@')) {
|
|
52
|
+
return '유효한 이메일을 입력하세요.';
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
const pwd = await password({
|
|
58
|
+
message: '비밀번호를 입력하세요 (최소 8자):',
|
|
59
|
+
mask: '•',
|
|
60
|
+
validate: (value) => {
|
|
61
|
+
if (!value || value.length < 8) {
|
|
62
|
+
return '비밀번호는 최소 8자 이상이어야 합니다.';
|
|
63
|
+
}
|
|
64
|
+
return true;
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
try {
|
|
68
|
+
const response = await apiRequest(`${apiUrl}/api/auth/register`, {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
body: JSON.stringify({ name, email, password: pwd }),
|
|
71
|
+
baseUrl: '',
|
|
72
|
+
});
|
|
73
|
+
return response;
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
77
|
+
throw new Error(`회원가입 실패: ${errorMessage}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=auth-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-flow.js","sourceRoot":"","sources":["../../src/lib/auth-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface Config {
|
|
2
|
+
token: string;
|
|
3
|
+
apiUrl: string;
|
|
4
|
+
userId: string;
|
|
5
|
+
email: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function getConfigPath(): string;
|
|
8
|
+
export declare function readConfig(): Config | null;
|
|
9
|
+
export declare function writeConfig(config: Config): void;
|
|
10
|
+
export declare function deleteConfig(): void;
|
|
11
|
+
export declare function requireAuth(): Config;
|
|
12
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAW1C;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAShD;AAED,wBAAgB,YAAY,IAAI,IAAI,CASnC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAQpC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { homedir } from 'os';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, unlinkSync } from 'fs';
|
|
4
|
+
export function getConfigPath() {
|
|
5
|
+
return join(homedir(), '.argos', 'config.json');
|
|
6
|
+
}
|
|
7
|
+
export function readConfig() {
|
|
8
|
+
try {
|
|
9
|
+
const configPath = getConfigPath();
|
|
10
|
+
if (!existsSync(configPath)) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const content = readFileSync(configPath, 'utf8');
|
|
14
|
+
return JSON.parse(content);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function writeConfig(config) {
|
|
21
|
+
const configPath = getConfigPath();
|
|
22
|
+
const configDir = join(homedir(), '.argos');
|
|
23
|
+
if (!existsSync(configDir)) {
|
|
24
|
+
mkdirSync(configDir, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf8');
|
|
27
|
+
}
|
|
28
|
+
export function deleteConfig() {
|
|
29
|
+
try {
|
|
30
|
+
const configPath = getConfigPath();
|
|
31
|
+
if (existsSync(configPath)) {
|
|
32
|
+
unlinkSync(configPath);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
// Ignore errors
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function requireAuth() {
|
|
40
|
+
const config = readConfig();
|
|
41
|
+
if (!config) {
|
|
42
|
+
console.error('✗ 로그인이 필요합니다.');
|
|
43
|
+
console.error(' argos를 실행하여 로그인하세요.');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
return config;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AASnF,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,EAAE,CAAA;QAClC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAW,CAAA;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAA;IAE3C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3C,CAAC;IAED,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;AACpE,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,EAAE,CAAA;QAClC,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,UAAU,CAAC,UAAU,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gBAAgB;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QAC9B,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inject Argos hooks into .claude/settings.json
|
|
3
|
+
* Idempotent - won't duplicate if already present
|
|
4
|
+
* @param settingsPath Path to .claude/settings.json
|
|
5
|
+
* @returns 'injected' if new hooks were added, 'already_present' if hooks were already there
|
|
6
|
+
*/
|
|
7
|
+
export declare function injectHooks(settingsPath: string): 'injected' | 'already_present';
|
|
8
|
+
//# sourceMappingURL=hooks-inject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-inject.d.ts","sourceRoot":"","sources":["../../src/lib/hooks-inject.ts"],"names":[],"mappings":"AAoBA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,iBAAiB,CA+ChF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
2
|
+
import { dirname } from 'path';
|
|
3
|
+
const ARGOS_HOOK_COMMAND = 'argos hook';
|
|
4
|
+
const HOOK_EVENTS = ['SessionStart', 'PreToolUse', 'PostToolUse', 'Stop', 'SubagentStop'];
|
|
5
|
+
/**
|
|
6
|
+
* Inject Argos hooks into .claude/settings.json
|
|
7
|
+
* Idempotent - won't duplicate if already present
|
|
8
|
+
* @param settingsPath Path to .claude/settings.json
|
|
9
|
+
* @returns 'injected' if new hooks were added, 'already_present' if hooks were already there
|
|
10
|
+
*/
|
|
11
|
+
export function injectHooks(settingsPath) {
|
|
12
|
+
// Ensure directory exists
|
|
13
|
+
const settingsDir = dirname(settingsPath);
|
|
14
|
+
if (!existsSync(settingsDir)) {
|
|
15
|
+
mkdirSync(settingsDir, { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
// Read existing settings or create empty object
|
|
18
|
+
let settings = {};
|
|
19
|
+
if (existsSync(settingsPath)) {
|
|
20
|
+
try {
|
|
21
|
+
const content = readFileSync(settingsPath, 'utf8');
|
|
22
|
+
settings = JSON.parse(content);
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
// If file is corrupted, start fresh
|
|
26
|
+
settings = {};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
settings.hooks = settings.hooks || {};
|
|
30
|
+
let changed = false;
|
|
31
|
+
for (const event of HOOK_EVENTS) {
|
|
32
|
+
const hooks = settings.hooks[event] || [];
|
|
33
|
+
// Check if argos hook already exists
|
|
34
|
+
const alreadyExists = hooks.some((entry) => entry.hooks?.some((hook) => hook.command === ARGOS_HOOK_COMMAND));
|
|
35
|
+
if (!alreadyExists) {
|
|
36
|
+
hooks.push({
|
|
37
|
+
matcher: '',
|
|
38
|
+
hooks: [{ type: 'command', command: ARGOS_HOOK_COMMAND }],
|
|
39
|
+
});
|
|
40
|
+
settings.hooks[event] = hooks;
|
|
41
|
+
changed = true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (changed) {
|
|
45
|
+
writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8');
|
|
46
|
+
return 'injected';
|
|
47
|
+
}
|
|
48
|
+
return 'already_present';
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=hooks-inject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks-inject.js","sourceRoot":"","sources":["../../src/lib/hooks-inject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAE9B,MAAM,kBAAkB,GAAG,YAAY,CAAA;AACvC,MAAM,WAAW,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,CAAC,CAAA;AAgBzF;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,YAAoB;IAC9C,0BAA0B;IAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IACzC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,CAAC;IAED,gDAAgD;IAChD,IAAI,QAAQ,GAAiB,EAAE,CAAA;IAC/B,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;YAClD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,oCAAoC;YACpC,QAAQ,GAAG,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAA;IAErC,IAAI,OAAO,GAAG,KAAK,CAAA;IAEnB,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,MAAM,KAAK,GAAgB,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;QAEtD,qCAAqC;QACrC,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACzC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,kBAAkB,CAAC,CACjE,CAAA;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC;gBACT,OAAO,EAAE,EAAE;gBACX,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;aAC1D,CAAC,CAAA;YACF,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;YAC7B,OAAO,GAAG,IAAI,CAAA;QAChB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QACtE,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,OAAO,iBAAiB,CAAA;AAC1B,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ProjectConfig {
|
|
2
|
+
projectId: string;
|
|
3
|
+
orgId: string;
|
|
4
|
+
orgName: string;
|
|
5
|
+
projectName: string;
|
|
6
|
+
apiUrl: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Find .argos/project.json by traversing up from startDir
|
|
10
|
+
* @param startDir Starting directory (defaults to process.cwd())
|
|
11
|
+
* @returns ProjectConfig or null if not found
|
|
12
|
+
*/
|
|
13
|
+
export declare function findProjectConfig(startDir?: string): ProjectConfig | null;
|
|
14
|
+
/**
|
|
15
|
+
* Write project config to dir/.argos/project.json
|
|
16
|
+
* Also creates .argos/.gitignore with a comment (but doesn't actually ignore the directory)
|
|
17
|
+
* @param config Project configuration
|
|
18
|
+
* @param dir Target directory (defaults to process.cwd())
|
|
19
|
+
*/
|
|
20
|
+
export declare function writeProjectConfig(config: ProjectConfig, dir?: string): void;
|
|
21
|
+
//# sourceMappingURL=project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA0BzE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAe5E"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { dirname, join } from 'path';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
3
|
+
/**
|
|
4
|
+
* Find .argos/project.json by traversing up from startDir
|
|
5
|
+
* @param startDir Starting directory (defaults to process.cwd())
|
|
6
|
+
* @returns ProjectConfig or null if not found
|
|
7
|
+
*/
|
|
8
|
+
export function findProjectConfig(startDir) {
|
|
9
|
+
let currentDir = startDir || process.cwd();
|
|
10
|
+
let depth = 0;
|
|
11
|
+
const maxDepth = 10;
|
|
12
|
+
while (depth < maxDepth) {
|
|
13
|
+
const configPath = join(currentDir, '.argos', 'project.json');
|
|
14
|
+
if (existsSync(configPath)) {
|
|
15
|
+
try {
|
|
16
|
+
const content = readFileSync(configPath, 'utf8');
|
|
17
|
+
return JSON.parse(content);
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const parentDir = dirname(currentDir);
|
|
24
|
+
if (parentDir === currentDir) {
|
|
25
|
+
// Reached root directory
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
currentDir = parentDir;
|
|
29
|
+
depth++;
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Write project config to dir/.argos/project.json
|
|
35
|
+
* Also creates .argos/.gitignore with a comment (but doesn't actually ignore the directory)
|
|
36
|
+
* @param config Project configuration
|
|
37
|
+
* @param dir Target directory (defaults to process.cwd())
|
|
38
|
+
*/
|
|
39
|
+
export function writeProjectConfig(config, dir) {
|
|
40
|
+
const targetDir = dir || process.cwd();
|
|
41
|
+
const argosDir = join(targetDir, '.argos');
|
|
42
|
+
if (!existsSync(argosDir)) {
|
|
43
|
+
mkdirSync(argosDir, { recursive: true });
|
|
44
|
+
}
|
|
45
|
+
const configPath = join(argosDir, 'project.json');
|
|
46
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf8');
|
|
47
|
+
// Create .gitignore with comment (but don't actually ignore anything)
|
|
48
|
+
const gitignorePath = join(argosDir, '.gitignore');
|
|
49
|
+
const gitignoreComment = '# argos 설정 (gitignore 하지 않음)\n';
|
|
50
|
+
writeFileSync(gitignorePath, gitignoreComment, 'utf8');
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/lib/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAUvE;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAiB;IACjD,IAAI,UAAU,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IAC1C,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,MAAM,QAAQ,GAAG,EAAE,CAAA;IAEnB,OAAO,KAAK,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAA;QAC7D,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;gBAChD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAA;YAC7C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;QACrC,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,yBAAyB;YACzB,MAAK;QACP,CAAC;QACD,UAAU,GAAG,SAAS,CAAA;QACtB,KAAK,EAAE,CAAA;IACT,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAqB,EAAE,GAAY;IACpE,MAAM,SAAS,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAE1C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1C,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;IACjD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;IAElE,sEAAsE;IACtE,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IAClD,MAAM,gBAAgB,GAAG,gCAAgC,CAAA;IACzD,aAAa,CAAC,aAAa,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAA;AACxD,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { UsagePayload, MessagePayload } from '@argos/shared';
|
|
2
|
+
interface TranscriptLine {
|
|
3
|
+
type?: string;
|
|
4
|
+
message?: {
|
|
5
|
+
usage?: {
|
|
6
|
+
input_tokens?: number;
|
|
7
|
+
output_tokens?: number;
|
|
8
|
+
cache_creation_input_tokens?: number;
|
|
9
|
+
cache_read_input_tokens?: number;
|
|
10
|
+
};
|
|
11
|
+
model?: string;
|
|
12
|
+
content?: Array<{
|
|
13
|
+
type?: string;
|
|
14
|
+
text?: string;
|
|
15
|
+
}>;
|
|
16
|
+
};
|
|
17
|
+
content?: string;
|
|
18
|
+
timestamp?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Read transcript.jsonl file and parse each line
|
|
22
|
+
*/
|
|
23
|
+
export declare function readTranscriptLines(path: string): Promise<TranscriptLine[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Extract usage information from transcript (Stop/SubagentStop events)
|
|
26
|
+
* Sums up all usage from type==="assistant" entries
|
|
27
|
+
*/
|
|
28
|
+
export declare function extractUsageFromTranscript(transcriptPath: string): Promise<UsagePayload | null>;
|
|
29
|
+
/**
|
|
30
|
+
* Detect slash command from SessionStart transcript
|
|
31
|
+
* Looks for queue-operation entry with content starting with '/'
|
|
32
|
+
* Returns the skill name without the '/' prefix
|
|
33
|
+
*/
|
|
34
|
+
export declare function detectSlashCommand(transcriptPath: string): Promise<string | null>;
|
|
35
|
+
/**
|
|
36
|
+
* Extract all HUMAN/ASSISTANT messages from transcript
|
|
37
|
+
* Returns array of MessagePayload (text blocks only, 50k truncation)
|
|
38
|
+
*/
|
|
39
|
+
export declare function extractMessages(transcriptPath: string): Promise<MessagePayload[]>;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=transcript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../src/lib/transcript.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEjE,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE;YACN,YAAY,CAAC,EAAE,MAAM,CAAA;YACrB,aAAa,CAAC,EAAE,MAAM,CAAA;YACtB,2BAA2B,CAAC,EAAE,MAAM,CAAA;YACpC,uBAAuB,CAAC,EAAE,MAAM,CAAA;SACjC,CAAA;QACD,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,OAAO,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAClD,CAAA;IACD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAmBjF;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAwC9B;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBvF;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA+BvF"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from 'fs';
|
|
2
|
+
/**
|
|
3
|
+
* Read transcript.jsonl file and parse each line
|
|
4
|
+
*/
|
|
5
|
+
export async function readTranscriptLines(path) {
|
|
6
|
+
if (!existsSync(path)) {
|
|
7
|
+
return [];
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
const content = readFileSync(path, 'utf8');
|
|
11
|
+
const lines = content.split('\n').filter((line) => line.trim());
|
|
12
|
+
return lines.map((line) => {
|
|
13
|
+
try {
|
|
14
|
+
return JSON.parse(line);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return {};
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Extract usage information from transcript (Stop/SubagentStop events)
|
|
27
|
+
* Sums up all usage from type==="assistant" entries
|
|
28
|
+
*/
|
|
29
|
+
export async function extractUsageFromTranscript(transcriptPath) {
|
|
30
|
+
const lines = await readTranscriptLines(transcriptPath);
|
|
31
|
+
let totalInputTokens = 0;
|
|
32
|
+
let totalOutputTokens = 0;
|
|
33
|
+
let totalCacheCreationTokens = 0;
|
|
34
|
+
let totalCacheReadTokens = 0;
|
|
35
|
+
let model;
|
|
36
|
+
for (const line of lines) {
|
|
37
|
+
if (line.type === 'assistant' && line.message?.usage) {
|
|
38
|
+
const usage = line.message.usage;
|
|
39
|
+
totalInputTokens += usage.input_tokens || 0;
|
|
40
|
+
totalOutputTokens += usage.output_tokens || 0;
|
|
41
|
+
totalCacheCreationTokens += usage.cache_creation_input_tokens || 0;
|
|
42
|
+
totalCacheReadTokens += usage.cache_read_input_tokens || 0;
|
|
43
|
+
// Get model from first assistant message
|
|
44
|
+
if (!model && line.message.model) {
|
|
45
|
+
model = line.message.model;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (totalInputTokens === 0 &&
|
|
50
|
+
totalOutputTokens === 0 &&
|
|
51
|
+
totalCacheCreationTokens === 0 &&
|
|
52
|
+
totalCacheReadTokens === 0) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
inputTokens: totalInputTokens,
|
|
57
|
+
outputTokens: totalOutputTokens,
|
|
58
|
+
cacheCreationTokens: totalCacheCreationTokens,
|
|
59
|
+
cacheReadTokens: totalCacheReadTokens,
|
|
60
|
+
model,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Detect slash command from SessionStart transcript
|
|
65
|
+
* Looks for queue-operation entry with content starting with '/'
|
|
66
|
+
* Returns the skill name without the '/' prefix
|
|
67
|
+
*/
|
|
68
|
+
export async function detectSlashCommand(transcriptPath) {
|
|
69
|
+
const lines = await readTranscriptLines(transcriptPath);
|
|
70
|
+
const queueOp = lines.find((l) => l.type === 'queue-operation' &&
|
|
71
|
+
typeof l.content === 'string' &&
|
|
72
|
+
l.content.startsWith('/'));
|
|
73
|
+
if (!queueOp || typeof queueOp.content !== 'string') {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
// Remove leading '/' and return skill name
|
|
77
|
+
return queueOp.content.slice(1);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Extract all HUMAN/ASSISTANT messages from transcript
|
|
81
|
+
* Returns array of MessagePayload (text blocks only, 50k truncation)
|
|
82
|
+
*/
|
|
83
|
+
export async function extractMessages(transcriptPath) {
|
|
84
|
+
const lines = await readTranscriptLines(transcriptPath);
|
|
85
|
+
const messages = [];
|
|
86
|
+
let sequence = 0;
|
|
87
|
+
for (const line of lines) {
|
|
88
|
+
if (line.type === 'human' || line.type === 'assistant') {
|
|
89
|
+
const role = line.type === 'human' ? 'HUMAN' : 'ASSISTANT';
|
|
90
|
+
const content = line.message?.content || [];
|
|
91
|
+
// Extract text blocks only
|
|
92
|
+
const textBlocks = content
|
|
93
|
+
.filter((block) => block.type === 'text' && block.text)
|
|
94
|
+
.map((block) => block.text || '');
|
|
95
|
+
if (textBlocks.length > 0) {
|
|
96
|
+
const fullText = textBlocks.join('\n');
|
|
97
|
+
// Truncate to 50,000 characters
|
|
98
|
+
const truncatedText = fullText.slice(0, 50000);
|
|
99
|
+
messages.push({
|
|
100
|
+
role,
|
|
101
|
+
content: truncatedText,
|
|
102
|
+
sequence: sequence++,
|
|
103
|
+
timestamp: line.timestamp || new Date().toISOString(),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return messages;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/lib/transcript.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "argos-ai",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"bin": {
|
|
6
|
+
"argos": "./dist/index.js"
|
|
7
|
+
},
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"files": ["dist", "README.md"],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc && node scripts/add-shebang.js",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"prepublishOnly": "pnpm build"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@argos/shared": "workspace:*",
|
|
17
|
+
"@inquirer/prompts": "^7",
|
|
18
|
+
"chalk": "^5",
|
|
19
|
+
"commander": "^12",
|
|
20
|
+
"ora": "^8"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "^20",
|
|
24
|
+
"typescript": "^5"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=18"
|
|
28
|
+
}
|
|
29
|
+
}
|