scoutline 0.18.1 → 0.19.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 +12 -0
- package/dist/command-invocation.d.ts +21 -1
- package/dist/command-invocation.d.ts.map +1 -1
- package/dist/command-invocation.js +8 -1
- package/dist/command-invocation.js.map +1 -1
- package/dist/commands/history.d.ts +120 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +249 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +671 -20
- package/dist/index.js.map +1 -1
- package/dist/lib/artifacts.d.ts +149 -0
- package/dist/lib/artifacts.d.ts.map +1 -0
- package/dist/lib/artifacts.js +380 -0
- package/dist/lib/artifacts.js.map +1 -0
- package/dist/lib/async-file-lock.d.ts +18 -0
- package/dist/lib/async-file-lock.d.ts.map +1 -1
- package/dist/lib/async-file-lock.js +31 -1
- package/dist/lib/async-file-lock.js.map +1 -1
- package/dist/providers/firecrawl/adapter.d.ts.map +1 -1
- package/dist/providers/firecrawl/adapter.js +10 -0
- package/dist/providers/firecrawl/adapter.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
- **Code Mode** - TypeScript tool chaining for agent automation
|
|
24
24
|
- **Provider selection** - Run shared capabilities through Z.AI, MiniMax, Tavily, Exa, Brave, Firecrawl, Parallel AI, Perplexity, Jina AI, You.com, Linkup, or Spider.cloud
|
|
25
25
|
- **Usage ledger** - Local 90-day call-usage history per provider and capability (`scoutline usage`), counters only
|
|
26
|
+
- **Saved artifacts** - Durable clean reports from any provider-backed run (`--save`), content + request id only, plus a credential-free `scoutline history` inventory (list/show/stats)
|
|
26
27
|
|
|
27
28
|
## Quick Start
|
|
28
29
|
|
|
@@ -247,6 +248,10 @@ and a SHA-256 of the content, and no heading, question, term, or file byte
|
|
|
247
248
|
appears in notices or logs. Without these flags, `research` and `search`
|
|
248
249
|
output is byte-identical to previous releases.
|
|
249
250
|
|
|
251
|
+
### Saved Artifacts (`--save` + `history`)
|
|
252
|
+
|
|
253
|
+
Any provider-backed command (`search`, `read`, `crawl`, `map`, `research`, `repo`, `vision`) accepts `--save [<path>]`: after a successful run it writes a durable **clean report** — content plus a request id, nothing else — while stdout stays byte-identical. The master copy always lands in the artifact store (`~/.scoutline/artifacts/`, override `SCOUTLINE_ARTIFACTS_DIR`); `--save <path>` additionally writes an export copy (refused on an existing target unless `--save-force`). Reports are redacted through the same seam as stdout and never touched by `cache clear` or TTLs. `scoutline history list/show/stats` is the credential-free, fail-open inventory over the store's `index.json` metadata log, joined to reports by request id.
|
|
254
|
+
|
|
250
255
|
## Capability Matrix
|
|
251
256
|
|
|
252
257
|
The matrix below is generated from the production provider registry
|
|
@@ -363,6 +368,7 @@ scoutline doctor --help # Provider diagnostics
|
|
|
363
368
|
scoutline quota --help # Plan usage
|
|
364
369
|
scoutline cache --help # Local cache inspection, clearing, and pruning
|
|
365
370
|
scoutline usage --help # Local call-usage history (usage.json ledger)
|
|
371
|
+
scoutline history --help # Saved-artifact inventory (list/show/stats)
|
|
366
372
|
```
|
|
367
373
|
|
|
368
374
|
### Examples
|
|
@@ -415,6 +421,12 @@ scoutline usage # last 7 days, every provider (usage.json
|
|
|
415
421
|
scoutline usage --days 30 # wider UTC-day window
|
|
416
422
|
scoutline usage --provider zai # one provider's rows only
|
|
417
423
|
|
|
424
|
+
# Saved artifacts - clean reports (content + requestId), metadata joined by id
|
|
425
|
+
scoutline search "rust vs go" --save report.json # master copy + export copy
|
|
426
|
+
scoutline search "rust vs go" --save --save-format markdown # master only
|
|
427
|
+
scoutline history list --limit 5 # newest saves, from the log
|
|
428
|
+
scoutline history show 20260829T142233Z-7f3a # metadata + report, joined
|
|
429
|
+
|
|
418
430
|
# Config - inspect and change settings (scriptable, always redacted)
|
|
419
431
|
scoutline config get # full config dump (credentials masked)
|
|
420
432
|
scoutline config set routing.search tavily,brave
|
|
@@ -39,6 +39,26 @@ export interface CommandInvocationAdapter {
|
|
|
39
39
|
runQuietly<T>(operation: () => Promise<T>): Promise<T>;
|
|
40
40
|
setExitCode(value: number): void;
|
|
41
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Input handed to the optional save hook (save-artifacts T4). The seam
|
|
44
|
+
* passes the successful CommandResult, the SAME resolved secrets the
|
|
45
|
+
* output boundary redacts with, the invocation clock, and the notice
|
|
46
|
+
* channel - a hook notice rides the existing stderr flush ahead of the
|
|
47
|
+
* stdout write, so saving never reorders documented output.
|
|
48
|
+
*/
|
|
49
|
+
export interface SaveHookContext {
|
|
50
|
+
readonly result: CommandResult;
|
|
51
|
+
readonly resolvedSecrets: string[];
|
|
52
|
+
readonly now: () => number;
|
|
53
|
+
readonly notice: (message: string) => void;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Optional post-behavior save hook (save-artifacts T4). Present only for
|
|
57
|
+
* a save-capable command run with --save; every existing call site omits
|
|
58
|
+
* it and is byte-identical to the pre-T4 seam. A hook throw rides the
|
|
59
|
+
* existing catch: notices flush, one error envelope, no stdout.
|
|
60
|
+
*/
|
|
61
|
+
export type SaveHook = (context: SaveHookContext) => Promise<void>;
|
|
42
62
|
/**
|
|
43
63
|
* Run command behaviour through the invocation seam.
|
|
44
64
|
*
|
|
@@ -54,5 +74,5 @@ export interface CommandInvocationAdapter {
|
|
|
54
74
|
* The trailing newline is appended at the Node Adapter boundary, not
|
|
55
75
|
* here, so `invokeCommand` itself is process-effect-free.
|
|
56
76
|
*/
|
|
57
|
-
export declare function invokeCommand(adapter: CommandInvocationAdapter, behavior: (context: CommandContext) => Promise<CommandResult>, outputMode: OutputMode, now?: () => number, secrets?: string[]): Promise<number>;
|
|
77
|
+
export declare function invokeCommand(adapter: CommandInvocationAdapter, behavior: (context: CommandContext) => Promise<CommandResult>, outputMode: OutputMode, now?: () => number, secrets?: string[], save?: SaveHook): Promise<number>;
|
|
58
78
|
//# sourceMappingURL=command-invocation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-invocation.d.ts","sourceRoot":"","sources":["../src/command-invocation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKlD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;AAErE,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAErF,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,aAAa,CAAC,EAAE,oBAAoB,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,OAAO,IAAI,iBAAiB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;AAElF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;
|
|
1
|
+
{"version":3,"file":"command-invocation.d.ts","sourceRoot":"","sources":["../src/command-invocation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKlD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,CAAC;AAErE,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAErF,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,aAAa,CAAC,EAAE,oBAAoB,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,OAAO,IAAI,iBAAiB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;AAElF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAgDnE;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,wBAAwB,EACjC,QAAQ,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,aAAa,CAAC,EAC7D,UAAU,EAAE,UAAU,EACtB,GAAG,GAAE,MAAM,MAAiB,EAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,EAClB,IAAI,CAAC,EAAE,QAAQ,GACd,OAAO,CAAC,MAAM,CAAC,CAkDjB"}
|
|
@@ -63,7 +63,7 @@ function selectOutput(result, outputMode, now, secrets) {
|
|
|
63
63
|
* The trailing newline is appended at the Node Adapter boundary, not
|
|
64
64
|
* here, so `invokeCommand` itself is process-effect-free.
|
|
65
65
|
*/
|
|
66
|
-
export async function invokeCommand(adapter, behavior, outputMode, now = Date.now, secrets) {
|
|
66
|
+
export async function invokeCommand(adapter, behavior, outputMode, now = Date.now, secrets, save) {
|
|
67
67
|
const notices = [];
|
|
68
68
|
// F1: resolve secrets once and redact at BOTH the success-output and
|
|
69
69
|
// error boundaries. Previously only the error path consumed `secrets`;
|
|
@@ -81,6 +81,13 @@ export async function invokeCommand(adapter, behavior, outputMode, now = Date.no
|
|
|
81
81
|
let result;
|
|
82
82
|
try {
|
|
83
83
|
result = await adapter.runQuietly(() => behavior(context));
|
|
84
|
+
// save-artifacts T4: the hook runs INSIDE the try, after the behavior
|
|
85
|
+
// produced its result and before any stdout write. A failure rides the
|
|
86
|
+
// existing catch below (notices flushed, one error envelope, stdout
|
|
87
|
+
// suppressed). With no hook this is a no-op.
|
|
88
|
+
if (save !== undefined) {
|
|
89
|
+
await save({ result, resolvedSecrets, now, notice: context.notice });
|
|
90
|
+
}
|
|
84
91
|
}
|
|
85
92
|
catch (error) {
|
|
86
93
|
for (const notice of notices) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-invocation.js","sourceRoot":"","sources":["../src/command-invocation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"command-invocation.js","sourceRoot":"","sources":["../src/command-invocation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* history command — read-only inventory over the saved-artifact store
|
|
3
|
+
* (save-artifacts plan, Ticket 5).
|
|
4
|
+
*
|
|
5
|
+
* Three subcommands over `<artifacts>/index.json` and the master reports
|
|
6
|
+
* it references:
|
|
7
|
+
*
|
|
8
|
+
* - `history list [--since N] [--limit N] [--command C]` — newest
|
|
9
|
+
* first, from the LOG ONLY (a master file with no log entry is an
|
|
10
|
+
* orphan and invisible, DESIGN D5).
|
|
11
|
+
* - `history show <requestId>` — the join: the log entry plus the
|
|
12
|
+
* master report content, keyed by requestId. Unknown id and a live
|
|
13
|
+
* entry whose master vanished are FILE_ERROR (D7/D8).
|
|
14
|
+
* - `history stats` — counts by command / artifactFormat / kind,
|
|
15
|
+
* summed master bytes, and the oldest/newest span.
|
|
16
|
+
*
|
|
17
|
+
* Like `usage` (DESIGN D8), this module is presentation + aggregation
|
|
18
|
+
* only: I/O happens through injectable readers so every path is
|
|
19
|
+
* hermetically testable, and reads are fail-open — a missing store is
|
|
20
|
+
* the normal empty case, a corrupt log degrades to empty plus a notice.
|
|
21
|
+
* The command is credential-free (no Provider resolution, no Adapter,
|
|
22
|
+
* no transport) and dispatched before the credentialed config load.
|
|
23
|
+
*/
|
|
24
|
+
import type { CommandResult } from "../command-invocation.js";
|
|
25
|
+
import type { ArtifactsLog, SaveLogEntry } from "../lib/artifacts.js";
|
|
26
|
+
/** One list row: the inventory view of a log entry. */
|
|
27
|
+
export interface HistoryEntrySummary {
|
|
28
|
+
readonly requestId: string;
|
|
29
|
+
readonly timestamp: number;
|
|
30
|
+
readonly command: string;
|
|
31
|
+
readonly provider: SaveLogEntry["provider"];
|
|
32
|
+
readonly artifactFormat: SaveLogEntry["artifactFormat"];
|
|
33
|
+
readonly kind: SaveLogEntry["kind"];
|
|
34
|
+
readonly exportPath?: string;
|
|
35
|
+
}
|
|
36
|
+
/** `history list` data-mode envelope. */
|
|
37
|
+
export interface HistoryListReport {
|
|
38
|
+
readonly schemaVersion: 1;
|
|
39
|
+
readonly generatedAt: number;
|
|
40
|
+
/** Matches after filtering, before --limit slicing. */
|
|
41
|
+
readonly total: number;
|
|
42
|
+
readonly entries: readonly HistoryEntrySummary[];
|
|
43
|
+
}
|
|
44
|
+
/** `history show` data-mode envelope: the join by requestId. */
|
|
45
|
+
export interface HistoryShowReport {
|
|
46
|
+
readonly schemaVersion: 1;
|
|
47
|
+
readonly entry: SaveLogEntry;
|
|
48
|
+
/** Parsed report envelope for json masters; `{ markdown }` for md masters. */
|
|
49
|
+
readonly report: unknown;
|
|
50
|
+
}
|
|
51
|
+
/** `history stats` data-mode envelope. */
|
|
52
|
+
export interface HistoryStatsReport {
|
|
53
|
+
readonly schemaVersion: 1;
|
|
54
|
+
readonly generatedAt: number;
|
|
55
|
+
readonly total: number;
|
|
56
|
+
readonly byCommand: Readonly<Record<string, number>>;
|
|
57
|
+
readonly byArtifactFormat: Readonly<Record<string, number>>;
|
|
58
|
+
readonly byKind: Readonly<Record<string, number>>;
|
|
59
|
+
/** Sum of on-disk master sizes over logged entries (missing files add 0). */
|
|
60
|
+
readonly masterBytes: number;
|
|
61
|
+
readonly oldest?: number;
|
|
62
|
+
readonly newest?: number;
|
|
63
|
+
}
|
|
64
|
+
export interface HistoryListOptions {
|
|
65
|
+
readonly sinceDays?: number;
|
|
66
|
+
readonly limit?: number;
|
|
67
|
+
readonly command?: string;
|
|
68
|
+
readonly now: () => number;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Fold the log into the list report: optional `--command` filter, a
|
|
72
|
+
* `--since N` UTC-day window inclusive of today (the `usage --days`
|
|
73
|
+
* semantics: the window's lower edge is UTC midnight `N-1` whole days
|
|
74
|
+
* back, so every entry of today and the previous `N-1` days is kept —
|
|
75
|
+
* a rolling `now - N*DAY` cutoff would silently drop same-day entries
|
|
76
|
+
* and make `--since 1` effectively empty; cold-review round 1
|
|
77
|
+
* finding 2), newest-first ordering (timestamp desc, requestId desc on
|
|
78
|
+
* ties), then `--limit` slicing. `total` counts post-filter, pre-slice.
|
|
79
|
+
* Pure.
|
|
80
|
+
*/
|
|
81
|
+
export declare function buildHistoryListReport(log: ArtifactsLog, options: HistoryListOptions): HistoryListReport;
|
|
82
|
+
/** Master-content reader: returns the file text, or undefined when missing. */
|
|
83
|
+
export type ReadMaster = (entry: SaveLogEntry) => Promise<string | undefined>;
|
|
84
|
+
/**
|
|
85
|
+
* The join: find the entry by requestId, read its master, and surface
|
|
86
|
+
* `{ entry, report }`. Unknown ids are FILE_ERROR; a live entry whose
|
|
87
|
+
* master is gone is FILE_ERROR naming the master path; a corrupt json
|
|
88
|
+
* master is FILE_ERROR rather than a crash. Markdown masters surface as
|
|
89
|
+
* `{ markdown }` (they are not JSON).
|
|
90
|
+
*/
|
|
91
|
+
export declare function buildHistoryShowReport(log: ArtifactsLog, requestId: string, readMaster: ReadMaster): Promise<HistoryShowReport>;
|
|
92
|
+
/** Master-size reader (bytes); missing files should resolve 0, not throw. */
|
|
93
|
+
export type MasterSizeOf = (entry: SaveLogEntry) => Promise<number>;
|
|
94
|
+
/** Aggregate counts, summed master bytes, and the timestamp span. Pure except the size reader. */
|
|
95
|
+
export declare function buildHistoryStatsReport(log: ArtifactsLog, masterSizeOf: MasterSizeOf, now: () => number): Promise<HistoryStatsReport>;
|
|
96
|
+
export interface HistoryCommandDependencies {
|
|
97
|
+
readonly subcommand: "list" | "show" | "stats";
|
|
98
|
+
readonly readLog: () => Promise<{
|
|
99
|
+
log: ArtifactsLog;
|
|
100
|
+
notice?: string;
|
|
101
|
+
}>;
|
|
102
|
+
readonly readMaster: ReadMaster;
|
|
103
|
+
readonly masterSizeOf: MasterSizeOf;
|
|
104
|
+
readonly notice: (message: string) => void;
|
|
105
|
+
readonly now: () => number;
|
|
106
|
+
readonly sinceDays?: number;
|
|
107
|
+
readonly limit?: number;
|
|
108
|
+
readonly command?: string;
|
|
109
|
+
readonly requestId?: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Run one `history` subcommand: fail-open log read (a read notice is
|
|
113
|
+
* flushed through the invocation seam's stderr channel), then the pure
|
|
114
|
+
* aggregation above, returned as base data with the shared text-mode
|
|
115
|
+
* presentation. Exit 0; the FILE_ERROR paths throw and ride the seam's
|
|
116
|
+
* existing error boundary.
|
|
117
|
+
*/
|
|
118
|
+
export declare function historyCommand(deps: HistoryCommandDependencies): Promise<CommandResult>;
|
|
119
|
+
export declare const HISTORY_HELP = "History - Read-only inventory of saved --save artifacts\n\nUsage:\n scoutline history list [--since N] [--limit N] [--command <name>]\n scoutline history show <requestId>\n scoutline history stats\n\nReads the artifact store (default ~/.scoutline/artifacts/, override with\nSCOUTLINE_ARTIFACTS_DIR) without touching Providers, credentials, or the\nresponse cache. The listing comes from the metadata log only; a report\nfile without a log entry is invisible. Reads fail open: a missing store\nis an empty listing (exit 0); a corrupt log is ignored with a stderr\nnotice.\n\nOptions:\n list Saved runs, newest first. --since N keeps the last N UTC days\n (today inclusive); --limit N slices the newest N; --command\n filters by command name.\n show One saved run: the metadata record joined with the report\n content by requestId.\n stats Counts by command, artifact format, and entry kind, plus the\n total master bytes and oldest/newest span.\n\nExit codes:\n 0 Success (including the empty fail-open cases)\n 1 Unknown requestId or missing master (FILE_ERROR); invalid flags\n (VALIDATION_ERROR)\n\nExamples:\n scoutline search \"rust vs go\" --save report.json\n scoutline history list --limit 5\n scoutline history show 20260829T142233Z-7f3a\n scoutline history stats\n";
|
|
120
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* history command — read-only inventory over the saved-artifact store
|
|
3
|
+
* (save-artifacts plan, Ticket 5).
|
|
4
|
+
*
|
|
5
|
+
* Three subcommands over `<artifacts>/index.json` and the master reports
|
|
6
|
+
* it references:
|
|
7
|
+
*
|
|
8
|
+
* - `history list [--since N] [--limit N] [--command C]` — newest
|
|
9
|
+
* first, from the LOG ONLY (a master file with no log entry is an
|
|
10
|
+
* orphan and invisible, DESIGN D5).
|
|
11
|
+
* - `history show <requestId>` — the join: the log entry plus the
|
|
12
|
+
* master report content, keyed by requestId. Unknown id and a live
|
|
13
|
+
* entry whose master vanished are FILE_ERROR (D7/D8).
|
|
14
|
+
* - `history stats` — counts by command / artifactFormat / kind,
|
|
15
|
+
* summed master bytes, and the oldest/newest span.
|
|
16
|
+
*
|
|
17
|
+
* Like `usage` (DESIGN D8), this module is presentation + aggregation
|
|
18
|
+
* only: I/O happens through injectable readers so every path is
|
|
19
|
+
* hermetically testable, and reads are fail-open — a missing store is
|
|
20
|
+
* the normal empty case, a corrupt log degrades to empty plus a notice.
|
|
21
|
+
* The command is credential-free (no Provider resolution, no Adapter,
|
|
22
|
+
* no transport) and dispatched before the credentialed config load.
|
|
23
|
+
*/
|
|
24
|
+
import { FileError } from "../lib/errors.js";
|
|
25
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
26
|
+
/** List-row projection of a log entry (the inventory field set, pinned by tests). */
|
|
27
|
+
function toSummary(entry) {
|
|
28
|
+
return {
|
|
29
|
+
requestId: entry.requestId,
|
|
30
|
+
timestamp: entry.timestamp,
|
|
31
|
+
command: entry.command,
|
|
32
|
+
provider: entry.provider,
|
|
33
|
+
artifactFormat: entry.artifactFormat,
|
|
34
|
+
kind: entry.kind,
|
|
35
|
+
...(entry.exportPath !== undefined ? { exportPath: entry.exportPath } : {}),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** UTC-midnight floor of an instant — the `usage --days` window unit (whole days, today inclusive). */
|
|
39
|
+
function utcDayFloor(ms) {
|
|
40
|
+
const day = new Date(ms);
|
|
41
|
+
day.setUTCHours(0, 0, 0, 0);
|
|
42
|
+
return day.getTime();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Fold the log into the list report: optional `--command` filter, a
|
|
46
|
+
* `--since N` UTC-day window inclusive of today (the `usage --days`
|
|
47
|
+
* semantics: the window's lower edge is UTC midnight `N-1` whole days
|
|
48
|
+
* back, so every entry of today and the previous `N-1` days is kept —
|
|
49
|
+
* a rolling `now - N*DAY` cutoff would silently drop same-day entries
|
|
50
|
+
* and make `--since 1` effectively empty; cold-review round 1
|
|
51
|
+
* finding 2), newest-first ordering (timestamp desc, requestId desc on
|
|
52
|
+
* ties), then `--limit` slicing. `total` counts post-filter, pre-slice.
|
|
53
|
+
* Pure.
|
|
54
|
+
*/
|
|
55
|
+
export function buildHistoryListReport(log, options) {
|
|
56
|
+
const cutoff = options.sinceDays !== undefined
|
|
57
|
+
? utcDayFloor(options.now()) - (options.sinceDays - 1) * DAY_MS
|
|
58
|
+
: undefined;
|
|
59
|
+
const kept = log.entries.filter((entry) => {
|
|
60
|
+
if (options.command !== undefined && entry.command !== options.command)
|
|
61
|
+
return false;
|
|
62
|
+
if (cutoff !== undefined && entry.timestamp < cutoff)
|
|
63
|
+
return false;
|
|
64
|
+
return true;
|
|
65
|
+
});
|
|
66
|
+
const ordered = [...kept].sort((a, b) => b.timestamp - a.timestamp || (a.requestId < b.requestId ? 1 : a.requestId > b.requestId ? -1 : 0));
|
|
67
|
+
const sliced = options.limit !== undefined ? ordered.slice(0, options.limit) : ordered;
|
|
68
|
+
return {
|
|
69
|
+
schemaVersion: 1,
|
|
70
|
+
generatedAt: options.now(),
|
|
71
|
+
total: kept.length,
|
|
72
|
+
entries: sliced.map(toSummary),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The join: find the entry by requestId, read its master, and surface
|
|
77
|
+
* `{ entry, report }`. Unknown ids are FILE_ERROR; a live entry whose
|
|
78
|
+
* master is gone is FILE_ERROR naming the master path; a corrupt json
|
|
79
|
+
* master is FILE_ERROR rather than a crash. Markdown masters surface as
|
|
80
|
+
* `{ markdown }` (they are not JSON).
|
|
81
|
+
*/
|
|
82
|
+
export async function buildHistoryShowReport(log, requestId, readMaster) {
|
|
83
|
+
const entry = log.entries.find((candidate) => candidate.requestId === requestId);
|
|
84
|
+
if (entry === undefined) {
|
|
85
|
+
throw new FileError(`no artifact with requestId "${requestId}"`, "Run history list to see saved request ids.");
|
|
86
|
+
}
|
|
87
|
+
const text = await readMaster(entry);
|
|
88
|
+
if (text === undefined) {
|
|
89
|
+
throw new FileError(`artifact master is missing: ${entry.masterPath}`, "The log entry exists but its report file was moved or deleted.");
|
|
90
|
+
}
|
|
91
|
+
let report;
|
|
92
|
+
if (entry.artifactFormat === "markdown") {
|
|
93
|
+
report = { markdown: text };
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
try {
|
|
97
|
+
report = JSON.parse(text);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
throw new FileError(`artifact master is corrupt (invalid JSON): ${entry.masterPath}`, "The saved report could not be parsed; re-run the command to save a fresh artifact.");
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return { schemaVersion: 1, entry, report };
|
|
104
|
+
}
|
|
105
|
+
/** Aggregate counts, summed master bytes, and the timestamp span. Pure except the size reader. */
|
|
106
|
+
export async function buildHistoryStatsReport(log, masterSizeOf, now) {
|
|
107
|
+
const byCommand = {};
|
|
108
|
+
const byArtifactFormat = {};
|
|
109
|
+
const byKind = {};
|
|
110
|
+
let masterBytes = 0;
|
|
111
|
+
let oldest;
|
|
112
|
+
let newest;
|
|
113
|
+
for (const entry of log.entries) {
|
|
114
|
+
byCommand[entry.command] = (byCommand[entry.command] ?? 0) + 1;
|
|
115
|
+
byArtifactFormat[entry.artifactFormat] = (byArtifactFormat[entry.artifactFormat] ?? 0) + 1;
|
|
116
|
+
byKind[entry.kind] = (byKind[entry.kind] ?? 0) + 1;
|
|
117
|
+
masterBytes += await masterSizeOf(entry);
|
|
118
|
+
if (oldest === undefined || entry.timestamp < oldest)
|
|
119
|
+
oldest = entry.timestamp;
|
|
120
|
+
if (newest === undefined || entry.timestamp > newest)
|
|
121
|
+
newest = entry.timestamp;
|
|
122
|
+
}
|
|
123
|
+
const total = log.entries.length;
|
|
124
|
+
return {
|
|
125
|
+
schemaVersion: 1,
|
|
126
|
+
generatedAt: now(),
|
|
127
|
+
total,
|
|
128
|
+
byCommand,
|
|
129
|
+
byArtifactFormat,
|
|
130
|
+
byKind,
|
|
131
|
+
masterBytes,
|
|
132
|
+
...(oldest !== undefined ? { oldest } : {}),
|
|
133
|
+
...(newest !== undefined ? { newest } : {}),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
// Presentations (all text modes share one fixed-order rendering)
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
function formatTimestamp(ms) {
|
|
140
|
+
return new Date(ms).toISOString();
|
|
141
|
+
}
|
|
142
|
+
function formatHistoryList(report) {
|
|
143
|
+
// Review fixup: header and data rows share one column-width table, and
|
|
144
|
+
// every non-final column pads to width+1 so an exactly-full value (the
|
|
145
|
+
// 21-char requestId) still leaves a one-space separator — columns can
|
|
146
|
+
// no longer run together under a wide timestamp or id.
|
|
147
|
+
const pad = (cell, width) => cell.padEnd(width + 1);
|
|
148
|
+
const columns = ([id, saved, command, format]) => pad(id, 21) + pad(saved, 24) + pad(command, 10) + pad(format, 10);
|
|
149
|
+
const header = columns(["requestId", "saved (UTC)", "command", "format"]) + "provider";
|
|
150
|
+
const lines = [
|
|
151
|
+
`history: ${report.entries.length} of ${report.total} saved artifact(s)`,
|
|
152
|
+
header,
|
|
153
|
+
];
|
|
154
|
+
for (const row of report.entries) {
|
|
155
|
+
const provider = row.provider.mode === "fanout" ? `fanout(${row.provider.arms.join("+")})` : row.provider.effective;
|
|
156
|
+
lines.push(columns([
|
|
157
|
+
row.requestId,
|
|
158
|
+
formatTimestamp(row.timestamp),
|
|
159
|
+
row.command,
|
|
160
|
+
row.artifactFormat,
|
|
161
|
+
]) + provider);
|
|
162
|
+
}
|
|
163
|
+
return lines.join("\n");
|
|
164
|
+
}
|
|
165
|
+
function formatHistoryStats(report) {
|
|
166
|
+
const lines = [
|
|
167
|
+
`history stats: ${report.total} saved artifact(s), ${report.masterBytes} byte(s) of masters`,
|
|
168
|
+
`commands: ${Object.entries(report.byCommand).map(([k, v]) => `${k}=${v}`).join(" ") || "(none)"}`,
|
|
169
|
+
`formats: ${Object.entries(report.byArtifactFormat).map(([k, v]) => `${k}=${v}`).join(" ") || "(none)"}`,
|
|
170
|
+
`kinds: ${Object.entries(report.byKind).map(([k, v]) => `${k}=${v}`).join(" ") || "(none)"}`,
|
|
171
|
+
];
|
|
172
|
+
if (report.oldest !== undefined && report.newest !== undefined) {
|
|
173
|
+
lines.push(`span: ${formatTimestamp(report.oldest)} → ${formatTimestamp(report.newest)}`);
|
|
174
|
+
}
|
|
175
|
+
return lines.join("\n");
|
|
176
|
+
}
|
|
177
|
+
function historyPresentations(report) {
|
|
178
|
+
const text = "entries" in report
|
|
179
|
+
? formatHistoryList(report)
|
|
180
|
+
: "total" in report
|
|
181
|
+
? formatHistoryStats(report)
|
|
182
|
+
: JSON.stringify({ entry: report.entry, report: report.report }, null, 2);
|
|
183
|
+
return { compact: text, markdown: text, refs: text, tty: text };
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Run one `history` subcommand: fail-open log read (a read notice is
|
|
187
|
+
* flushed through the invocation seam's stderr channel), then the pure
|
|
188
|
+
* aggregation above, returned as base data with the shared text-mode
|
|
189
|
+
* presentation. Exit 0; the FILE_ERROR paths throw and ride the seam's
|
|
190
|
+
* existing error boundary.
|
|
191
|
+
*/
|
|
192
|
+
export async function historyCommand(deps) {
|
|
193
|
+
const { log, notice } = await deps.readLog();
|
|
194
|
+
if (notice !== undefined)
|
|
195
|
+
deps.notice(notice);
|
|
196
|
+
if (deps.subcommand === "list") {
|
|
197
|
+
const report = buildHistoryListReport(log, {
|
|
198
|
+
...(deps.sinceDays !== undefined ? { sinceDays: deps.sinceDays } : {}),
|
|
199
|
+
...(deps.limit !== undefined ? { limit: deps.limit } : {}),
|
|
200
|
+
...(deps.command !== undefined ? { command: deps.command } : {}),
|
|
201
|
+
now: deps.now,
|
|
202
|
+
});
|
|
203
|
+
return { kind: "data", data: report, presentations: historyPresentations(report) };
|
|
204
|
+
}
|
|
205
|
+
if (deps.subcommand === "stats") {
|
|
206
|
+
const report = await buildHistoryStatsReport(log, deps.masterSizeOf, deps.now);
|
|
207
|
+
return { kind: "data", data: report, presentations: historyPresentations(report) };
|
|
208
|
+
}
|
|
209
|
+
const report = await buildHistoryShowReport(log, deps.requestId ?? "", deps.readMaster);
|
|
210
|
+
return { kind: "data", data: report, presentations: historyPresentations(report) };
|
|
211
|
+
}
|
|
212
|
+
// ---------------------------------------------------------------------------
|
|
213
|
+
// Help
|
|
214
|
+
// ---------------------------------------------------------------------------
|
|
215
|
+
export const HISTORY_HELP = `History - Read-only inventory of saved --save artifacts
|
|
216
|
+
|
|
217
|
+
Usage:
|
|
218
|
+
scoutline history list [--since N] [--limit N] [--command <name>]
|
|
219
|
+
scoutline history show <requestId>
|
|
220
|
+
scoutline history stats
|
|
221
|
+
|
|
222
|
+
Reads the artifact store (default ~/.scoutline/artifacts/, override with
|
|
223
|
+
SCOUTLINE_ARTIFACTS_DIR) without touching Providers, credentials, or the
|
|
224
|
+
response cache. The listing comes from the metadata log only; a report
|
|
225
|
+
file without a log entry is invisible. Reads fail open: a missing store
|
|
226
|
+
is an empty listing (exit 0); a corrupt log is ignored with a stderr
|
|
227
|
+
notice.
|
|
228
|
+
|
|
229
|
+
Options:
|
|
230
|
+
list Saved runs, newest first. --since N keeps the last N UTC days
|
|
231
|
+
(today inclusive); --limit N slices the newest N; --command
|
|
232
|
+
filters by command name.
|
|
233
|
+
show One saved run: the metadata record joined with the report
|
|
234
|
+
content by requestId.
|
|
235
|
+
stats Counts by command, artifact format, and entry kind, plus the
|
|
236
|
+
total master bytes and oldest/newest span.
|
|
237
|
+
|
|
238
|
+
Exit codes:
|
|
239
|
+
0 Success (including the empty fail-open cases)
|
|
240
|
+
1 Unknown requestId or missing master (FILE_ERROR); invalid flags
|
|
241
|
+
(VALIDATION_ERROR)
|
|
242
|
+
|
|
243
|
+
Examples:
|
|
244
|
+
scoutline search "rust vs go" --save report.json
|
|
245
|
+
scoutline history list --limit 5
|
|
246
|
+
scoutline history show 20260829T142233Z-7f3a
|
|
247
|
+
scoutline history stats
|
|
248
|
+
`;
|
|
249
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -12,6 +12,20 @@ import type { ProviderVerificationSummary } from "./capabilities/diagnostics.js"
|
|
|
12
12
|
import { type ConsumptionSink } from "./lib/consumption.js";
|
|
13
13
|
import type { ProviderDescriptor, ProviderId } from "./providers/types.js";
|
|
14
14
|
import { type InitDependencies, type InitPrompts } from "./commands/init.js";
|
|
15
|
+
/** Artifact serialization formats (spec ruling: json | markdown, default json). */
|
|
16
|
+
declare const SAVE_FORMATS: readonly ["json", "markdown"];
|
|
17
|
+
type SaveFormat = (typeof SAVE_FORMATS)[number];
|
|
18
|
+
/**
|
|
19
|
+
* A parsed `--save` request. `exportPath === undefined` is the
|
|
20
|
+
* valueless-trailing-`--save` form: a master-only save with no export copy
|
|
21
|
+
* (DESIGN D1). The flags only configure a save when `--save` itself is
|
|
22
|
+
* present; `--save-format` / `--save-force` alone are validated and dropped.
|
|
23
|
+
*/
|
|
24
|
+
interface SaveRequest {
|
|
25
|
+
exportPath?: string;
|
|
26
|
+
format: SaveFormat;
|
|
27
|
+
force: boolean;
|
|
28
|
+
}
|
|
15
29
|
/**
|
|
16
30
|
* Dependencies threaded from `main` into every command handler.
|
|
17
31
|
*
|
|
@@ -87,6 +101,13 @@ export interface HandlerDependencies {
|
|
|
87
101
|
* pre-fan-out behavior).
|
|
88
102
|
*/
|
|
89
103
|
readonly configFanout?: boolean;
|
|
104
|
+
/**
|
|
105
|
+
* save-artifacts T4: present only when this run will actually save
|
|
106
|
+
* (save-capable command + --save + not a help invocation). Handlers
|
|
107
|
+
* turn it into an invokeCommand save hook via createSaveArtifactHook;
|
|
108
|
+
* every other run is byte-identical to pre-T4.
|
|
109
|
+
*/
|
|
110
|
+
readonly save?: SaveHookInput;
|
|
90
111
|
readonly searchCache: ResponseCache;
|
|
91
112
|
readonly searchSleep: (ms: number) => Promise<void>;
|
|
92
113
|
readonly searchRandom: () => number;
|
|
@@ -248,6 +269,25 @@ export declare function handleCache(args: string[], outputMode: OutputMode, deps
|
|
|
248
269
|
* it from `deps.provider` (same recovery as `cache prune`).
|
|
249
270
|
*/
|
|
250
271
|
export declare function handleUsage(args: string[], outputMode: OutputMode, deps: HandlerDependencies): Promise<number>;
|
|
272
|
+
/**
|
|
273
|
+
* `history` dispatcher (save-artifacts T5): flag/subcommand validation
|
|
274
|
+
* up front, then the pure `historyCommand` through the invocation seam
|
|
275
|
+
* with the artifacts store as the only I/O. The store path resolves
|
|
276
|
+
* against `SCOUTLINE_ARTIFACTS_DIR` / the config root; reads are
|
|
277
|
+
* fail-open (`readLog` never throws) so a missing or corrupt store is
|
|
278
|
+
* an empty inventory, exit 0. FILE_ERROR paths (unknown id, missing
|
|
279
|
+
* master) ride the seam's existing error boundary.
|
|
280
|
+
*/
|
|
281
|
+
export declare function handleHistory(args: string[], outputMode: OutputMode, deps: HandlerDependencies): Promise<number>;
|
|
282
|
+
/** Observation cell: the provider whose invoke() actually resolved. */
|
|
283
|
+
interface ServingCapture {
|
|
284
|
+
servedProvider?: ProviderId;
|
|
285
|
+
}
|
|
286
|
+
/** What main hands the save-capable handlers when a save will happen. */
|
|
287
|
+
interface SaveHookInput {
|
|
288
|
+
readonly request: SaveRequest;
|
|
289
|
+
readonly capture: ServingCapture;
|
|
290
|
+
}
|
|
251
291
|
export interface MainDependencies {
|
|
252
292
|
readonly invocation: CommandInvocationAdapter;
|
|
253
293
|
readonly env: NodeJS.ProcessEnv;
|
|
@@ -480,4 +520,5 @@ export interface MainDependencies {
|
|
|
480
520
|
readonly pruneCaches?: (selectors: PruneSelectors) => Promise<PruneCachesResult>;
|
|
481
521
|
}
|
|
482
522
|
export declare function main(args: readonly string[], dependencies: MainDependencies): Promise<number>;
|
|
523
|
+
export {};
|
|
483
524
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|