coolhand-cli 0.12.0 → 0.13.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/README.md +6 -1
- package/dist/api/help-center-client.d.ts.map +1 -1
- package/dist/api/help-center-client.js +5 -4
- package/dist/api/help-center-client.js.map +1 -1
- package/dist/auto-update/index.d.ts +61 -0
- package/dist/auto-update/index.d.ts.map +1 -0
- package/dist/auto-update/index.js +355 -0
- package/dist/auto-update/index.js.map +1 -0
- package/dist/auto-update/select.d.ts +28 -0
- package/dist/auto-update/select.d.ts.map +1 -0
- package/dist/auto-update/select.js +45 -0
- package/dist/auto-update/select.js.map +1 -0
- package/dist/auto-update/state.d.ts +25 -0
- package/dist/auto-update/state.d.ts.map +1 -0
- package/dist/auto-update/state.js +81 -0
- package/dist/auto-update/state.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +97 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/capture-turn.d.ts +18 -0
- package/dist/commands/capture-turn.d.ts.map +1 -0
- package/dist/commands/capture-turn.js +163 -0
- package/dist/commands/capture-turn.js.map +1 -0
- package/dist/commands/download-client-file.js +1 -1
- package/dist/commands/download-client-file.js.map +1 -1
- package/dist/commands/flush-pending.d.ts.map +1 -1
- package/dist/commands/flush-pending.js +1 -30
- package/dist/commands/flush-pending.js.map +1 -1
- package/dist/commands/logout.js +2 -2
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/update.d.ts +9 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +63 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +25 -7
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/hooks/adapters/claude.d.ts +12 -0
- package/dist/hooks/adapters/claude.d.ts.map +1 -0
- package/dist/hooks/adapters/claude.js +98 -0
- package/dist/hooks/adapters/claude.js.map +1 -0
- package/dist/hooks/adapters/copilot.d.ts +16 -0
- package/dist/hooks/adapters/copilot.d.ts.map +1 -0
- package/dist/hooks/adapters/copilot.js +115 -0
- package/dist/hooks/adapters/copilot.js.map +1 -0
- package/dist/hooks/adapters/index.d.ts +5 -0
- package/dist/hooks/adapters/index.d.ts.map +1 -0
- package/dist/hooks/adapters/index.js +8 -0
- package/dist/hooks/adapters/index.js.map +1 -0
- package/dist/hooks/adapters/shared.d.ts +32 -0
- package/dist/hooks/adapters/shared.d.ts.map +1 -0
- package/dist/hooks/adapters/shared.js +45 -0
- package/dist/hooks/adapters/shared.js.map +1 -0
- package/dist/hooks/disabled.d.ts +3 -0
- package/dist/hooks/disabled.d.ts.map +1 -0
- package/dist/hooks/disabled.js +5 -0
- package/dist/hooks/disabled.js.map +1 -0
- package/dist/hooks/hook-log.d.ts +7 -0
- package/dist/hooks/hook-log.d.ts.map +1 -0
- package/dist/hooks/hook-log.js +34 -0
- package/dist/hooks/hook-log.js.map +1 -0
- package/dist/hooks/identity.d.ts +21 -0
- package/dist/hooks/identity.d.ts.map +1 -0
- package/dist/hooks/identity.js +121 -0
- package/dist/hooks/identity.js.map +1 -0
- package/dist/hooks/log-turn.d.ts +23 -0
- package/dist/hooks/log-turn.d.ts.map +1 -0
- package/dist/hooks/log-turn.js +48 -0
- package/dist/hooks/log-turn.js.map +1 -0
- package/dist/hooks/send-turn.d.ts +32 -0
- package/dist/hooks/send-turn.d.ts.map +1 -0
- package/dist/hooks/send-turn.js +305 -0
- package/dist/hooks/send-turn.js.map +1 -0
- package/dist/hooks/silence.d.ts +7 -0
- package/dist/hooks/silence.d.ts.map +1 -0
- package/dist/hooks/silence.js +22 -0
- package/dist/hooks/silence.js.map +1 -0
- package/dist/hooks/stdin.d.ts +11 -0
- package/dist/hooks/stdin.d.ts.map +1 -0
- package/dist/hooks/stdin.js +51 -0
- package/dist/hooks/stdin.js.map +1 -0
- package/dist/hooks/turn-state.d.ts +40 -0
- package/dist/hooks/turn-state.d.ts.map +1 -0
- package/dist/hooks/turn-state.js +97 -0
- package/dist/hooks/turn-state.js.map +1 -0
- package/dist/hooks/types.d.ts +76 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +3 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/pending-store.d.ts +22 -2
- package/dist/pending-store.d.ts.map +1 -1
- package/dist/pending-store.js +25 -3
- package/dist/pending-store.js.map +1 -1
- package/dist/pending-upload.d.ts +12 -0
- package/dist/pending-upload.d.ts.map +1 -0
- package/dist/pending-upload.js +51 -0
- package/dist/pending-upload.js.map +1 -0
- package/dist/proxy/interceptor.d.ts.map +1 -1
- package/dist/proxy/interceptor.js +1 -0
- package/dist/proxy/interceptor.js.map +1 -1
- package/dist/sessions/blocks.d.ts +51 -0
- package/dist/sessions/blocks.d.ts.map +1 -0
- package/dist/sessions/blocks.js +193 -0
- package/dist/sessions/blocks.js.map +1 -0
- package/dist/sessions/claude-scanner.d.ts +60 -1
- package/dist/sessions/claude-scanner.d.ts.map +1 -1
- package/dist/sessions/claude-scanner.js +277 -1
- package/dist/sessions/claude-scanner.js.map +1 -1
- package/dist/sessions/copilot-scanner.d.ts +27 -0
- package/dist/sessions/copilot-scanner.d.ts.map +1 -0
- package/dist/sessions/copilot-scanner.js +171 -0
- package/dist/sessions/copilot-scanner.js.map +1 -0
- package/dist/sessions/redact-secrets.d.ts.map +1 -1
- package/dist/sessions/redact-secrets.js +43 -10
- package/dist/sessions/redact-secrets.js.map +1 -1
- package/dist/sessions/turn-envelope.d.ts +62 -0
- package/dist/sessions/turn-envelope.d.ts.map +1 -0
- package/dist/sessions/turn-envelope.js +182 -0
- package/dist/sessions/turn-envelope.js.map +1 -0
- package/dist/sessions/usage.d.ts +23 -0
- package/dist/sessions/usage.d.ts.map +1 -0
- package/dist/sessions/usage.js +56 -0
- package/dist/sessions/usage.js.map +1 -0
- package/dist/types.d.ts +21 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +2 -2
- package/dist/version.js +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { HookInput } from '../hooks/types.js';
|
|
2
|
+
import type { CaptureTurnOptions } from '../types.js';
|
|
3
|
+
export interface CaptureTurnDeps {
|
|
4
|
+
/** Replaces reading the hook payload from stdin. Tests only. */
|
|
5
|
+
readInput?: () => Promise<HookInput | null>;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Hook entrypoint: send the turn an agent just finished to Coolhand. Reads the agent's hook JSON
|
|
9
|
+
* from stdin, authenticates with a public API key given by `--api-key` or `COOLHAND_API_KEY` (no
|
|
10
|
+
* stored login, no `--client-id`, never prompts), and sends the turn with the conversation so far
|
|
11
|
+
* (prompts, thinking, tool calls and results, replies), redacted and capped. Per-session progress is kept so each turn is sent once.
|
|
12
|
+
*
|
|
13
|
+
* A hook must not disturb the agent that runs it, so this ALWAYS exits 0 and writes nothing to
|
|
14
|
+
* stdout or stderr. Failures go to `~/.coolhand/capture-turns/hook.log`; turns that couldn't be sent
|
|
15
|
+
* are spooled and retried.
|
|
16
|
+
*/
|
|
17
|
+
export declare function run(opts: CaptureTurnOptions, deps?: CaptureTurnDeps): Promise<number>;
|
|
18
|
+
//# sourceMappingURL=capture-turn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-turn.d.ts","sourceRoot":"","sources":["../../src/commands/capture-turn.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,mBAAmB,CAAC;AAG7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAiCtD,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;CAC7C;AAED;;;;;;;;;GASG;AACH,wBAAsB,GAAG,CAAC,IAAI,EAAE,kBAAkB,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAO/F"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { ExitCode } from '../errors.js';
|
|
2
|
+
import { PACKAGE_IDENTIFIER } from '../version.js';
|
|
3
|
+
import { ADAPTERS } from '../hooks/adapters/index.js';
|
|
4
|
+
import { isSkillPattern, skillMatches } from '../hooks/adapters/shared.js';
|
|
5
|
+
import { isCaptureDisabled } from '../hooks/disabled.js';
|
|
6
|
+
import { logHookEvent } from '../hooks/hook-log.js';
|
|
7
|
+
import { resolveTesterIdentity } from '../hooks/identity.js';
|
|
8
|
+
import { readHookInput } from '../hooks/stdin.js';
|
|
9
|
+
import { withSilencedConsole } from '../hooks/silence.js';
|
|
10
|
+
import { replaySpooledTurns, sendTurn } from '../hooks/send-turn.js';
|
|
11
|
+
import { digestTurn, loadTurnState, saveTurnState, withCaptured } from '../hooks/turn-state.js';
|
|
12
|
+
import { cleanText } from '../sessions/blocks.js';
|
|
13
|
+
import { buildTurnEnvelope, prepareTurnMessages } from '../sessions/turn-envelope.js';
|
|
14
|
+
/** Cap on the skill text kept in a session's state and sent as `system`. It is redacted before it is kept. */
|
|
15
|
+
const MAX_SKILL_TEXT_CHARS = 100000;
|
|
16
|
+
/**
|
|
17
|
+
* The text of the skill that is being captured: the body Claude Code injected when it was invoked,
|
|
18
|
+
* found in the transcript at or after the session's anchor. The injected line names the skill by its
|
|
19
|
+
* directory, so the one whose directory is called `skill` is the one. Never guessed without `--skill`.
|
|
20
|
+
*/
|
|
21
|
+
function findSkillText(turn, skill, anchor) {
|
|
22
|
+
const anchorMs = anchor ? Date.parse(anchor) : Number.NaN;
|
|
23
|
+
if (!skill || Number.isNaN(anchorMs)) {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
for (const body of turn.skillBodies ?? []) {
|
|
27
|
+
if (skillMatches(skill, body) && body.timestamp && Date.parse(body.timestamp) >= anchorMs) {
|
|
28
|
+
return cleanText(body.text, MAX_SKILL_TEXT_CHARS);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
/** The workload this skill's logs belong to: one per skill, declared by key (the server find-or-creates it). */
|
|
34
|
+
function declaredWorkload(opts, skillName) {
|
|
35
|
+
if (!skillName || opts.declare === false) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
const skill = skillName.slice(0, 200);
|
|
39
|
+
return { reporter: 'coolhand-cli', workload: { key: `${opts.agent}-skill:${skill}`, name: skill } };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Hook entrypoint: send the turn an agent just finished to Coolhand. Reads the agent's hook JSON
|
|
43
|
+
* from stdin, authenticates with a public API key given by `--api-key` or `COOLHAND_API_KEY` (no
|
|
44
|
+
* stored login, no `--client-id`, never prompts), and sends the turn with the conversation so far
|
|
45
|
+
* (prompts, thinking, tool calls and results, replies), redacted and capped. Per-session progress is kept so each turn is sent once.
|
|
46
|
+
*
|
|
47
|
+
* A hook must not disturb the agent that runs it, so this ALWAYS exits 0 and writes nothing to
|
|
48
|
+
* stdout or stderr. Failures go to `~/.coolhand/capture-turns/hook.log`; turns that couldn't be sent
|
|
49
|
+
* are spooled and retried.
|
|
50
|
+
*/
|
|
51
|
+
export async function run(opts, deps = {}) {
|
|
52
|
+
try {
|
|
53
|
+
await withSilencedConsole(() => capture(opts, deps));
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
await logHookEvent(`capture-turn (${opts.agent}) failed: ${err.message}`);
|
|
57
|
+
}
|
|
58
|
+
return ExitCode.OK;
|
|
59
|
+
}
|
|
60
|
+
async function capture(opts, deps) {
|
|
61
|
+
// Kill switch for people who didn't choose to have a skill's hook running: nothing is read or sent.
|
|
62
|
+
if (isCaptureDisabled()) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const apiKey = opts.apiKey || process.env.COOLHAND_API_KEY;
|
|
66
|
+
if (!apiKey) {
|
|
67
|
+
await logHookEvent(`capture-turn (${opts.agent}): no API key (pass --api-key or set COOLHAND_API_KEY); nothing sent.`);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const input = await (deps.readInput ?? (() => readHookInput()))();
|
|
71
|
+
if (!input) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (opts.agent === 'copilot' && !opts.skill) {
|
|
75
|
+
await logHookEvent('capture-turn (copilot): --skill is required (a Copilot hook runs for every chat and sends only the skill\'s); nothing sent.');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (opts.skill && isSkillPattern(opts.skill) && opts.agent !== 'copilot') {
|
|
79
|
+
await logHookEvent(`capture-turn (${opts.agent}): --skill patterns (${opts.skill}) are only supported for --agent copilot; nothing sent.`);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const parsed = await ADAPTERS[opts.agent](input, { skill: opts.skill });
|
|
83
|
+
if (!parsed) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// --anonymous keeps the working directory (usually /Users/<name>/…) off the wire too.
|
|
87
|
+
const turn = opts.anonymous ? { ...parsed, cwd: undefined } : parsed;
|
|
88
|
+
const state = await loadTurnState(opts.agent, turn.sessionId);
|
|
89
|
+
const digest = digestTurn(turn.userText, turn.assistantText, turn.turnKey);
|
|
90
|
+
if (state.lastDigest === digest) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const turnIndex = state.turnIndex + 1;
|
|
94
|
+
// A pattern is resolved by the adapter to the first matching skill invoked in the session (the transcript is cumulative,
|
|
95
|
+
// so every turn resolves it the same way); it is never recorded as the skill's name.
|
|
96
|
+
const skill = opts.skill && isSkillPattern(opts.skill) ? turn.skill : opts.skill;
|
|
97
|
+
if (opts.skill && isSkillPattern(opts.skill) && !skill) {
|
|
98
|
+
await logHookEvent(`capture-turn (${opts.agent}): --skill ${opts.skill} matched no skill in ${turn.sessionId}; nothing sent.`);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// Resolved on the session's first turn and reused; --anonymous never reads or stores a cached identity.
|
|
102
|
+
const tester = (!opts.anonymous && state.tester) || (await resolveTesterIdentity({ anonymous: opts.anonymous, cwd: parsed.cwd }));
|
|
103
|
+
// The anchor is the first captured turn of the session. A session whose state carries none (but is
|
|
104
|
+
// past turn 1) gets no history this turn, flagged, and starts one from here.
|
|
105
|
+
const anchor = turnIndex > 1 ? state.anchor : turn.exchangeTimestamp;
|
|
106
|
+
const seededLate = turnIndex > 1 && !state.anchor;
|
|
107
|
+
const history = prepareTurnMessages(turn, turnIndex, anchor, new Set(state.captured ?? []));
|
|
108
|
+
const skillText = state.skillText ?? findSkillText(turn, skill, anchor ?? state.anchor);
|
|
109
|
+
const envelope = buildTurnEnvelope(opts.agent, turn, turnIndex, digest, history, skillText);
|
|
110
|
+
const outcome = await sendTurn(envelope, {
|
|
111
|
+
apiKey,
|
|
112
|
+
baseUrl: opts.baseUrl,
|
|
113
|
+
collector: `${PACKAGE_IDENTIFIER}/hook-${opts.agent}`,
|
|
114
|
+
session: turn.sessionId,
|
|
115
|
+
turn: turnIndex,
|
|
116
|
+
declared: declaredWorkload(opts, skill),
|
|
117
|
+
metadata: {
|
|
118
|
+
session_id: turn.sessionId,
|
|
119
|
+
turn_index: turnIndex,
|
|
120
|
+
// The server does not dedup, so consumers can: this is the same id the log's response_body carries.
|
|
121
|
+
turn_id: envelope.response_body.id,
|
|
122
|
+
// The messages are the conversation so far; say when the oldest part of it had to be left out.
|
|
123
|
+
...(history.truncated || seededLate || state.anchorLate ? { history_truncated: true } : {}),
|
|
124
|
+
...(history.omitted > 0 ? { history_omitted: history.omitted } : {}),
|
|
125
|
+
// What subagents spent, per model: kept apart because a log has one model and they run on others.
|
|
126
|
+
...(history.subagents ? { subagent_usage: history.subagents } : {}),
|
|
127
|
+
agent: opts.agent,
|
|
128
|
+
tester: tester.id,
|
|
129
|
+
tester_source: tester.source,
|
|
130
|
+
...(skill ? { skill: skill.slice(0, 200) } : {}),
|
|
131
|
+
...(opts.skillVersion ? { skill_version: opts.skillVersion } : {}),
|
|
132
|
+
...(turn.cwd ? { project_path: turn.cwd } : {}),
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
if (outcome === 'failed') {
|
|
136
|
+
await logHookEvent(`capture-turn (${opts.agent}): turn ${turnIndex} of ${turn.sessionId} could not be sent or spooled and is lost.`);
|
|
137
|
+
}
|
|
138
|
+
if (outcome === 'spooled') {
|
|
139
|
+
await logHookEvent(`capture-turn (${opts.agent}): turn ${turnIndex} of ${turn.sessionId} could not be sent; spooled for retry.`);
|
|
140
|
+
}
|
|
141
|
+
const anchorToSave = state.anchor ?? turn.exchangeTimestamp;
|
|
142
|
+
try {
|
|
143
|
+
await saveTurnState(opts.agent, turn.sessionId, {
|
|
144
|
+
turnIndex,
|
|
145
|
+
lastDigest: digest,
|
|
146
|
+
...(anchorToSave ? { anchor: anchorToSave } : {}),
|
|
147
|
+
captured: withCaptured(state.captured, turn.exchangeTimestamp),
|
|
148
|
+
...(skillText ? { skillText } : {}),
|
|
149
|
+
...(seededLate || state.anchorLate ? { anchorLate: true } : {}),
|
|
150
|
+
...(opts.anonymous ? {} : { tester }),
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
// The turn is already sent; say what is now off rather than losing the replay too.
|
|
155
|
+
await logHookEvent(`capture-turn (${opts.agent}): could not save session state (${err.message}); turn numbering and double-fire protection are off for this session.`);
|
|
156
|
+
}
|
|
157
|
+
// Replay only after this turn's progress is on disk: if the agent kills the hook mid-replay, the
|
|
158
|
+
// next turn must not reuse this turn's number.
|
|
159
|
+
if (outcome === 'sent') {
|
|
160
|
+
await replaySpooledTurns();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=capture-turn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-turn.js","sourceRoot":"","sources":["../../src/commands/capture-turn.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,7 +35,7 @@ export async function run(opts) {
|
|
|
35
35
|
const destination = await resolveDestination(opts, downloaded);
|
|
36
36
|
try {
|
|
37
37
|
// 'wx' fails atomically if the path exists, so a concurrent file is never clobbered without --force.
|
|
38
|
-
await fs.writeFile(destination, downloaded.content, { flag: opts.force ? 'w' : 'wx' });
|
|
38
|
+
await fs.writeFile(destination, downloaded.content, { flag: opts.force ? 'w' : 'wx', mode: 0o600 });
|
|
39
39
|
}
|
|
40
40
|
catch (err) {
|
|
41
41
|
if (err.code === 'EEXIST') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download-client-file.js","sourceRoot":"","sources":["../../src/commands/download-client-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAG3F;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAkB,EAAE,QAAgB;IAC/D,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IACpD,4CAA4C;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,OAAO,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;AACpF,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAA+B,EAAE,UAAgC;IACjG,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC,eAAe,IAAI,CAAC,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IAC1G,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAA+B;IACvD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAExE,IAAI,UAAgC,CAAC;QACrC,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,IAAI,CAAC,EAAE,kDAAkD,CAAC,CAAC;QAC/G,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC/D,IAAI,CAAC;YACH,qGAAqG;YACrG,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"download-client-file.js","sourceRoot":"","sources":["../../src/commands/download-client-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flush-pending.d.ts","sourceRoot":"","sources":["../../src/commands/flush-pending.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"flush-pending.d.ts","sourceRoot":"","sources":["../../src/commands/flush-pending.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAYtC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,SAAS;IACjB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,CA4BzD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,SAAc,GAAG,IAAI,CAkB/D;AAED,+EAA+E;AAC/E,wBAAsB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAG3C"}
|
|
@@ -1,37 +1,8 @@
|
|
|
1
1
|
import { spawn } from 'child_process';
|
|
2
|
-
import { Coolhand } from 'coolhand-node';
|
|
3
2
|
import { ExitCode } from '../errors.js';
|
|
4
3
|
import { logger, redact } from '../logger.js';
|
|
5
|
-
import {
|
|
6
|
-
import { DEFAULT_BASE_URL } from '../types.js';
|
|
4
|
+
import { uploadRecord } from '../pending-upload.js';
|
|
7
5
|
import { listPendingFiles, readPendingRecord, removePendingRecord, markFlushFailed, clearFlushFailed, } from '../pending-store.js';
|
|
8
|
-
/**
|
|
9
|
-
* Send a single saved record to Coolhand. Resolves the api key/base url from the
|
|
10
|
-
* stored client (or env) at flush time — by now the user is logged in. Returns true
|
|
11
|
-
* only when the server confirms the write; the SDK returns null (it does not throw)
|
|
12
|
-
* on a failed write, so a falsy result means "keep the file and retry later".
|
|
13
|
-
*/
|
|
14
|
-
async function uploadRecord(record) {
|
|
15
|
-
const cfg = await loadConfig();
|
|
16
|
-
const client = getClient(cfg, record.clientId);
|
|
17
|
-
const apiKey = client?.api_key ?? process.env.COOLHAND_API_KEY;
|
|
18
|
-
if (!apiKey) {
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
const baseUrl = client?.base_url ?? DEFAULT_BASE_URL;
|
|
22
|
-
let coolhand;
|
|
23
|
-
try {
|
|
24
|
-
coolhand = new Coolhand({ apiKey, baseUrl, silent: true });
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
if (record.kind === 'feedback') {
|
|
30
|
-
const result = await coolhand.createFeedback(record.payload);
|
|
31
|
-
return result !== null && result !== undefined;
|
|
32
|
-
}
|
|
33
|
-
return false;
|
|
34
|
-
}
|
|
35
6
|
/**
|
|
36
7
|
* Upload every pending record. Deletes each on a confirmed success; on any failure the
|
|
37
8
|
* file is kept and the "flush failed" marker is set so the next command can remind the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flush-pending.js","sourceRoot":"","sources":["../../src/commands/flush-pending.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"flush-pending.js","sourceRoot":"","sources":["../../src/commands/flush-pending.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAW7B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACvC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAChC,QAAQ,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,mBAAmB,IAAI,KAAK,MAAM,CAAE,GAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,eAAe,EAAE,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAkB,EAAE;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAAE;YACpE,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACrB,wEAAwE;QAC1E,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;IACxC,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;AAC1D,CAAC"}
|
package/dist/commands/logout.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ExitCode } from '../errors.js';
|
|
2
2
|
import { logger } from '../logger.js';
|
|
3
|
-
import { deleteConfig, loadConfig, removeClient } from '../config.js';
|
|
3
|
+
import { deleteConfig, findClient, loadConfig, removeClient } from '../config.js';
|
|
4
4
|
export async function run(opts) {
|
|
5
5
|
if (opts.all) {
|
|
6
6
|
await deleteConfig();
|
|
@@ -23,7 +23,7 @@ export async function run(opts) {
|
|
|
23
23
|
}
|
|
24
24
|
return ExitCode.OK;
|
|
25
25
|
}
|
|
26
|
-
const existed = Boolean(cfg
|
|
26
|
+
const existed = Boolean(findClient(cfg, targetId));
|
|
27
27
|
await removeClient(targetId);
|
|
28
28
|
if (opts.json) {
|
|
29
29
|
logger.json({ ok: true, removed: existed ? targetId : null });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGlF,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAmB;IAC3C,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,YAAY,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,UAAU,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,iBAAiB,CAAC;IAExD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnD,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,mBAAmB,QAAQ,IAAI,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,cAAc,QAAQ,mBAAmB,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,QAAQ,CAAC,EAAE,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { installVersion } from '../auto-update/index.js';
|
|
2
|
+
import type { UpdateOptions } from '../types.js';
|
|
3
|
+
export interface UpdateDeps {
|
|
4
|
+
selfInstall?: boolean;
|
|
5
|
+
install?: typeof installVersion;
|
|
6
|
+
versionOnDisk?: () => string | undefined;
|
|
7
|
+
}
|
|
8
|
+
export declare function run(opts: UpdateOptions, deps?: UpdateDeps): Promise<number>;
|
|
9
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,cAAc,EAGf,MAAM,yBAAyB,CAAC;AAKjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,cAAc,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED,wBAAsB,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CA2DrF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { canSelfInstall, findEligibleUpdate, installedVersionOnDisk, installVersion, manualInstallHint, updateHint, } from '../auto-update/index.js';
|
|
2
|
+
import { acquireLock } from '../auto-update/state.js';
|
|
3
|
+
import { CliError, ExitCode } from '../errors.js';
|
|
4
|
+
import { logger } from '../logger.js';
|
|
5
|
+
import { PACKAGE_NAME, PACKAGE_VERSION } from '../version.js';
|
|
6
|
+
export async function run(opts, deps = {}) {
|
|
7
|
+
let target;
|
|
8
|
+
try {
|
|
9
|
+
target = await findEligibleUpdate();
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
throw new CliError('UPDATE_ERROR', `Could not check the npm registry: ${err.message}`);
|
|
13
|
+
}
|
|
14
|
+
if (!target) {
|
|
15
|
+
if (opts.json) {
|
|
16
|
+
logger.json({ current: PACKAGE_VERSION, target: null, installed: false });
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
logger.info(`${PACKAGE_NAME} ${PACKAGE_VERSION} has no newer eligible release ` +
|
|
20
|
+
'(only stable, non-deprecated releases at least 48 hours old and not above the `latest` tag are installed).');
|
|
21
|
+
}
|
|
22
|
+
return ExitCode.OK;
|
|
23
|
+
}
|
|
24
|
+
const install = !opts.check && (deps.selfInstall ?? canSelfInstall());
|
|
25
|
+
if (!install) {
|
|
26
|
+
if (opts.json) {
|
|
27
|
+
logger.json({ current: PACKAGE_VERSION, target, installed: false });
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
logger.info(`${PACKAGE_NAME} ${target} is available (you have ${PACKAGE_VERSION}). ${updateHint(target)}`);
|
|
31
|
+
}
|
|
32
|
+
return ExitCode.OK;
|
|
33
|
+
}
|
|
34
|
+
// The background job takes this lock too: two `npm install -g` runs into one prefix can leave a half-written package.
|
|
35
|
+
const release = await acquireLock();
|
|
36
|
+
if (!release) {
|
|
37
|
+
throw new CliError('UPDATE_ERROR', 'Another update appears to be running. Try again in a minute.');
|
|
38
|
+
}
|
|
39
|
+
logger.info(`Updating ${PACKAGE_NAME} ${PACKAGE_VERSION} → ${target}…`);
|
|
40
|
+
// Keep npm's stdout out of --json output so it stays parseable; npm's errors still reach stderr.
|
|
41
|
+
let ok;
|
|
42
|
+
try {
|
|
43
|
+
ok = await (deps.install ?? installVersion)(target, opts.json ? ['ignore', 'ignore', 'inherit'] : 'inherit');
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
await release();
|
|
47
|
+
}
|
|
48
|
+
if (!ok) {
|
|
49
|
+
throw new CliError('UPDATE_ERROR', `\`${manualInstallHint(target)}\` failed. You may need to run it with different permissions.`);
|
|
50
|
+
}
|
|
51
|
+
// npm on PATH may have installed into a different global prefix than this copy lives in.
|
|
52
|
+
if ((deps.versionOnDisk ?? installedVersionOnDisk)() !== target) {
|
|
53
|
+
throw new CliError('UPDATE_ERROR', `npm reported success, but this copy of ${PACKAGE_NAME} is still ${PACKAGE_VERSION}; npm may be installing to a different global prefix. Check \`npm prefix -g\`.`);
|
|
54
|
+
}
|
|
55
|
+
if (opts.json) {
|
|
56
|
+
logger.json({ current: PACKAGE_VERSION, target, installed: true });
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
logger.info(`Updated to ${target}.`);
|
|
60
|
+
}
|
|
61
|
+
return ExitCode.OK;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export declare function loadConfig(): Promise<ConfigFile>;
|
|
|
11
11
|
export declare function atomicWriteFile(filePath: string, data: string, mode?: number): Promise<void>;
|
|
12
12
|
export declare function saveConfig(cfg: ConfigFile): Promise<void>;
|
|
13
13
|
export declare function deleteConfig(): Promise<void>;
|
|
14
|
+
/** A stored client by id, own properties only: `constructor` or `toString` must not resolve to an inherited member. */
|
|
15
|
+
export declare function findClient(cfg: ConfigFile, id: string): ClientEntry | undefined;
|
|
14
16
|
export declare function getClient(cfg: ConfigFile, clientId?: string): ClientEntry | undefined;
|
|
15
17
|
export declare function upsertClient(entry: ClientEntry, makeDefault?: boolean): Promise<ConfigFile>;
|
|
16
18
|
export declare function removeClient(clientId: string): Promise<ConfigFile | null>;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM1D,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAMD,wBAAsB,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM1D,wBAAgB,SAAS,IAAI,MAAM,CAMlC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAMD,wBAAsB,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CA0BtD;AAWD;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/D;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBlD;AAED,uHAAuH;AACvH,wBAAgB,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAE/E;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAMrF;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,UAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAY9F;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAgB/E;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQtE;AA2CD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAyE5F;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAajH"}
|
package/dist/config.js
CHANGED
|
@@ -40,6 +40,7 @@ export async function loadConfig() {
|
|
|
40
40
|
version: 1,
|
|
41
41
|
default_client_id: parsed.default_client_id ?? null,
|
|
42
42
|
clients: parsed.clients ?? {},
|
|
43
|
+
...(typeof parsed.auto_update === 'boolean' ? { auto_update: parsed.auto_update } : {}),
|
|
43
44
|
};
|
|
44
45
|
}
|
|
45
46
|
catch (err) {
|
|
@@ -85,26 +86,43 @@ export async function saveConfig(cfg) {
|
|
|
85
86
|
await atomicWriteFile(filePath, `${JSON.stringify(cfg, null, 2)}\n`, FILE_MODE);
|
|
86
87
|
}
|
|
87
88
|
export async function deleteConfig() {
|
|
89
|
+
// `auto_update` is a machine preference, not a credential: keep it so logging out doesn't re-enable
|
|
90
|
+
// a background updater the user opted out of. A corrupt file can't carry one, so it's just removed.
|
|
91
|
+
let keep;
|
|
88
92
|
try {
|
|
93
|
+
keep = (await loadConfig()).auto_update;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
keep = undefined;
|
|
97
|
+
}
|
|
98
|
+
try {
|
|
99
|
+
if (keep !== undefined) {
|
|
100
|
+
await saveConfig({ ...emptyConfig(), auto_update: keep });
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
89
103
|
await fs.rm(configPath(), { force: true });
|
|
90
104
|
}
|
|
91
105
|
catch (err) {
|
|
92
106
|
throw new CliError('CONFIG_WRITE_FAILED', `Failed to delete config: ${err.message}`);
|
|
93
107
|
}
|
|
94
108
|
}
|
|
109
|
+
/** A stored client by id, own properties only: `constructor` or `toString` must not resolve to an inherited member. */
|
|
110
|
+
export function findClient(cfg, id) {
|
|
111
|
+
return Object.prototype.hasOwnProperty.call(cfg.clients, id) ? cfg.clients[id] : undefined;
|
|
112
|
+
}
|
|
95
113
|
export function getClient(cfg, clientId) {
|
|
96
114
|
const id = clientId ?? cfg.default_client_id;
|
|
97
115
|
if (!id) {
|
|
98
116
|
return undefined;
|
|
99
117
|
}
|
|
100
|
-
return cfg
|
|
118
|
+
return findClient(cfg, id);
|
|
101
119
|
}
|
|
102
120
|
export async function upsertClient(entry, makeDefault = true) {
|
|
103
121
|
const cfg = await loadConfig();
|
|
104
122
|
// Merge onto any existing entry for this client_id so a partial entry (e.g. a
|
|
105
123
|
// public-only re-login) doesn't silently drop fields it didn't provide, such as a
|
|
106
124
|
// previously-stored private_key.
|
|
107
|
-
const existing = cfg
|
|
125
|
+
const existing = findClient(cfg, entry.client_id);
|
|
108
126
|
cfg.clients[entry.client_id] = existing ? { ...existing, ...entry } : entry;
|
|
109
127
|
if (makeDefault || !cfg.default_client_id) {
|
|
110
128
|
cfg.default_client_id = entry.client_id;
|
|
@@ -114,7 +132,7 @@ export async function upsertClient(entry, makeDefault = true) {
|
|
|
114
132
|
}
|
|
115
133
|
export async function removeClient(clientId) {
|
|
116
134
|
const cfg = await loadConfig();
|
|
117
|
-
if (!cfg
|
|
135
|
+
if (!findClient(cfg, clientId)) {
|
|
118
136
|
return cfg;
|
|
119
137
|
}
|
|
120
138
|
delete cfg.clients[clientId];
|
|
@@ -131,7 +149,7 @@ export async function removeClient(clientId) {
|
|
|
131
149
|
}
|
|
132
150
|
export async function setDefault(clientId) {
|
|
133
151
|
const cfg = await loadConfig();
|
|
134
|
-
if (!cfg
|
|
152
|
+
if (!findClient(cfg, clientId)) {
|
|
135
153
|
throw new CliError('CLIENT_NOT_FOUND', `No client with id "${clientId}" is configured.`);
|
|
136
154
|
}
|
|
137
155
|
cfg.default_client_id = clientId;
|
|
@@ -196,7 +214,7 @@ export async function resolveClient(cfg, clientId) {
|
|
|
196
214
|
}
|
|
197
215
|
// 1. Explicit --client-id
|
|
198
216
|
if (clientId !== undefined) {
|
|
199
|
-
const entry = cfg
|
|
217
|
+
const entry = findClient(cfg, clientId);
|
|
200
218
|
if (!entry) {
|
|
201
219
|
throw new CliError('CLIENT_NOT_FOUND', `No client "${clientId}" is configured.`);
|
|
202
220
|
}
|
|
@@ -210,7 +228,7 @@ export async function resolveClient(cfg, clientId) {
|
|
|
210
228
|
// is most likely an accidental mis-set in a script, not a deliberate selection.
|
|
211
229
|
const envClientId = process.env.COOLHAND_CLIENT_ID;
|
|
212
230
|
if (envClientId) {
|
|
213
|
-
const entry = cfg
|
|
231
|
+
const entry = findClient(cfg, envClientId);
|
|
214
232
|
if (!entry) {
|
|
215
233
|
throw new CliError('CLIENT_NOT_FOUND', `COOLHAND_CLIENT_ID="${envClientId}" does not match any configured client.`);
|
|
216
234
|
}
|
|
@@ -219,7 +237,7 @@ export async function resolveClient(cfg, clientId) {
|
|
|
219
237
|
}
|
|
220
238
|
// 3. Configured default
|
|
221
239
|
if (cfg.default_client_id) {
|
|
222
|
-
const entry = cfg
|
|
240
|
+
const entry = findClient(cfg, cfg.default_client_id);
|
|
223
241
|
if (entry) {
|
|
224
242
|
process.stderr.write(`Client: ${stripAnsiEscapes(entry.client_name)} (${entry.client_id})\n`);
|
|
225
243
|
return entry;
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGvD,MAAM,eAAe,GAAG,aAAa,CAAC;AACtC,MAAM,QAAQ,GAAG,KAAK,CAAC;AACvB,MAAM,SAAS,GAAG,KAAK,CAAC;AAExB,MAAM,UAAU,SAAS;IACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACjD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,eAAe,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;IAC9B,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAA4B,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,OAAO,WAAW,EAAE,CAAC;QACvB,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,kBAAkB,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwB,CAAC;QACtD,OAAO;YACL,OAAO,EAAE,CAAC;YACV,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,IAAI;YACnD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export declare enum ExitCode {
|
|
|
4
4
|
INTERNAL = 2,
|
|
5
5
|
ABORTED = 130
|
|
6
6
|
}
|
|
7
|
-
export type ErrorCode = 'TIMEOUT' | 'STATE_MISMATCH' | 'INVALID_CALLBACK' | 'BROWSER_FAILED' | 'CONFIG_WRITE_FAILED' | 'CONFIG_READ_FAILED' | 'NOT_CONFIGURED' | 'INVALID_REDIRECT_URI' | 'INVALID_BASE_URL' | 'INVALID_ARGS' | 'WRITE_ENV_FAILED' | 'CLIENT_NOT_FOUND' | 'NO_PRIVATE_KEY' | 'MCP_ERROR' | 'INGEST_ERROR' | 'FEEDBACK_ERROR' | 'LOG_ERROR' | 'TEMPLATE_ERROR' | 'WORKLOAD_ERROR' | 'LLM_REFERENCE_ERROR' | 'HELP_CENTER_ERROR' | 'CERT_FILE_INSECURE' | 'UPLOAD_ERROR' | 'CLIENT_FILE_ERROR' | 'OUTPUT_EXISTS';
|
|
7
|
+
export type ErrorCode = 'TIMEOUT' | 'STATE_MISMATCH' | 'INVALID_CALLBACK' | 'BROWSER_FAILED' | 'CONFIG_WRITE_FAILED' | 'CONFIG_READ_FAILED' | 'NOT_CONFIGURED' | 'INVALID_REDIRECT_URI' | 'INVALID_BASE_URL' | 'INVALID_ARGS' | 'WRITE_ENV_FAILED' | 'CLIENT_NOT_FOUND' | 'NO_PRIVATE_KEY' | 'MCP_ERROR' | 'INGEST_ERROR' | 'FEEDBACK_ERROR' | 'LOG_ERROR' | 'TEMPLATE_ERROR' | 'WORKLOAD_ERROR' | 'LLM_REFERENCE_ERROR' | 'HELP_CENTER_ERROR' | 'CERT_FILE_INSECURE' | 'UPLOAD_ERROR' | 'CLIENT_FILE_ERROR' | 'OUTPUT_EXISTS' | 'UPDATE_ERROR';
|
|
8
8
|
export declare class CliError extends Error {
|
|
9
9
|
readonly code: ErrorCode;
|
|
10
10
|
readonly exitCode: number;
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,EAAE,IAAI;IACN,UAAU,IAAI;IACd,QAAQ,IAAI;IACZ,OAAO,MAAM;CACd;AAED,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,gBAAgB,GAChB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,oBAAoB,GACpB,gBAAgB,GAChB,sBAAsB,GACtB,kBAAkB,GAClB,cAAc,GACd,kBAAkB,GAClB,kBAAkB,GAClB,gBAAgB,GAChB,WAAW,GACX,cAAc,GACd,gBAAgB,GAChB,WAAW,GACX,gBAAgB,GAChB,gBAAgB,GAChB,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,GACpB,cAAc,GACd,mBAAmB,GACnB,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,EAAE,IAAI;IACN,UAAU,IAAI;IACd,QAAQ,IAAI;IACZ,OAAO,MAAM;CACd;AAED,MAAM,MAAM,SAAS,GACjB,SAAS,GACT,gBAAgB,GAChB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,oBAAoB,GACpB,gBAAgB,GAChB,sBAAsB,GACtB,kBAAkB,GAClB,cAAc,GACd,kBAAkB,GAClB,kBAAkB,GAClB,gBAAgB,GAChB,WAAW,GACX,cAAc,GACd,gBAAgB,GAChB,WAAW,GACX,gBAAgB,GAChB,gBAAgB,GAChB,qBAAqB,GACrB,mBAAmB,GACnB,oBAAoB,GACpB,cAAc,GACd,mBAAmB,GACnB,eAAe,GACf,cAAc,CAAC;AAEnB,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,IAAI,EAAE,SAAS,CAAC;IAChC,SAAgB,QAAQ,EAAE,MAAM,CAAC;gBAErB,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAA4B;CAMrF"}
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,mCAAM,CAAA;IACN,mDAAc,CAAA;IACd,+CAAY,CAAA;IACZ,+CAAa,CAAA;AACf,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,mCAAM,CAAA;IACN,mDAAc,CAAA;IACd,+CAAY,CAAA;IACZ,+CAAa,CAAA;AACf,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AA8BD,MAAM,OAAO,QAAS,SAAQ,KAAK;IAIjC,YAAY,IAAe,EAAE,OAAe,EAAE,WAAmB,QAAQ,CAAC,UAAU;QAClF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { HookInput, HookTurn } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Claude Code `Stop` hook → a turn. The assistant text comes from `last_assistant_message` (the
|
|
4
|
+
* transcript file is written asynchronously and can lag it). The user text, and the model, come
|
|
5
|
+
* from the tail of `transcript_path` — that is also what covers the turn that invoked the skill,
|
|
6
|
+
* whose prompt was submitted before the skill's hooks registered. If the transcript can't be read
|
|
7
|
+
* the turn is still captured, just without the user half.
|
|
8
|
+
*
|
|
9
|
+
* Returns `null` for any other event or when there is nothing to send.
|
|
10
|
+
*/
|
|
11
|
+
export declare function claudeTurn(input: HookInput): Promise<HookTurn | null>;
|
|
12
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/hooks/adapters/claude.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAmCxE;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAwD3E"}
|