@portel/photon 1.22.1 → 1.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -8
- package/dist/a2ui/mapper.d.ts +40 -0
- package/dist/a2ui/mapper.d.ts.map +1 -0
- package/dist/a2ui/mapper.js +286 -0
- package/dist/a2ui/mapper.js.map +1 -0
- package/dist/a2ui/types.d.ts +129 -0
- package/dist/a2ui/types.d.ts.map +1 -0
- package/dist/a2ui/types.js +20 -0
- package/dist/a2ui/types.js.map +1 -0
- package/dist/ag-ui/adapter.d.ts +9 -1
- package/dist/ag-ui/adapter.d.ts.map +1 -1
- package/dist/ag-ui/adapter.js +33 -16
- package/dist/ag-ui/adapter.js.map +1 -1
- package/dist/auto-ui/beam/routes/api-daemon.d.ts +18 -0
- package/dist/auto-ui/beam/routes/api-daemon.d.ts.map +1 -0
- package/dist/auto-ui/beam/routes/api-daemon.js +118 -0
- package/dist/auto-ui/beam/routes/api-daemon.js.map +1 -0
- package/dist/auto-ui/beam.d.ts.map +1 -1
- package/dist/auto-ui/beam.js +34 -34
- package/dist/auto-ui/beam.js.map +1 -1
- package/dist/auto-ui/bridge/renderers.d.ts.map +1 -1
- package/dist/auto-ui/bridge/renderers.js +371 -0
- package/dist/auto-ui/bridge/renderers.js.map +1 -1
- package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
- package/dist/auto-ui/streamable-http-transport.js +38 -1
- package/dist/auto-ui/streamable-http-transport.js.map +1 -1
- package/dist/auto-ui/types.d.ts +19 -0
- package/dist/auto-ui/types.d.ts.map +1 -1
- package/dist/auto-ui/types.js.map +1 -1
- package/dist/beam.bundle.js +757 -107
- package/dist/beam.bundle.js.map +4 -4
- package/dist/cli/commands/beam.d.ts.map +1 -1
- package/dist/cli/commands/beam.js +2 -0
- package/dist/cli/commands/beam.js.map +1 -1
- package/dist/cli/commands/build.d.ts.map +1 -1
- package/dist/cli/commands/build.js +2 -0
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +92 -3
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/host.d.ts.map +1 -1
- package/dist/cli/commands/host.js +9 -1
- package/dist/cli/commands/host.js.map +1 -1
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +7 -3
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +4 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/maker.d.ts +8 -0
- package/dist/cli/commands/maker.d.ts.map +1 -1
- package/dist/cli/commands/maker.js +113 -46
- package/dist/cli/commands/maker.js.map +1 -1
- package/dist/cli/commands/marketplace.d.ts.map +1 -1
- package/dist/cli/commands/marketplace.js +7 -1
- package/dist/cli/commands/marketplace.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts +10 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +215 -4
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/package.d.ts.map +1 -1
- package/dist/cli/commands/package.js +33 -15
- package/dist/cli/commands/package.js.map +1 -1
- package/dist/cli/commands/ps.d.ts +16 -0
- package/dist/cli/commands/ps.d.ts.map +1 -0
- package/dist/cli/commands/ps.js +267 -0
- package/dist/cli/commands/ps.js.map +1 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +7 -0
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +14 -4
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +9 -4
- package/dist/cli/index.js.map +1 -1
- package/dist/context-store.d.ts +4 -4
- package/dist/context-store.d.ts.map +1 -1
- package/dist/context-store.js +20 -17
- package/dist/context-store.js.map +1 -1
- package/dist/context.d.ts +5 -4
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +68 -14
- package/dist/context.js.map +1 -1
- package/dist/daemon/client.d.ts +60 -0
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +76 -0
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/execution-history-sqlite.d.ts +50 -0
- package/dist/daemon/execution-history-sqlite.d.ts.map +1 -0
- package/dist/daemon/execution-history-sqlite.js +165 -0
- package/dist/daemon/execution-history-sqlite.js.map +1 -0
- package/dist/daemon/execution-history.d.ts +78 -0
- package/dist/daemon/execution-history.d.ts.map +1 -0
- package/dist/daemon/execution-history.js +246 -0
- package/dist/daemon/execution-history.js.map +1 -0
- package/dist/daemon/hot-reload-state.d.ts +27 -0
- package/dist/daemon/hot-reload-state.d.ts.map +1 -0
- package/dist/daemon/hot-reload-state.js +48 -0
- package/dist/daemon/hot-reload-state.js.map +1 -0
- package/dist/daemon/protocol.d.ts +5 -1
- package/dist/daemon/protocol.d.ts.map +1 -1
- package/dist/daemon/protocol.js +13 -0
- package/dist/daemon/protocol.js.map +1 -1
- package/dist/daemon/registry-keys.d.ts +88 -0
- package/dist/daemon/registry-keys.d.ts.map +1 -0
- package/dist/daemon/registry-keys.js +91 -0
- package/dist/daemon/registry-keys.js.map +1 -0
- package/dist/daemon/server.js +1521 -186
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/session-resolver.d.ts +28 -0
- package/dist/daemon/session-resolver.d.ts.map +1 -0
- package/dist/daemon/session-resolver.js +41 -0
- package/dist/daemon/session-resolver.js.map +1 -0
- package/dist/data-migration.js +20 -9
- package/dist/data-migration.js.map +1 -1
- package/dist/loader.d.ts +22 -8
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +214 -94
- package/dist/loader.js.map +1 -1
- package/dist/marketplace-manager.d.ts.map +1 -1
- package/dist/marketplace-manager.js +9 -5
- package/dist/marketplace-manager.js.map +1 -1
- package/dist/namespace-migration.d.ts.map +1 -1
- package/dist/namespace-migration.js +28 -23
- package/dist/namespace-migration.js.map +1 -1
- package/dist/photon-cli-runner.d.ts.map +1 -1
- package/dist/photon-cli-runner.js +57 -8
- package/dist/photon-cli-runner.js.map +1 -1
- package/dist/serv/auth/auth-store.d.ts +155 -0
- package/dist/serv/auth/auth-store.d.ts.map +1 -0
- package/dist/serv/auth/auth-store.js +240 -0
- package/dist/serv/auth/auth-store.js.map +1 -0
- package/dist/serv/auth/endpoints.d.ts +113 -0
- package/dist/serv/auth/endpoints.d.ts.map +1 -0
- package/dist/serv/auth/endpoints.js +1005 -0
- package/dist/serv/auth/endpoints.js.map +1 -0
- package/dist/serv/auth/http-adapter.d.ts +60 -0
- package/dist/serv/auth/http-adapter.d.ts.map +1 -0
- package/dist/serv/auth/http-adapter.js +235 -0
- package/dist/serv/auth/http-adapter.js.map +1 -0
- package/dist/serv/auth/jwt.d.ts +92 -6
- package/dist/serv/auth/jwt.d.ts.map +1 -1
- package/dist/serv/auth/jwt.js +226 -24
- package/dist/serv/auth/jwt.js.map +1 -1
- package/dist/serv/auth/oauth-sqlite-stores.d.ts +48 -0
- package/dist/serv/auth/oauth-sqlite-stores.d.ts.map +1 -0
- package/dist/serv/auth/oauth-sqlite-stores.js +212 -0
- package/dist/serv/auth/oauth-sqlite-stores.js.map +1 -0
- package/dist/serv/auth/sqlite-stores.d.ts +85 -0
- package/dist/serv/auth/sqlite-stores.d.ts.map +1 -0
- package/dist/serv/auth/sqlite-stores.js +446 -0
- package/dist/serv/auth/sqlite-stores.js.map +1 -0
- package/dist/serv/auth/well-known.d.ts +54 -1
- package/dist/serv/auth/well-known.d.ts.map +1 -1
- package/dist/serv/auth/well-known.js +166 -17
- package/dist/serv/auth/well-known.js.map +1 -1
- package/dist/serv/index.d.ts +45 -2
- package/dist/serv/index.d.ts.map +1 -1
- package/dist/serv/index.js +65 -1
- package/dist/serv/index.js.map +1 -1
- package/dist/serv/types/index.d.ts +80 -0
- package/dist/serv/types/index.d.ts.map +1 -1
- package/dist/serv/types/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +61 -6
- package/dist/server.js.map +1 -1
- package/dist/shared/announce-context.d.ts +51 -0
- package/dist/shared/announce-context.d.ts.map +1 -0
- package/dist/shared/announce-context.js +73 -0
- package/dist/shared/announce-context.js.map +1 -0
- package/dist/shared/audit-sqlite.d.ts +63 -0
- package/dist/shared/audit-sqlite.d.ts.map +1 -0
- package/dist/shared/audit-sqlite.js +187 -0
- package/dist/shared/audit-sqlite.js.map +1 -0
- package/dist/shared/audit.d.ts +25 -3
- package/dist/shared/audit.d.ts.map +1 -1
- package/dist/shared/audit.js +97 -3
- package/dist/shared/audit.js.map +1 -1
- package/dist/shared/error-handler.d.ts +10 -1
- package/dist/shared/error-handler.d.ts.map +1 -1
- package/dist/shared/error-handler.js +17 -2
- package/dist/shared/error-handler.js.map +1 -1
- package/dist/shared/security.d.ts +12 -0
- package/dist/shared/security.d.ts.map +1 -1
- package/dist/shared/security.js +80 -0
- package/dist/shared/security.js.map +1 -1
- package/dist/shared/sqlite-runtime.d.ts +46 -0
- package/dist/shared/sqlite-runtime.d.ts.map +1 -0
- package/dist/shared/sqlite-runtime.js +110 -0
- package/dist/shared/sqlite-runtime.js.map +1 -0
- package/dist/tasks/store.d.ts +1 -1
- package/dist/tasks/store.d.ts.map +1 -1
- package/dist/tasks/store.js +29 -15
- package/dist/tasks/store.js.map +1 -1
- package/dist/telemetry/metrics.d.ts +26 -0
- package/dist/telemetry/metrics.d.ts.map +1 -1
- package/dist/telemetry/metrics.js +31 -0
- package/dist/telemetry/metrics.js.map +1 -1
- package/dist/test-runner.d.ts.map +1 -1
- package/dist/test-runner.js +3 -3
- package/dist/test-runner.js.map +1 -1
- package/dist/version-checker.d.ts.map +1 -1
- package/dist/version-checker.js +7 -14
- package/dist/version-checker.js.map +1 -1
- package/dist/version.d.ts +12 -0
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +103 -1
- package/dist/version.js.map +1 -1
- package/package.json +6 -2
- package/templates/photon.template.ts +7 -13
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI context transparency helper.
|
|
3
|
+
*
|
|
4
|
+
* Agent-first output: default is minimal (just the command result), so
|
|
5
|
+
* tool-calling agents don't see a wall of prose. When the user passes
|
|
6
|
+
* `-v` / `--verbose` (or sets `PHOTON_VERBOSE=1`), commands emit `→`
|
|
7
|
+
* prefixed context lines showing PHOTON_DIR, the resolved photon, and
|
|
8
|
+
* the target path. When the user passes `--json`, the command includes
|
|
9
|
+
* a structured `context` envelope in its output.
|
|
10
|
+
*
|
|
11
|
+
* Rule of thumb for adopters: any command whose behavior depends on
|
|
12
|
+
* which PHOTON_DIR is resolved should call `announceContext()` once at
|
|
13
|
+
* entry so a user running `-v` can audit the decision. Commands that
|
|
14
|
+
* already support `--json` should merge `contextEnvelope()` into their
|
|
15
|
+
* response envelope.
|
|
16
|
+
*
|
|
17
|
+
* See docs/internals/PHOTON-DIR-AND-NAMESPACE.md and the codebase audit
|
|
18
|
+
* (§10) for the full list of PHOTON_DIR-sensitive commands and the
|
|
19
|
+
* migration status.
|
|
20
|
+
*/
|
|
21
|
+
import { getDefaultContext } from '../context.js';
|
|
22
|
+
function argvHas(flag, short) {
|
|
23
|
+
return process.argv.includes(flag) || (short !== undefined && process.argv.includes(short));
|
|
24
|
+
}
|
|
25
|
+
/** True when the caller opted into transparency via argv or env. */
|
|
26
|
+
export function isVerbose() {
|
|
27
|
+
if (argvHas('--quiet', '-q'))
|
|
28
|
+
return false;
|
|
29
|
+
if (process.env.PHOTON_VERBOSE === '1')
|
|
30
|
+
return true;
|
|
31
|
+
if (argvHas('--verbose', '-v'))
|
|
32
|
+
return true;
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
/** Build the structured context envelope for `--json` mode. */
|
|
36
|
+
export function contextEnvelope(opts = {}) {
|
|
37
|
+
const ctx = getDefaultContext();
|
|
38
|
+
const env = {
|
|
39
|
+
photonDir: ctx.baseDir,
|
|
40
|
+
dataDir: ctx.dataDir,
|
|
41
|
+
};
|
|
42
|
+
if (opts.photon !== undefined)
|
|
43
|
+
env.photon = opts.photon;
|
|
44
|
+
if (opts.action !== undefined)
|
|
45
|
+
env.action = opts.action;
|
|
46
|
+
if (opts.target !== undefined)
|
|
47
|
+
env.target = opts.target;
|
|
48
|
+
return env;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Print transparency lines to stderr when verbose is enabled. No-op
|
|
52
|
+
* otherwise so default output stays clean for agents and scripts.
|
|
53
|
+
*/
|
|
54
|
+
export function announceContext(opts = {}) {
|
|
55
|
+
const verbose = opts.verbose ?? isVerbose();
|
|
56
|
+
if (!verbose)
|
|
57
|
+
return;
|
|
58
|
+
const ctx = getDefaultContext();
|
|
59
|
+
const lines = [];
|
|
60
|
+
lines.push(`→ PHOTON_DIR: ${ctx.baseDir}`);
|
|
61
|
+
if (opts.photon)
|
|
62
|
+
lines.push(`→ Photon: ${opts.photon}`);
|
|
63
|
+
if (opts.action && opts.target) {
|
|
64
|
+
lines.push(`→ ${opts.action}: ${opts.target}`);
|
|
65
|
+
}
|
|
66
|
+
else if (opts.target) {
|
|
67
|
+
lines.push(`→ Target: ${opts.target}`);
|
|
68
|
+
}
|
|
69
|
+
if (opts.hint)
|
|
70
|
+
lines.push(` ${opts.hint}`);
|
|
71
|
+
process.stderr.write(lines.join('\n') + '\n');
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=announce-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"announce-context.js","sourceRoot":"","sources":["../../src/shared/announce-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAyBlD,SAAS,OAAO,CAAC,IAAY,EAAE,KAAc;IAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,SAAS;IACvB,IAAI,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,eAAe,CAAC,OAAwB,EAAE;IACxD,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,MAAM,GAAG,GAAoB;QAC3B,SAAS,EAAE,GAAG,CAAC,OAAO;QACtB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC;IACF,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACxD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACxD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACxD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAwB,EAAE;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC;IAC5C,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,IAAI,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite-backed audit log.
|
|
3
|
+
*
|
|
4
|
+
* Alternative to the JSONL writer in `audit.ts` for deployments that want
|
|
5
|
+
* queryable audit history. Supports indexed filters on `caller`, `photon`,
|
|
6
|
+
* `timestamp` without scanning the file.
|
|
7
|
+
*
|
|
8
|
+
* Runtime-agnostic loader: uses `bun:sqlite` under Bun, `better-sqlite3`
|
|
9
|
+
* under Node. Falls back to JSONL if neither is available.
|
|
10
|
+
*
|
|
11
|
+
* Row cap: deletes oldest rows when count exceeds `maxRows` (default 100k).
|
|
12
|
+
* Cheaper than the JSONL rotate/delete dance and preserves query index
|
|
13
|
+
* integrity automatically.
|
|
14
|
+
*/
|
|
15
|
+
import type { AuditEntry } from './audit.js';
|
|
16
|
+
import { type SqliteDatabase } from './sqlite-runtime.js';
|
|
17
|
+
export interface AuditQuery {
|
|
18
|
+
/** Only rows at or after this timestamp. */
|
|
19
|
+
since?: Date;
|
|
20
|
+
/** Only rows at or before this timestamp. */
|
|
21
|
+
until?: Date;
|
|
22
|
+
/** Filter by photon name. */
|
|
23
|
+
photon?: string;
|
|
24
|
+
/** Filter by authenticated caller (sub claim). */
|
|
25
|
+
client?: string;
|
|
26
|
+
/** Filter by event type. */
|
|
27
|
+
event?: string;
|
|
28
|
+
/** Max rows to return. Default 1000. */
|
|
29
|
+
limit?: number;
|
|
30
|
+
/** Sort direction on timestamp. Default descending (most recent first). */
|
|
31
|
+
order?: 'asc' | 'desc';
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Open a SQLite-backed audit store. Returns a backend with write/query/close.
|
|
35
|
+
*/
|
|
36
|
+
export declare function openAuditDatabase(path: string): Promise<SqliteDatabase>;
|
|
37
|
+
export interface AuditBackend {
|
|
38
|
+
write(entry: AuditEntry): void;
|
|
39
|
+
query(q: AuditQuery): AuditEntry[];
|
|
40
|
+
count(): number;
|
|
41
|
+
close(): void;
|
|
42
|
+
}
|
|
43
|
+
export declare class SqliteAuditBackend implements AuditBackend {
|
|
44
|
+
private db;
|
|
45
|
+
private maxRows;
|
|
46
|
+
/** Check row count every N writes to avoid COUNT(*) per insert. */
|
|
47
|
+
private trimInterval;
|
|
48
|
+
private insert;
|
|
49
|
+
private countStmt;
|
|
50
|
+
private trimStmt;
|
|
51
|
+
private writes;
|
|
52
|
+
/** Known columns we store in dedicated fields; anything else goes into `extra`. */
|
|
53
|
+
private static readonly WELL_KNOWN;
|
|
54
|
+
constructor(db: SqliteDatabase, maxRows?: number,
|
|
55
|
+
/** Check row count every N writes to avoid COUNT(*) per insert. */
|
|
56
|
+
trimInterval?: number);
|
|
57
|
+
write(entry: AuditEntry): void;
|
|
58
|
+
query(q?: AuditQuery): AuditEntry[];
|
|
59
|
+
count(): number;
|
|
60
|
+
close(): void;
|
|
61
|
+
private trimIfNeeded;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=audit-sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-sqlite.d.ts","sourceRoot":"","sources":["../../src/shared/audit-sqlite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAc,KAAK,cAAc,EAAwB,MAAM,qBAAqB,CAAC;AAM5F,MAAM,WAAW,UAAU;IACzB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,6CAA6C;IAC7C,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACxB;AA4BD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAE7E;AAMD,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;IACnC,KAAK,IAAI,MAAM,CAAC;IAChB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,qBAAa,kBAAmB,YAAW,YAAY;IAmBnD,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,OAAO;IACf,mEAAmE;IACnE,OAAO,CAAC,YAAY;IArBtB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,MAAM,CAAK;IACnB,mFAAmF;IACnF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAU/B;gBAGO,EAAE,EAAE,cAAc,EAClB,OAAO,SAAU;IACzB,mEAAmE;IAC3D,YAAY,SAAM;IAY5B,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IA+B9B,KAAK,CAAC,CAAC,GAAE,UAAe,GAAG,UAAU,EAAE;IAiCvC,KAAK,IAAI,MAAM;IAKf,KAAK,IAAI,IAAI;IAQb,OAAO,CAAC,YAAY;CAUrB"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite-backed audit log.
|
|
3
|
+
*
|
|
4
|
+
* Alternative to the JSONL writer in `audit.ts` for deployments that want
|
|
5
|
+
* queryable audit history. Supports indexed filters on `caller`, `photon`,
|
|
6
|
+
* `timestamp` without scanning the file.
|
|
7
|
+
*
|
|
8
|
+
* Runtime-agnostic loader: uses `bun:sqlite` under Bun, `better-sqlite3`
|
|
9
|
+
* under Node. Falls back to JSONL if neither is available.
|
|
10
|
+
*
|
|
11
|
+
* Row cap: deletes oldest rows when count exceeds `maxRows` (default 100k).
|
|
12
|
+
* Cheaper than the JSONL rotate/delete dance and preserves query index
|
|
13
|
+
* integrity automatically.
|
|
14
|
+
*/
|
|
15
|
+
import { openSqlite } from './sqlite-runtime.js';
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Schema + open
|
|
18
|
+
// ============================================================================
|
|
19
|
+
function initSchema(db) {
|
|
20
|
+
db.exec(`
|
|
21
|
+
CREATE TABLE IF NOT EXISTS audit (
|
|
22
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
23
|
+
ts INTEGER NOT NULL,
|
|
24
|
+
event TEXT NOT NULL,
|
|
25
|
+
photon TEXT,
|
|
26
|
+
method TEXT,
|
|
27
|
+
instance TEXT,
|
|
28
|
+
client TEXT,
|
|
29
|
+
session_id TEXT,
|
|
30
|
+
duration_ms INTEGER,
|
|
31
|
+
error TEXT,
|
|
32
|
+
extra TEXT
|
|
33
|
+
);
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_audit_ts ON audit(ts);
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_audit_photon_ts ON audit(photon, ts);
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_audit_client_ts ON audit(client, ts);
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_audit_event_ts ON audit(event, ts);
|
|
38
|
+
`);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Open a SQLite-backed audit store. Returns a backend with write/query/close.
|
|
42
|
+
*/
|
|
43
|
+
export async function openAuditDatabase(path) {
|
|
44
|
+
return openSqlite(path, initSchema);
|
|
45
|
+
}
|
|
46
|
+
export class SqliteAuditBackend {
|
|
47
|
+
db;
|
|
48
|
+
maxRows;
|
|
49
|
+
trimInterval;
|
|
50
|
+
insert;
|
|
51
|
+
countStmt;
|
|
52
|
+
trimStmt;
|
|
53
|
+
writes = 0;
|
|
54
|
+
/** Known columns we store in dedicated fields; anything else goes into `extra`. */
|
|
55
|
+
static WELL_KNOWN = new Set([
|
|
56
|
+
'ts',
|
|
57
|
+
'event',
|
|
58
|
+
'photon',
|
|
59
|
+
'method',
|
|
60
|
+
'instance',
|
|
61
|
+
'client',
|
|
62
|
+
'sessionId',
|
|
63
|
+
'durationMs',
|
|
64
|
+
'error',
|
|
65
|
+
]);
|
|
66
|
+
constructor(db, maxRows = 100_000,
|
|
67
|
+
/** Check row count every N writes to avoid COUNT(*) per insert. */
|
|
68
|
+
trimInterval = 500) {
|
|
69
|
+
this.db = db;
|
|
70
|
+
this.maxRows = maxRows;
|
|
71
|
+
this.trimInterval = trimInterval;
|
|
72
|
+
this.insert = db.prepare(`INSERT INTO audit (ts, event, photon, method, instance, client, session_id, duration_ms, error, extra)
|
|
73
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
|
|
74
|
+
this.countStmt = db.prepare('SELECT COUNT(*) AS n FROM audit');
|
|
75
|
+
this.trimStmt = db.prepare('DELETE FROM audit WHERE id IN (SELECT id FROM audit ORDER BY ts ASC LIMIT ?)');
|
|
76
|
+
}
|
|
77
|
+
write(entry) {
|
|
78
|
+
try {
|
|
79
|
+
const tsMs = typeof entry.ts === 'string' ? Date.parse(entry.ts) : Date.now();
|
|
80
|
+
const extra = {};
|
|
81
|
+
for (const key of Object.keys(entry)) {
|
|
82
|
+
if (!SqliteAuditBackend.WELL_KNOWN.has(key)) {
|
|
83
|
+
extra[key] = entry[key];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
this.insert.run(tsMs, entry.event, entry.photon ?? null, entry.method ?? null, entry.instance ?? null, entry.client ?? null, entry.sessionId ?? null, entry.durationMs ?? null, entry.error ?? null, Object.keys(extra).length > 0 ? JSON.stringify(extra) : null);
|
|
87
|
+
this.writes++;
|
|
88
|
+
if (this.writes >= this.trimInterval) {
|
|
89
|
+
this.writes = 0;
|
|
90
|
+
this.trimIfNeeded();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Never block execution for audit I/O
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
query(q = {}) {
|
|
98
|
+
const clauses = [];
|
|
99
|
+
const params = [];
|
|
100
|
+
if (q.since) {
|
|
101
|
+
clauses.push('ts >= ?');
|
|
102
|
+
params.push(q.since.getTime());
|
|
103
|
+
}
|
|
104
|
+
if (q.until) {
|
|
105
|
+
clauses.push('ts <= ?');
|
|
106
|
+
params.push(q.until.getTime());
|
|
107
|
+
}
|
|
108
|
+
if (q.photon) {
|
|
109
|
+
clauses.push('photon = ?');
|
|
110
|
+
params.push(q.photon);
|
|
111
|
+
}
|
|
112
|
+
if (q.client) {
|
|
113
|
+
clauses.push('client = ?');
|
|
114
|
+
params.push(q.client);
|
|
115
|
+
}
|
|
116
|
+
if (q.event) {
|
|
117
|
+
clauses.push('event = ?');
|
|
118
|
+
params.push(q.event);
|
|
119
|
+
}
|
|
120
|
+
const where = clauses.length ? `WHERE ${clauses.join(' AND ')}` : '';
|
|
121
|
+
const order = q.order === 'asc' ? 'ASC' : 'DESC';
|
|
122
|
+
const limit = q.limit ?? 1000;
|
|
123
|
+
const sql = `SELECT * FROM audit ${where} ORDER BY ts ${order} LIMIT ?`;
|
|
124
|
+
params.push(limit);
|
|
125
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
126
|
+
const rows = this.db.prepare(sql).all(...params);
|
|
127
|
+
return rows.map((r) => rowToEntry(r));
|
|
128
|
+
}
|
|
129
|
+
count() {
|
|
130
|
+
const row = this.countStmt.get();
|
|
131
|
+
return row?.n ?? 0;
|
|
132
|
+
}
|
|
133
|
+
close() {
|
|
134
|
+
try {
|
|
135
|
+
this.db.close();
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// ignore
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
trimIfNeeded() {
|
|
142
|
+
const current = this.count();
|
|
143
|
+
if (current <= this.maxRows)
|
|
144
|
+
return;
|
|
145
|
+
const excess = current - this.maxRows;
|
|
146
|
+
try {
|
|
147
|
+
this.trimStmt.run(excess);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Silent — trim is best-effort
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
155
|
+
function rowToEntry(row) {
|
|
156
|
+
const entry = {
|
|
157
|
+
ts: new Date(row.ts).toISOString(),
|
|
158
|
+
event: row.event,
|
|
159
|
+
};
|
|
160
|
+
if (row.photon != null)
|
|
161
|
+
entry.photon = row.photon;
|
|
162
|
+
if (row.method != null)
|
|
163
|
+
entry.method = row.method;
|
|
164
|
+
if (row.instance != null)
|
|
165
|
+
entry.instance = row.instance;
|
|
166
|
+
if (row.client != null)
|
|
167
|
+
entry.client = row.client;
|
|
168
|
+
if (row.session_id != null)
|
|
169
|
+
entry.sessionId = row.session_id;
|
|
170
|
+
if (row.duration_ms != null)
|
|
171
|
+
entry.durationMs = row.duration_ms;
|
|
172
|
+
if (row.error != null)
|
|
173
|
+
entry.error = row.error;
|
|
174
|
+
if (row.extra) {
|
|
175
|
+
try {
|
|
176
|
+
const parsed = JSON.parse(row.extra);
|
|
177
|
+
for (const k of Object.keys(parsed)) {
|
|
178
|
+
entry[k] = parsed[k];
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// malformed extra; drop silently
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return entry;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=audit-sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-sqlite.js","sourceRoot":"","sources":["../../src/shared/audit-sqlite.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/audit.d.ts
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Persistent Audit Log
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Two backends, selected at runtime:
|
|
5
|
+
* - JSONL (default): append-only writer to ~/.photon/audit.jsonl,
|
|
6
|
+
* size-based rotation (5MB, 3 archives). Always available.
|
|
7
|
+
* - SQLite (opt-in via initAuditSqlite): indexed, queryable. Preferred for
|
|
8
|
+
* daemons that need fast per-caller / per-photon audit queries.
|
|
9
|
+
*
|
|
10
|
+
* Silent failure — never blocks execution for audit I/O.
|
|
7
11
|
*/
|
|
12
|
+
import type { AuditBackend, AuditQuery } from './audit-sqlite.js';
|
|
8
13
|
/** Rotate when file exceeds this size (5MB) */
|
|
9
14
|
declare const MAX_FILE_SIZE: number;
|
|
10
15
|
/** Number of rotated archives to keep */
|
|
@@ -21,6 +26,23 @@ export interface AuditEntry {
|
|
|
21
26
|
error?: string;
|
|
22
27
|
[key: string]: unknown;
|
|
23
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Upgrade the audit writer to a SQLite backend for indexed queries.
|
|
31
|
+
* Callers (daemon startup, server bootstrap) invoke this once early.
|
|
32
|
+
* Safe to call multiple times — subsequent calls are no-ops. If SQLite
|
|
33
|
+
* isn't available (no `better-sqlite3` on Node, not running under Bun),
|
|
34
|
+
* throws and the JSONL fallback remains active.
|
|
35
|
+
*/
|
|
36
|
+
export declare function initAuditSqlite(path?: string): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Swap the SQLite backend for a pre-constructed one. For tests.
|
|
39
|
+
*/
|
|
40
|
+
export declare function setAuditBackend(backend: AuditBackend | null): void;
|
|
41
|
+
/**
|
|
42
|
+
* Query the audit log. Uses SQLite indexes when available, otherwise
|
|
43
|
+
* streams the JSONL file and filters in memory.
|
|
44
|
+
*/
|
|
45
|
+
export declare function queryAudit(q?: AuditQuery): Promise<AuditEntry[]>;
|
|
24
46
|
export declare function audit(entry: AuditEntry): void;
|
|
25
47
|
/** Force a rotation check (used by CLI clear/rotate commands) */
|
|
26
48
|
export declare function forceRotate(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/shared/audit.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/shared/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAKlE,+CAA+C;AAC/C,QAAA,MAAM,aAAa,QAAkB,CAAC;AACtC,yCAAyC;AACzC,QAAA,MAAM,iBAAiB,IAAI,CAAC;AAI5B,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AASD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWlE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAElE;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,CAAC,GAAE,UAAe,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAG1E;AAmED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAyB7C;AAED,iEAAiE;AACjE,wBAAgB,WAAW,IAAI,OAAO,CAkBrC;AAED,eAAO,MAAM,eAAe,QAAa,CAAC;AAC1C,eAAO,MAAM,cAAc,QAAY,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC"}
|
package/dist/shared/audit.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Persistent Audit Log
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Two backends, selected at runtime:
|
|
5
|
+
* - JSONL (default): append-only writer to ~/.photon/audit.jsonl,
|
|
6
|
+
* size-based rotation (5MB, 3 archives). Always available.
|
|
7
|
+
* - SQLite (opt-in via initAuditSqlite): indexed, queryable. Preferred for
|
|
8
|
+
* daemons that need fast per-caller / per-photon audit queries.
|
|
9
|
+
*
|
|
10
|
+
* Silent failure — never blocks execution for audit I/O.
|
|
7
11
|
*/
|
|
8
12
|
import { appendFileSync, mkdirSync, statSync, renameSync, unlinkSync, existsSync } from 'fs';
|
|
9
13
|
import { join, dirname } from 'path';
|
|
@@ -19,6 +23,86 @@ const ROTATION_CHECK_INTERVAL = 100;
|
|
|
19
23
|
let dirEnsured = false;
|
|
20
24
|
let writeCount = 0;
|
|
21
25
|
let rotating = false;
|
|
26
|
+
/** Active SQLite backend, or null if we're using JSONL. */
|
|
27
|
+
let sqliteBackend = null;
|
|
28
|
+
/**
|
|
29
|
+
* Upgrade the audit writer to a SQLite backend for indexed queries.
|
|
30
|
+
* Callers (daemon startup, server bootstrap) invoke this once early.
|
|
31
|
+
* Safe to call multiple times — subsequent calls are no-ops. If SQLite
|
|
32
|
+
* isn't available (no `better-sqlite3` on Node, not running under Bun),
|
|
33
|
+
* throws and the JSONL fallback remains active.
|
|
34
|
+
*/
|
|
35
|
+
export async function initAuditSqlite(path) {
|
|
36
|
+
if (sqliteBackend)
|
|
37
|
+
return;
|
|
38
|
+
const { openAuditDatabase, SqliteAuditBackend } = await import('./audit-sqlite.js');
|
|
39
|
+
const dbPath = path ?? AUDIT_FILE.replace(/\.jsonl$/i, '.db');
|
|
40
|
+
try {
|
|
41
|
+
mkdirSync(dirname(dbPath), { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// non-fatal
|
|
45
|
+
}
|
|
46
|
+
const db = await openAuditDatabase(dbPath);
|
|
47
|
+
sqliteBackend = new SqliteAuditBackend(db);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Swap the SQLite backend for a pre-constructed one. For tests.
|
|
51
|
+
*/
|
|
52
|
+
export function setAuditBackend(backend) {
|
|
53
|
+
sqliteBackend = backend;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Query the audit log. Uses SQLite indexes when available, otherwise
|
|
57
|
+
* streams the JSONL file and filters in memory.
|
|
58
|
+
*/
|
|
59
|
+
export async function queryAudit(q = {}) {
|
|
60
|
+
if (sqliteBackend)
|
|
61
|
+
return sqliteBackend.query(q);
|
|
62
|
+
return queryJsonl(q);
|
|
63
|
+
}
|
|
64
|
+
async function queryJsonl(q) {
|
|
65
|
+
const { readFile } = await import('fs/promises');
|
|
66
|
+
const results = [];
|
|
67
|
+
try {
|
|
68
|
+
const raw = await readFile(AUDIT_FILE, 'utf8');
|
|
69
|
+
const lines = raw.split('\n').filter(Boolean);
|
|
70
|
+
// Newest first — iterate from the end so limit clamps cheaply
|
|
71
|
+
const ordered = q.order === 'asc' ? lines : [...lines].reverse();
|
|
72
|
+
const limit = q.limit ?? 1000;
|
|
73
|
+
for (const line of ordered) {
|
|
74
|
+
let entry;
|
|
75
|
+
try {
|
|
76
|
+
entry = JSON.parse(line);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (!matchesQuery(entry, q))
|
|
82
|
+
continue;
|
|
83
|
+
results.push(entry);
|
|
84
|
+
if (results.length >= limit)
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// file missing or unreadable — empty result
|
|
90
|
+
}
|
|
91
|
+
return results;
|
|
92
|
+
}
|
|
93
|
+
function matchesQuery(entry, q) {
|
|
94
|
+
if (q.photon && entry.photon !== q.photon)
|
|
95
|
+
return false;
|
|
96
|
+
if (q.client && entry.client !== q.client)
|
|
97
|
+
return false;
|
|
98
|
+
if (q.event && entry.event !== q.event)
|
|
99
|
+
return false;
|
|
100
|
+
if (q.since && new Date(entry.ts).getTime() < q.since.getTime())
|
|
101
|
+
return false;
|
|
102
|
+
if (q.until && new Date(entry.ts).getTime() > q.until.getTime())
|
|
103
|
+
return false;
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
22
106
|
/**
|
|
23
107
|
* Rotate audit log files: audit.jsonl → audit.1.jsonl → audit.2.jsonl → audit.3.jsonl
|
|
24
108
|
* Oldest file beyond MAX_ROTATED_FILES is deleted.
|
|
@@ -52,6 +136,16 @@ function rotateIfNeeded() {
|
|
|
52
136
|
}
|
|
53
137
|
}
|
|
54
138
|
export function audit(entry) {
|
|
139
|
+
// Prefer SQLite when initialized; fall through to JSONL on failure.
|
|
140
|
+
if (sqliteBackend) {
|
|
141
|
+
try {
|
|
142
|
+
sqliteBackend.write(entry);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// fall through to JSONL so the write isn't lost
|
|
147
|
+
}
|
|
148
|
+
}
|
|
55
149
|
try {
|
|
56
150
|
if (!dirEnsured) {
|
|
57
151
|
mkdirSync(AUDIT_DIR, { recursive: true });
|
package/dist/shared/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/shared/audit.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/shared/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,12 +51,21 @@ export declare function handleError(error: unknown, options?: {
|
|
|
51
51
|
showStack?: boolean;
|
|
52
52
|
}): never | void;
|
|
53
53
|
/**
|
|
54
|
-
* Print error to stderr and exit with appropriate code
|
|
54
|
+
* Print error to stderr and exit with appropriate code.
|
|
55
|
+
*
|
|
56
|
+
* Options:
|
|
57
|
+
* - suggestion: short tip (what to do next)
|
|
58
|
+
* - searchedIn: path that was searched (for not-found cases)
|
|
59
|
+
* - docsAnchor: TROUBLESHOOTING.md anchor (e.g. 'mcp-not-found-in-marketplace').
|
|
60
|
+
* Appended as 'Docs: <url>#<anchor>' to give users a place to read more.
|
|
61
|
+
* - docsUrl: full override when the docs live elsewhere.
|
|
55
62
|
*/
|
|
56
63
|
export declare function exitWithError(message: string, options?: {
|
|
57
64
|
exitCode?: ExitCodeType;
|
|
58
65
|
suggestion?: string;
|
|
59
66
|
searchedIn?: string;
|
|
67
|
+
docsAnchor?: string;
|
|
68
|
+
docsUrl?: string;
|
|
60
69
|
logger?: Logger;
|
|
61
70
|
}): never;
|
|
62
71
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/shared/error-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;AAMxC;;;GAGG;AACH,eAAO,MAAM,QAAQ;IACnB,qCAAqC;;IAErC,gCAAgC;;IAEhC,6CAA6C;;IAE7C,sDAAsD;;IAEtD,iCAAiC;;IAEjC,kCAAkC;;IAElC,iDAAiD;;IAEjD,wBAAwB;;IAExB,sCAAsC;;CAE9B,CAAC;AAEX,KAAK,YAAY,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAM7D;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAWtD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,IAAI,MAAM,CAAC,cAAc,CAOzF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CA0C5F;AAMD;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,OAAO,EACd,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;CAChB,GACL,KAAK,GAAG,IAAI,CAsCd;
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/shared/error-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;AAMxC;;;GAGG;AACH,eAAO,MAAM,QAAQ;IACnB,qCAAqC;;IAErC,gCAAgC;;IAEhC,6CAA6C;;IAE7C,sDAAsD;;IAEtD,iCAAiC;;IAEjC,kCAAkC;;IAElC,iDAAiD;;IAEjD,wBAAwB;;IAExB,sCAAsC;;CAE9B,CAAC;AAEX,KAAK,YAAY,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAM7D;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAWtD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,IAAI,MAAM,CAAC,cAAc,CAOzF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,CA0C5F;AAMD;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,OAAO,EACd,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;CAChB,GACL,KAAK,GAAG,IAAI,CAsCd;AAQD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IACR,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,KAAK,CAqCP;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,GACb;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CA0FzD"}
|
|
@@ -127,11 +127,20 @@ export function handleError(error, options = {}) {
|
|
|
127
127
|
// ══════════════════════════════════════════════════════════════════════════════
|
|
128
128
|
// CLI ERROR UTILITIES
|
|
129
129
|
// ══════════════════════════════════════════════════════════════════════════════
|
|
130
|
+
const DOCS_BASE = 'https://github.com/portel-dev/photon/blob/main/docs/TROUBLESHOOTING.md';
|
|
130
131
|
/**
|
|
131
|
-
* Print error to stderr and exit with appropriate code
|
|
132
|
+
* Print error to stderr and exit with appropriate code.
|
|
133
|
+
*
|
|
134
|
+
* Options:
|
|
135
|
+
* - suggestion: short tip (what to do next)
|
|
136
|
+
* - searchedIn: path that was searched (for not-found cases)
|
|
137
|
+
* - docsAnchor: TROUBLESHOOTING.md anchor (e.g. 'mcp-not-found-in-marketplace').
|
|
138
|
+
* Appended as 'Docs: <url>#<anchor>' to give users a place to read more.
|
|
139
|
+
* - docsUrl: full override when the docs live elsewhere.
|
|
132
140
|
*/
|
|
133
141
|
export function exitWithError(message, options) {
|
|
134
|
-
const { exitCode = ExitCode.ERROR, suggestion, searchedIn, logger } = options || {};
|
|
142
|
+
const { exitCode = ExitCode.ERROR, suggestion, searchedIn, docsAnchor, docsUrl, logger, } = options || {};
|
|
143
|
+
const docs = docsUrl ?? (docsAnchor ? `${DOCS_BASE}#${docsAnchor}` : undefined);
|
|
135
144
|
if (logger) {
|
|
136
145
|
logger.error(message);
|
|
137
146
|
if (searchedIn) {
|
|
@@ -140,6 +149,9 @@ export function exitWithError(message, options) {
|
|
|
140
149
|
if (suggestion) {
|
|
141
150
|
logger.info(`Tip: ${suggestion}`);
|
|
142
151
|
}
|
|
152
|
+
if (docs) {
|
|
153
|
+
logger.info(`Docs: ${docs}`);
|
|
154
|
+
}
|
|
143
155
|
}
|
|
144
156
|
else {
|
|
145
157
|
console.error(`✗ ${message}`);
|
|
@@ -149,6 +161,9 @@ export function exitWithError(message, options) {
|
|
|
149
161
|
if (suggestion) {
|
|
150
162
|
console.error(` Tip: ${suggestion}`);
|
|
151
163
|
}
|
|
164
|
+
if (docs) {
|
|
165
|
+
console.error(` Docs: ${docs}`);
|
|
166
|
+
}
|
|
152
167
|
}
|
|
153
168
|
process.exit(exitCode);
|
|
154
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/shared/error-handler.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/shared/error-handler.ts"],"names":[],"mappings":"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"}
|