@zhihaohong52/sonata 0.4.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/LICENSE +21 -0
- package/README.md +437 -0
- package/dist/adapters/claude.js +83 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/codex.js +382 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/index.js +21 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/opencode.js +104 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/adapters/pi.js +152 -0
- package/dist/adapters/pi.js.map +1 -0
- package/dist/adapters/reasonix.js +358 -0
- package/dist/adapters/reasonix.js.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/agent-markers.js +3 -0
- package/dist/agent-markers.js.map +1 -0
- package/dist/aipricing.js +109 -0
- package/dist/aipricing.js.map +1 -0
- package/dist/catalog.js +274 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cli.js +766 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/approve.js +23 -0
- package/dist/commands/approve.js.map +1 -0
- package/dist/commands/auth.js +41 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/catalog.js +172 -0
- package/dist/commands/catalog.js.map +1 -0
- package/dist/commands/code.js +113 -0
- package/dist/commands/code.js.map +1 -0
- package/dist/commands/dispatch.js +148 -0
- package/dist/commands/dispatch.js.map +1 -0
- package/dist/commands/doctor.js +545 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/gc.js +25 -0
- package/dist/commands/gc.js.map +1 -0
- package/dist/commands/init-log.js +83 -0
- package/dist/commands/init-log.js.map +1 -0
- package/dist/commands/init.js +157 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/log.js +24 -0
- package/dist/commands/log.js.map +1 -0
- package/dist/commands/route.js +660 -0
- package/dist/commands/route.js.map +1 -0
- package/dist/commands/run.js +199 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/runs.js +37 -0
- package/dist/commands/runs.js.map +1 -0
- package/dist/commands/serve.js +818 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/status.js +14 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.js +258 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/tail.js +229 -0
- package/dist/commands/tail.js.map +1 -0
- package/dist/commands/usage.js +85 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/verify.js +69 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/commands/wait.js +38 -0
- package/dist/commands/wait.js.map +1 -0
- package/dist/config.js +588 -0
- package/dist/config.js.map +1 -0
- package/dist/detect.js +445 -0
- package/dist/detect.js.map +1 -0
- package/dist/filelock.js +83 -0
- package/dist/filelock.js.map +1 -0
- package/dist/init/apply.js +96 -0
- package/dist/init/apply.js.map +1 -0
- package/dist/init/candidates.js +115 -0
- package/dist/init/candidates.js.map +1 -0
- package/dist/init/discover.js +216 -0
- package/dist/init/discover.js.map +1 -0
- package/dist/init/helpers.js +429 -0
- package/dist/init/helpers.js.map +1 -0
- package/dist/init/interactive-state.js +128 -0
- package/dist/init/interactive-state.js.map +1 -0
- package/dist/init/plan.js +225 -0
- package/dist/init/plan.js.map +1 -0
- package/dist/init/scripted-state.js +130 -0
- package/dist/init/scripted-state.js.map +1 -0
- package/dist/init/toml.js +83 -0
- package/dist/init/toml.js.map +1 -0
- package/dist/init/validate.js +149 -0
- package/dist/init/validate.js.map +1 -0
- package/dist/ledger.js +123 -0
- package/dist/ledger.js.map +1 -0
- package/dist/mcp/protocol.js +64 -0
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/server.js +96 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.js +210 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mode.js +64 -0
- package/dist/mode.js.map +1 -0
- package/dist/native/claude-shim.js +228 -0
- package/dist/native/claude-shim.js.map +1 -0
- package/dist/native/codex-auth.js +177 -0
- package/dist/native/codex-auth.js.map +1 -0
- package/dist/native/copilot-auth.js +105 -0
- package/dist/native/copilot-auth.js.map +1 -0
- package/dist/native/credentials.js +83 -0
- package/dist/native/credentials.js.map +1 -0
- package/dist/native/hosts.js +60 -0
- package/dist/native/hosts.js.map +1 -0
- package/dist/native/litellm.js +103 -0
- package/dist/native/litellm.js.map +1 -0
- package/dist/native/models.js +96 -0
- package/dist/native/models.js.map +1 -0
- package/dist/native/oauth-login.js +112 -0
- package/dist/native/oauth-login.js.map +1 -0
- package/dist/native/router.js +469 -0
- package/dist/native/router.js.map +1 -0
- package/dist/native/tls.js +73 -0
- package/dist/native/tls.js.map +1 -0
- package/dist/native/usage.js +119 -0
- package/dist/native/usage.js.map +1 -0
- package/dist/normalize.js +98 -0
- package/dist/normalize.js.map +1 -0
- package/dist/pricing.js +86 -0
- package/dist/pricing.js.map +1 -0
- package/dist/roles.js +49 -0
- package/dist/roles.js.map +1 -0
- package/dist/sessions.js +62 -0
- package/dist/sessions.js.map +1 -0
- package/dist/settings.js +131 -0
- package/dist/settings.js.map +1 -0
- package/dist/store.js +70 -0
- package/dist/store.js.map +1 -0
- package/dist/tmux.js +89 -0
- package/dist/tmux.js.map +1 -0
- package/dist/tui-ink/app-state.js +340 -0
- package/dist/tui-ink/app-state.js.map +1 -0
- package/dist/tui-ink/app.js +156 -0
- package/dist/tui-ink/app.js.map +1 -0
- package/dist/tui-ink/components/byok-step.js +102 -0
- package/dist/tui-ink/components/byok-step.js.map +1 -0
- package/dist/tui-ink/components/login-screen.js +80 -0
- package/dist/tui-ink/components/login-screen.js.map +1 -0
- package/dist/tui-ink/components/models-step.js +92 -0
- package/dist/tui-ink/components/models-step.js.map +1 -0
- package/dist/tui-ink/components/multi-select-state.js +56 -0
- package/dist/tui-ink/components/multi-select-state.js.map +1 -0
- package/dist/tui-ink/components/multi-select.js +69 -0
- package/dist/tui-ink/components/multi-select.js.map +1 -0
- package/dist/tui-ink/components/providers-step.js +285 -0
- package/dist/tui-ink/components/providers-step.js.map +1 -0
- package/dist/tui-ink/components/ranked-select-state.js +41 -0
- package/dist/tui-ink/components/ranked-select-state.js.map +1 -0
- package/dist/tui-ink/components/ranked-select.js +61 -0
- package/dist/tui-ink/components/ranked-select.js.map +1 -0
- package/dist/tui-ink/components/search-select.js +47 -0
- package/dist/tui-ink/components/search-select.js.map +1 -0
- package/dist/tui-ink/components/text-input-state.js +42 -0
- package/dist/tui-ink/components/text-input-state.js.map +1 -0
- package/dist/tui-ink/components/text-input.js +48 -0
- package/dist/tui-ink/components/text-input.js.map +1 -0
- package/dist/tui-ink/run.js +38 -0
- package/dist/tui-ink/run.js.map +1 -0
- package/dist/tui-ink/test-compile.js +4 -0
- package/dist/tui-ink/test-compile.js.map +1 -0
- package/dist/tui-ink/types.js +2 -0
- package/dist/tui-ink/types.js.map +1 -0
- package/dist/tui.js +330 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/watchdog.js +85 -0
- package/dist/watchdog.js.map +1 -0
- package/hooks/capture-mode.mjs +56 -0
- package/hooks/ensure-serve.mjs +140 -0
- package/hooks/hooks.json +12 -0
- package/hooks/route-session.mjs +47 -0
- package/hooks/route-subagent.mjs +54 -0
- package/package.json +64 -0
- package/roles/code.md +13 -0
- package/roles/explore.md +9 -0
- package/roles/plan.md +10 -0
- package/roles/review.md +11 -0
- package/skills/loop/SKILL.md +43 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A file log for `sonata init`.
|
|
3
|
+
*
|
|
4
|
+
* The wizard owns the terminal — Ink repaints over itself and the list prompts
|
|
5
|
+
* switch to the alternate screen buffer, which is discarded on exit. So the one
|
|
6
|
+
* place a failure could be read from is the one place it does not survive: a
|
|
7
|
+
* run that dies mid-wizard leaves a restored shell and no trace of why.
|
|
8
|
+
*
|
|
9
|
+
* Everything `init` prints is teed here, along with the choices it resolved and
|
|
10
|
+
* any error that ended the run. Written line by line rather than at the end,
|
|
11
|
+
* because the interesting case is the run that does not reach its end.
|
|
12
|
+
*
|
|
13
|
+
* No secret material is ever written: keys are recorded as the gateway they
|
|
14
|
+
* belong to, never as their value.
|
|
15
|
+
*/
|
|
16
|
+
import { appendFileSync, mkdirSync, readdirSync, rmSync } from 'node:fs';
|
|
17
|
+
import { join } from 'node:path';
|
|
18
|
+
export function initLogDir(home) {
|
|
19
|
+
return join(home, '.config', 'sonata', 'logs');
|
|
20
|
+
}
|
|
21
|
+
/** Keeps the most recent `keep` logs and deletes the rest. */
|
|
22
|
+
export function pruneInitLogs(dir, keep = 10) {
|
|
23
|
+
let entries;
|
|
24
|
+
try {
|
|
25
|
+
entries = readdirSync(dir).filter((name) => /^init-.*\.log$/.test(name));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
// The names are timestamps, so lexical order is chronological order.
|
|
31
|
+
const doomed = entries.sort().slice(0, Math.max(0, entries.length - keep));
|
|
32
|
+
for (const name of doomed) {
|
|
33
|
+
try {
|
|
34
|
+
rmSync(join(dir, name));
|
|
35
|
+
}
|
|
36
|
+
catch { /* another run got there first */ }
|
|
37
|
+
}
|
|
38
|
+
return doomed;
|
|
39
|
+
}
|
|
40
|
+
/** A log that writes nothing, for tests and for a home we cannot write to. */
|
|
41
|
+
export const nullInitLog = { path: '', line: () => { }, fail: () => { } };
|
|
42
|
+
export function openInitLog(home, startedAt = new Date()) {
|
|
43
|
+
const dir = initLogDir(home);
|
|
44
|
+
const stamp = startedAt.toISOString().replace(/[:.]/g, '-');
|
|
45
|
+
const path = join(dir, `init-${stamp}.log`);
|
|
46
|
+
try {
|
|
47
|
+
mkdirSync(dir, { recursive: true });
|
|
48
|
+
appendFileSync(path, `sonata init — ${startedAt.toISOString()}\n`);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// A read-only or unwritable home must not stop the command it is logging.
|
|
52
|
+
return nullInitLog;
|
|
53
|
+
}
|
|
54
|
+
pruneInitLogs(dir);
|
|
55
|
+
const write = (text) => {
|
|
56
|
+
try {
|
|
57
|
+
appendFileSync(path, text);
|
|
58
|
+
}
|
|
59
|
+
catch { /* logging never fails a run */ }
|
|
60
|
+
};
|
|
61
|
+
return {
|
|
62
|
+
path,
|
|
63
|
+
line(text) { write(`${text}\n`); },
|
|
64
|
+
fail(error) {
|
|
65
|
+
const detail = error instanceof Error
|
|
66
|
+
? `${error.name}: ${error.message}\n${error.stack ?? ''}`
|
|
67
|
+
: String(error);
|
|
68
|
+
write(`\n!! the run ended with an error\n${detail}\n`);
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The shared log directory. `initLogDir` is the same path under its original
|
|
74
|
+
* name, kept because `cli.ts` and the init tests already use it.
|
|
75
|
+
*/
|
|
76
|
+
export function logsDir(home) {
|
|
77
|
+
return initLogDir(home);
|
|
78
|
+
}
|
|
79
|
+
/** A timestamped log path for one run of a long-lived command. */
|
|
80
|
+
export function timestampedLogPath(home, prefix, at = new Date()) {
|
|
81
|
+
return join(logsDir(home), `${prefix}-${at.toISOString().replace(/[:.]/g, '-')}.log`);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=init-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-log.js","sourceRoot":"","sources":["../../src/commands/init-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `sonata init` — first-run onboarding and repair.
|
|
3
|
+
*
|
|
4
|
+
* Interactive by default; every choice also has a flag so the command works in
|
|
5
|
+
* CI and scripts. Nothing is written until the user confirms the summary.
|
|
6
|
+
*
|
|
7
|
+
* The wizard writes the unified `[models]` registry plus `[tiers.<role>]`
|
|
8
|
+
* ranked lists — discovered native candidates keep `gateway`/`id`, and
|
|
9
|
+
* harness-discovered ones keep `harness`/`harness_id` (both, for a model
|
|
10
|
+
* reachable either way). A config still written in the older
|
|
11
|
+
* `[generate.roles]`/`[generate.native]` shape is migrated on load
|
|
12
|
+
* (`migrateLegacyConfig`, `src/normalize.ts`) rather than left behind or
|
|
13
|
+
* silently dropped.
|
|
14
|
+
*
|
|
15
|
+
* Pure helpers used by the `src/init/*` pipeline live in
|
|
16
|
+
* `../init/helpers.js`; this file keeps the `cmdInit` orchestration and
|
|
17
|
+
* re-exports them for `cli.ts` and the test files that import them from
|
|
18
|
+
* `./commands/init.js`.
|
|
19
|
+
*/
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
import { confirm, isInteractive, banner, CancelledError } from '../tui.js';
|
|
22
|
+
import { openInitLog } from './init-log.js';
|
|
23
|
+
import { discover } from '../init/discover.js';
|
|
24
|
+
import { interactiveState } from '../init/interactive-state.js';
|
|
25
|
+
import { scriptedState } from '../init/scripted-state.js';
|
|
26
|
+
import { plan, fsCredentialProbe } from '../init/plan.js';
|
|
27
|
+
import { apply } from '../init/apply.js';
|
|
28
|
+
import { validate } from '../init/validate.js';
|
|
29
|
+
export { nativeTomlFor } from '../init/toml.js';
|
|
30
|
+
import { configPathFor, } from '../init/helpers.js';
|
|
31
|
+
export { OPENCODE_RANGE, defaultDetector, dedupeOauthProviders, credentialAvailabilityFor, configPathFor, agentsDirFor, parseCredentialSourceFlags, nativeCandidatesFrom, oauthProvidersFor, avoidedKeysOf, gatewayNamesOf, nativeLabel, reconcilePerRoleModels, reconcileTierList, deriveInitState, configNativeCandidates, preTickedNative, previousAskedStep, duplicateKeys, } from '../init/helpers.js';
|
|
32
|
+
function renderProblem(p) {
|
|
33
|
+
const icon = p.severity === 'error' ? '✗' : p.severity === 'warn' ? '!' : 'ℹ';
|
|
34
|
+
const fix = p.fix ? `\n ❯ ${p.fix}` : '';
|
|
35
|
+
return ` ${icon} ${p.message}${fix}`;
|
|
36
|
+
}
|
|
37
|
+
export async function cmdInit(opts) {
|
|
38
|
+
const log = opts.log ?? openInitLog(opts.home);
|
|
39
|
+
const print = opts.write ?? ((l) => console.log(l));
|
|
40
|
+
// Everything the command says is teed to the log. The wizard owns the screen
|
|
41
|
+
// — Ink repaints and the list prompts use the alternate buffer — so what is
|
|
42
|
+
// on the terminal after a failed run is not what the run said.
|
|
43
|
+
const out = (line) => { print(line); log.line(line); };
|
|
44
|
+
const interactive = !opts.yes && isInteractive();
|
|
45
|
+
log.line(`cwd=${opts.cwd} home=${opts.home} interactive=${interactive} yes=${opts.yes ?? false}`);
|
|
46
|
+
try {
|
|
47
|
+
return await runInit(opts, out, log, interactive);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
log.fail(error);
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function runInit(opts, out, log, interactive) {
|
|
55
|
+
out('');
|
|
56
|
+
out(interactive ? banner() : ' sonata init');
|
|
57
|
+
out('');
|
|
58
|
+
// ---- discover ---------------------------------------------------------
|
|
59
|
+
const env = await discover({
|
|
60
|
+
cwd: opts.cwd,
|
|
61
|
+
home: opts.home,
|
|
62
|
+
packageRoot: opts.packageRoot,
|
|
63
|
+
detect: opts.detect,
|
|
64
|
+
}, out);
|
|
65
|
+
if (env.problems.some((p) => p.severity === 'error')) {
|
|
66
|
+
for (const p of env.problems)
|
|
67
|
+
out(renderProblem(p));
|
|
68
|
+
out('');
|
|
69
|
+
out(' Fix the errors above, then run `sonata init` again.');
|
|
70
|
+
return blockedResult(env.problems, opts);
|
|
71
|
+
}
|
|
72
|
+
for (const p of env.problems)
|
|
73
|
+
out(renderProblem(p));
|
|
74
|
+
// ---- choose -----------------------------------------------------------
|
|
75
|
+
// The two front ends (`interactiveState`, `scriptedState`) live in
|
|
76
|
+
// `src/init/`. Each one returns the same `InitState` shape plus a
|
|
77
|
+
// candidate map covering BYOK and live additions the front end made — the
|
|
78
|
+
// post-frontend `validate` step needs those additions to recognise the
|
|
79
|
+
// user-selected models. The wizard additionally reports whether the user
|
|
80
|
+
// cancelled.
|
|
81
|
+
const chosen = interactive
|
|
82
|
+
? await interactiveState(env, opts, log)
|
|
83
|
+
: { ...scriptedState(env, opts), cancelled: false };
|
|
84
|
+
if (chosen.cancelled) {
|
|
85
|
+
out(' Nothing written.');
|
|
86
|
+
return cancelledResult(env.problems, chosen.state, opts);
|
|
87
|
+
}
|
|
88
|
+
// ---- validate ---------------------------------------------------------
|
|
89
|
+
// Validation precedes planning: a plan built from an invalid state is a
|
|
90
|
+
// plan nobody should see, and `validate` resolves its own candidates so it
|
|
91
|
+
// has no dependency on `plan` having run. The front end's `nativeByKey`
|
|
92
|
+
// is passed so BYOK and live-refresh candidates are visible to the
|
|
93
|
+
// unknown-model check — they were added in the front end's own scope and
|
|
94
|
+
// are not in `env.allNativeCandidates`.
|
|
95
|
+
const problems = validate(env, chosen.state, { nativeByKey: chosen.nativeByKey });
|
|
96
|
+
if (problems.length > 0) {
|
|
97
|
+
if (!interactive)
|
|
98
|
+
throw new Error(problems[0].message);
|
|
99
|
+
for (const p of problems)
|
|
100
|
+
out(renderProblem(p));
|
|
101
|
+
return cancelledResult(env.problems, chosen.state, opts);
|
|
102
|
+
}
|
|
103
|
+
// ---- plan -------------------------------------------------------------
|
|
104
|
+
const credentials = fsCredentialProbe(opts.home, env.copilotUsable);
|
|
105
|
+
const initPlan = plan(env, chosen.state, credentials, opts);
|
|
106
|
+
for (const line of initPlan.notices)
|
|
107
|
+
out(line);
|
|
108
|
+
out('');
|
|
109
|
+
for (const line of initPlan.summary)
|
|
110
|
+
out(line);
|
|
111
|
+
out('');
|
|
112
|
+
log.line(`hook scope resolved: ${initPlan.hook.scope}`);
|
|
113
|
+
if (interactive)
|
|
114
|
+
log.line('prompting for write confirmation');
|
|
115
|
+
// `confirm` draws in the alternate screen buffer (`[?1049h`, `src/tui.ts`),
|
|
116
|
+
// which hides everything printed before it — so the question appeared alone on
|
|
117
|
+
// a cleared screen, asking the user to approve a summary they could no longer
|
|
118
|
+
// read. The prompt has to carry its own copy of what it is asking about.
|
|
119
|
+
const writeQuestion = [...initPlan.summary, 'Write these changes?'].join('\n');
|
|
120
|
+
if (interactive && !(await confirm(writeQuestion, true))) {
|
|
121
|
+
out(' Nothing written.');
|
|
122
|
+
return cancelledResult(env.problems, chosen.state, opts);
|
|
123
|
+
}
|
|
124
|
+
// ---- apply ------------------------------------------------------------
|
|
125
|
+
const applied = await apply(initPlan, opts, {
|
|
126
|
+
out,
|
|
127
|
+
prune: opts.prune ?? (interactive ? async () => confirm('Delete them?', true) : false),
|
|
128
|
+
});
|
|
129
|
+
out('');
|
|
130
|
+
out(' Done. Run /reload-plugins to pick up the new agents.');
|
|
131
|
+
out(' Native sessions: run `sonata code`, or `sonata route on` to route plain claude sessions.');
|
|
132
|
+
out('');
|
|
133
|
+
return {
|
|
134
|
+
problems: env.problems, models: initPlan.nativeKeys, roles: initPlan.roles,
|
|
135
|
+
scope: initPlan.hook.scope, routing: initPlan.routing,
|
|
136
|
+
hookChanged: applied.hookChanged, agentsWritten: applied.agentsWritten,
|
|
137
|
+
configPath: initPlan.configPath, pruned: applied.pruned,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function blockedResult(problems, opts) {
|
|
141
|
+
return {
|
|
142
|
+
problems, models: [], roles: [], scope: 'skip', routing: 'skip', hookChanged: false,
|
|
143
|
+
agentsWritten: [], configPath: join(opts.cwd, 'sonata.toml'),
|
|
144
|
+
pruned: [],
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function cancelledResult(problems, state, opts) {
|
|
148
|
+
return {
|
|
149
|
+
problems, models: [], roles: [], scope: 'skip', routing: 'skip', hookChanged: false,
|
|
150
|
+
agentsWritten: [], configPath: configPathFor(state.configScope ?? 'project', opts.cwd, opts.home),
|
|
151
|
+
pruned: [], cancelled: true,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
export function isCancellation(err) {
|
|
155
|
+
return err instanceof CancelledError;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { readEvents } from '../store.js';
|
|
2
|
+
import { cmdVerify } from './verify.js';
|
|
3
|
+
/**
|
|
4
|
+
* Prints everything a run ever put on its pane.
|
|
5
|
+
*
|
|
6
|
+
* `sonata tail` returns only what is new since the last call, so a caller that
|
|
7
|
+
* polled sees the conversation in fragments and a caller that arrived late
|
|
8
|
+
* sees none of it. The events file has held the whole transcript all along;
|
|
9
|
+
* this is the reader for it.
|
|
10
|
+
*
|
|
11
|
+
* The live equivalent is `tmux attach -r -t sonata-<id>`, which works only
|
|
12
|
+
* while the session is up. This works afterwards, and outlives the session.
|
|
13
|
+
*/
|
|
14
|
+
export function cmdLog(opts) {
|
|
15
|
+
const verified = cmdVerify({ cwd: opts.cwd, id: opts.id });
|
|
16
|
+
if (!verified.ok)
|
|
17
|
+
return { ok: false, text: verified.detail };
|
|
18
|
+
const lines = readEvents(opts.cwd, opts.id);
|
|
19
|
+
if (lines.length === 0) {
|
|
20
|
+
return { ok: true, text: `${opts.id}: no output was recorded\n\n— sonata ${verified.detail}` };
|
|
21
|
+
}
|
|
22
|
+
return { ok: true, text: `${lines.join('\n')}\n\n— sonata ${verified.detail}` };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,MAAM,CAAC,IAAgB;IACrC,MAAM,QAAQ,GAAG,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IAE9D,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,wCAAwC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;IACjG,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;AAClF,CAAC"}
|