@nac3/forge-cli 0.2.0-alpha.59z.121 → 0.2.0-alpha.59z.158
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/dist/agents/bridge.d.ts +69 -0
- package/dist/agents/bridge.d.ts.map +1 -0
- package/dist/agents/bridge.js +295 -0
- package/dist/agents/bridge.js.map +1 -0
- package/dist/agents/cli_real.d.ts +38 -0
- package/dist/agents/cli_real.d.ts.map +1 -0
- package/dist/agents/cli_real.js +46 -0
- package/dist/agents/cli_real.js.map +1 -0
- package/dist/agents/config_schema.d.ts +1 -1
- package/dist/agents/config_schema.d.ts.map +1 -1
- package/dist/agents/config_schema.js +16 -0
- package/dist/agents/config_schema.js.map +1 -1
- package/dist/agents/defaults.d.ts.map +1 -1
- package/dist/agents/defaults.js.map +1 -1
- package/dist/agents/delegate.d.ts +36 -0
- package/dist/agents/delegate.d.ts.map +1 -0
- package/dist/agents/delegate.js +68 -0
- package/dist/agents/delegate.js.map +1 -0
- package/dist/agents/iterative_step.d.ts +95 -0
- package/dist/agents/iterative_step.d.ts.map +1 -0
- package/dist/agents/iterative_step.js +249 -0
- package/dist/agents/iterative_step.js.map +1 -0
- package/dist/agents/llm_step.d.ts +50 -0
- package/dist/agents/llm_step.d.ts.map +1 -0
- package/dist/agents/llm_step.js +28 -0
- package/dist/agents/llm_step.js.map +1 -0
- package/dist/agents/real_step_factory.d.ts +95 -0
- package/dist/agents/real_step_factory.d.ts.map +1 -0
- package/dist/agents/real_step_factory.js +51 -0
- package/dist/agents/real_step_factory.js.map +1 -0
- package/dist/agents/runner.d.ts +14 -0
- package/dist/agents/runner.d.ts.map +1 -1
- package/dist/agents/runner.js +10 -1
- package/dist/agents/runner.js.map +1 -1
- package/dist/agents/runtime.d.ts +115 -0
- package/dist/agents/runtime.d.ts.map +1 -0
- package/dist/agents/runtime.js +429 -0
- package/dist/agents/runtime.js.map +1 -0
- package/dist/agents/system_prompt.d.ts +36 -0
- package/dist/agents/system_prompt.d.ts.map +1 -0
- package/dist/agents/system_prompt.js +101 -0
- package/dist/agents/system_prompt.js.map +1 -0
- package/dist/agents/types.d.ts +12 -1
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/agents/types.js.map +1 -1
- package/dist/bin/yf.d.ts.map +1 -1
- package/dist/bin/yf.js +9 -0
- package/dist/bin/yf.js.map +1 -1
- package/dist/chat/claude_cli.d.ts +42 -0
- package/dist/chat/claude_cli.d.ts.map +1 -0
- package/dist/chat/claude_cli.js +299 -0
- package/dist/chat/claude_cli.js.map +1 -0
- package/dist/chat/graph_snapshot.d.ts +38 -0
- package/dist/chat/graph_snapshot.d.ts.map +1 -0
- package/dist/chat/graph_snapshot.js +159 -0
- package/dist/chat/graph_snapshot.js.map +1 -0
- package/dist/chat/ingest_session.d.ts +24 -4
- package/dist/chat/ingest_session.d.ts.map +1 -1
- package/dist/chat/ingest_session.js +139 -4
- package/dist/chat/ingest_session.js.map +1 -1
- package/dist/chat/panel.d.ts.map +1 -1
- package/dist/chat/panel.js +1358 -0
- package/dist/chat/panel.js.map +1 -1
- package/dist/chat/server.d.ts +21 -0
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +904 -4
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/tools/nac3_invoke.d.ts +5 -0
- package/dist/chat/tools/nac3_invoke.d.ts.map +1 -1
- package/dist/chat/tools/nac3_invoke.js +1 -0
- package/dist/chat/tools/nac3_invoke.js.map +1 -1
- package/dist/chat/tools.d.ts.map +1 -1
- package/dist/chat/tools.js +12 -0
- package/dist/chat/tools.js.map +1 -1
- package/dist/commands/agent.d.ts +12 -1
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +92 -1
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/chat.d.ts +10 -0
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +12 -1
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/director.d.ts +37 -0
- package/dist/commands/director.d.ts.map +1 -0
- package/dist/commands/director.js +290 -0
- package/dist/commands/director.js.map +1 -0
- package/dist/commands/keys_setup.d.ts +1 -0
- package/dist/commands/keys_setup.d.ts.map +1 -1
- package/dist/commands/keys_setup.js +61 -11
- package/dist/commands/keys_setup.js.map +1 -1
- package/dist/core/pilot_setup.d.ts +14 -1
- package/dist/core/pilot_setup.d.ts.map +1 -1
- package/dist/core/pilot_setup.js +62 -1
- package/dist/core/pilot_setup.js.map +1 -1
- package/dist/core/provider_keys.d.ts.map +1 -1
- package/dist/core/provider_keys.js +12 -5
- package/dist/core/provider_keys.js.map +1 -1
- package/dist/design/yujin_design_resolver.d.ts +77 -0
- package/dist/design/yujin_design_resolver.d.ts.map +1 -0
- package/dist/design/yujin_design_resolver.js +113 -0
- package/dist/design/yujin_design_resolver.js.map +1 -0
- package/dist/docs/doctrine/default-design-system.md +120 -0
- package/dist/docs/doctrine/language-sovereignty.md +143 -0
- package/dist/docs/doctrine/testing-policy.md +211 -0
- package/dist/nac3/approval_queue.d.ts +8 -0
- package/dist/nac3/approval_queue.d.ts.map +1 -1
- package/dist/nac3/approval_queue.js.map +1 -1
- package/dist/nac3/internal_manifest.d.ts.map +1 -1
- package/dist/nac3/internal_manifest.js +178 -0
- package/dist/nac3/internal_manifest.js.map +1 -1
- package/dist/office/excel.d.ts +22 -0
- package/dist/office/excel.d.ts.map +1 -1
- package/dist/office/excel.js +82 -0
- package/dist/office/excel.js.map +1 -1
- package/dist/qa/brain_matrix/fixtures/scenario_a11y_focus_after_open.json +22 -0
- package/dist/qa/brain_matrix/fixtures/scenario_a11y_label_unlabeled_button.json +26 -0
- package/dist/qa/brain_matrix/fixtures/scenario_agent_director_consults_workflow_before_dispatch.json +42 -0
- package/dist/qa/brain_matrix/fixtures/scenario_analyst_extracts_then_returns.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_coder_consults_nac_spec_before_writing.json +28 -0
- package/dist/qa/brain_matrix/fixtures/scenario_default_design_system_override_shadcn.json +45 -0
- package/dist/qa/brain_matrix/fixtures/scenario_default_design_system_use_card_template.json +44 -0
- package/dist/qa/brain_matrix/fixtures/scenario_director_delegates_to_analyst.json +26 -0
- package/dist/qa/brain_matrix/fixtures/scenario_director_no_self_delegation.json +20 -0
- package/dist/qa/brain_matrix/fixtures/scenario_director_terminal_done_marker.json +19 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_default_design_system.json +50 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_language_sovereignty.json +53 -0
- package/dist/qa/brain_matrix/fixtures/scenario_doctrine_discover_testing_policy.json +55 -0
- package/dist/qa/brain_matrix/fixtures/scenario_language_sovereignty_not_conducive_spa_python.json +61 -0
- package/dist/qa/brain_matrix/fixtures/scenario_language_sovereignty_user_picks_python.json +48 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_destructive_pauses_for_r8.json +42 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_happy_path_writes_pizarron.json +76 -0
- package/dist/qa/brain_matrix/fixtures/scenario_mcp_invoke_network_timeout_graceful.json +41 -0
- package/dist/qa/brain_matrix/fixtures/scenario_no_hardcoded_color_use_token.json +47 -0
- package/dist/qa/brain_matrix/fixtures/scenario_office_excel_update_cell_picks_right_verb.json +26 -0
- package/dist/qa/brain_matrix/fixtures/scenario_scaffolder_destructive_pauses_for_approval.json +23 -0
- package/dist/qa/brain_matrix/fixtures/scenario_sumie_icon_pick_from_catalog.json +56 -0
- package/dist/qa/brain_matrix/fixtures/scenario_tester_uses_shell_exec_only.json +27 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/workflow/graph.d.ts +59 -0
- package/dist/workflow/graph.d.ts.map +1 -0
- package/dist/workflow/graph.js +137 -0
- package/dist/workflow/graph.js.map +1 -0
- package/dist/workflow/state.d.ts +34 -0
- package/dist/workflow/state.d.ts.map +1 -1
- package/dist/workflow/state.js.map +1 -1
- package/docs/doctrine/default-design-system.md +120 -0
- package/docs/doctrine/language-sovereignty.md +143 -0
- package/docs/doctrine/testing-policy.md +211 -0
- package/package.json +102 -100
- package/src/i18n/catalogs/ar.json +20 -1
- package/src/i18n/catalogs/de.json +20 -1
- package/src/i18n/catalogs/en.json +20 -21
- package/src/i18n/catalogs/es.json +20 -21
- package/src/i18n/catalogs/fr.json +20 -1
- package/src/i18n/catalogs/hi.json +20 -1
- package/src/i18n/catalogs/it.json +20 -1
- package/src/i18n/catalogs/ja.json +20 -1
- package/src/i18n/catalogs/pt.json +20 -1
- package/src/i18n/catalogs/zh.json +20 -1
- package/templates/sumi-context.template.md +57 -0
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Spec ingest sessions (V1.40 of HITO 1).
|
|
2
|
+
* Spec ingest sessions (V1.40 of HITO 1 + Director sprint slice 9).
|
|
3
3
|
*
|
|
4
4
|
* Holds the NormalisedDocument + flattened-text + extracted
|
|
5
5
|
* structure for every spec the user has dropped on the chat
|
|
6
|
-
* panel.
|
|
7
|
-
* it is not persisted because the user has not yet approved
|
|
8
|
-
* scaffolding (V1.42).
|
|
6
|
+
* panel.
|
|
9
7
|
*
|
|
10
8
|
* Module-scope so V1.38 ingest, V1.40 extract, V1.41 plan,
|
|
11
9
|
* V1.42 approval, V1.43 scaffold can all see the same doc
|
|
12
10
|
* without threading state through the HTTP layer.
|
|
13
11
|
*
|
|
12
|
+
* Persistence (slice 9): every mutation flushes the affected
|
|
13
|
+
* session to ~/.yujin-forge/ingest/<project_slug>/<doc_id>.json.
|
|
14
|
+
* On boot the chat server calls loadProjectIngests(slug) to
|
|
15
|
+
* hydrate the in-memory map. This fixes the HITO 4 bug where
|
|
16
|
+
* extract+plan didn't survive a server restart.
|
|
17
|
+
*
|
|
18
|
+
* Back-compat: when the project slug is null (legacy callers,
|
|
19
|
+
* unit tests that did not set one), persistence is skipped --
|
|
20
|
+
* the module still works as a pure in-memory cache.
|
|
21
|
+
*
|
|
14
22
|
* ASCII-only.
|
|
15
23
|
*/
|
|
16
24
|
import type { NormalisedDocument } from '../reader/types.js';
|
|
@@ -72,6 +80,18 @@ export interface IngestSession {
|
|
|
72
80
|
* chars at ~4 chars/token = ~16K tokens, comfortably under
|
|
73
81
|
* Claude's input budget for the extraction call. */
|
|
74
82
|
export declare const FLATTEN_MAX_CHARS: number;
|
|
83
|
+
export declare function setProjectSlugForIngest(slug: string | null): void;
|
|
84
|
+
export declare function ingestStoreRoot(): string;
|
|
85
|
+
/** Wait for every queued persist to settle. The chat server calls
|
|
86
|
+
* this from close() so that test teardowns (which fs.rm the home
|
|
87
|
+
* directory immediately after close) do not race with in-flight
|
|
88
|
+
* fire-and-forget writes. */
|
|
89
|
+
export declare function flushPendingIngestWrites(): Promise<void>;
|
|
90
|
+
/** Hydrate SESSIONS from disk for `<project_slug>`. Idempotent;
|
|
91
|
+
* safe to call multiple times. Existing in-memory entries with
|
|
92
|
+
* the same doc_id are overwritten by the disk copy (disk is the
|
|
93
|
+
* source of truth across restarts). */
|
|
94
|
+
export declare function loadProjectIngests(slug: string): Promise<void>;
|
|
75
95
|
/** Build the flattened-text view of a NormalisedDocument. */
|
|
76
96
|
export declare function flattenDocument(doc: NormalisedDocument): {
|
|
77
97
|
text: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest_session.d.ts","sourceRoot":"","sources":["../../src/chat/ingest_session.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ingest_session.d.ts","sourceRoot":"","sources":["../../src/chat/ingest_session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb;iCAC6B;IAC7B,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;CAC9C;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB;qBACiB;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,oBAAoB,EAAE,CAAC;IACrC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC;sBACkB;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,kBAAkB,CAAC;IACxB;;;oDAGgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB;;wCAEoC;IACpC,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,6DAA6D;IAC7D,IAAI,CAAC,EAAE,OAAO,gBAAgB,EAAE,QAAQ,CAAC;IACzC,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,oBAAoB,EAAE,cAAc,CAAC;IACvD,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;qDAEqD;AACrD,eAAO,MAAM,iBAAiB,QAAY,CAAC;AAU3C,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAEjE;AAED,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAsED;;;8BAG8B;AAC9B,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC,CAG9D;AAED;;;wCAGwC;AACxC,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBpE;AAGD,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,GAAG,EAAE,kBAAkB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAqB7F;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,kBAAkB,GAAG,aAAa,CAWnE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAE7D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,GAAG,IAAI,CAK7E;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,gBAAgB,EAAE,QAAQ,GAAG,IAAI,CAKpF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,oBAAoB,EAAE,cAAc,GAAG,IAAI,CAKpG;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAKjD;AAED,wBAAgB,UAAU,IAAI;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,EAAE,CAUxK;AAED,iBAAiB;AACjB,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|
|
@@ -1,23 +1,153 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Spec ingest sessions (V1.40 of HITO 1).
|
|
2
|
+
* Spec ingest sessions (V1.40 of HITO 1 + Director sprint slice 9).
|
|
3
3
|
*
|
|
4
4
|
* Holds the NormalisedDocument + flattened-text + extracted
|
|
5
5
|
* structure for every spec the user has dropped on the chat
|
|
6
|
-
* panel.
|
|
7
|
-
* it is not persisted because the user has not yet approved
|
|
8
|
-
* scaffolding (V1.42).
|
|
6
|
+
* panel.
|
|
9
7
|
*
|
|
10
8
|
* Module-scope so V1.38 ingest, V1.40 extract, V1.41 plan,
|
|
11
9
|
* V1.42 approval, V1.43 scaffold can all see the same doc
|
|
12
10
|
* without threading state through the HTTP layer.
|
|
13
11
|
*
|
|
12
|
+
* Persistence (slice 9): every mutation flushes the affected
|
|
13
|
+
* session to ~/.yujin-forge/ingest/<project_slug>/<doc_id>.json.
|
|
14
|
+
* On boot the chat server calls loadProjectIngests(slug) to
|
|
15
|
+
* hydrate the in-memory map. This fixes the HITO 4 bug where
|
|
16
|
+
* extract+plan didn't survive a server restart.
|
|
17
|
+
*
|
|
18
|
+
* Back-compat: when the project slug is null (legacy callers,
|
|
19
|
+
* unit tests that did not set one), persistence is skipped --
|
|
20
|
+
* the module still works as a pure in-memory cache.
|
|
21
|
+
*
|
|
14
22
|
* ASCII-only.
|
|
15
23
|
*/
|
|
24
|
+
import { promises as fs } from 'node:fs';
|
|
25
|
+
import path from 'node:path';
|
|
26
|
+
import os from 'node:os';
|
|
16
27
|
/** Hard cap on the flattened text we feed to Claude. ~64K
|
|
17
28
|
* chars at ~4 chars/token = ~16K tokens, comfortably under
|
|
18
29
|
* Claude's input budget for the extraction call. */
|
|
19
30
|
export const FLATTEN_MAX_CHARS = 64 * 1024;
|
|
20
31
|
const SESSIONS = new Map();
|
|
32
|
+
/* ============================================================
|
|
33
|
+
* Slice 9 -- disk persistence layer.
|
|
34
|
+
* ============================================================ */
|
|
35
|
+
let activeProjectSlug = null;
|
|
36
|
+
export function setProjectSlugForIngest(slug) {
|
|
37
|
+
activeProjectSlug = slug;
|
|
38
|
+
}
|
|
39
|
+
export function ingestStoreRoot() {
|
|
40
|
+
const home = process.env.HOME || process.env.USERPROFILE || os.homedir();
|
|
41
|
+
return path.join(home, '.yujin-forge', 'ingest');
|
|
42
|
+
}
|
|
43
|
+
function projectDir() {
|
|
44
|
+
if (!activeProjectSlug)
|
|
45
|
+
return null;
|
|
46
|
+
return path.join(ingestStoreRoot(), activeProjectSlug);
|
|
47
|
+
}
|
|
48
|
+
function sessionFile(docId) {
|
|
49
|
+
const dir = projectDir();
|
|
50
|
+
if (!dir)
|
|
51
|
+
return null;
|
|
52
|
+
/* doc_id is path-friendly per NormalisedDocument contract. */
|
|
53
|
+
return path.join(dir, docId + '.json');
|
|
54
|
+
}
|
|
55
|
+
function serialiseSession(s) {
|
|
56
|
+
/* Strip undefined fields so the JSON round-trip is symmetric --
|
|
57
|
+
* absent fields stay absent in the deserialised object. */
|
|
58
|
+
const clean = {
|
|
59
|
+
doc_id: s.doc_id,
|
|
60
|
+
doc: s.doc,
|
|
61
|
+
flat_text: s.flat_text,
|
|
62
|
+
ingested_at: s.ingested_at,
|
|
63
|
+
};
|
|
64
|
+
if (s.extraction)
|
|
65
|
+
clean.extraction = s.extraction;
|
|
66
|
+
if (s.plan)
|
|
67
|
+
clean.plan = s.plan;
|
|
68
|
+
if (s.scaffold)
|
|
69
|
+
clean.scaffold = s.scaffold;
|
|
70
|
+
return JSON.stringify(clean, null, 2);
|
|
71
|
+
}
|
|
72
|
+
async function persistSession(s) {
|
|
73
|
+
const file = sessionFile(s.doc_id);
|
|
74
|
+
if (!file)
|
|
75
|
+
return;
|
|
76
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
77
|
+
const tmp = file + '.tmp';
|
|
78
|
+
await fs.writeFile(tmp, serialiseSession(s), 'utf-8');
|
|
79
|
+
await fs.rename(tmp, file);
|
|
80
|
+
}
|
|
81
|
+
/** Per-doc serialisation: two rapid mutations on the same session
|
|
82
|
+
* must not race on the same file, otherwise the last write to
|
|
83
|
+
* arrive at disk may NOT reflect the last mutation in code (e.g.
|
|
84
|
+
* setScaffold + clearScaffold in quick succession leaving the
|
|
85
|
+
* scaffold field still present). We chain each new persist on the
|
|
86
|
+
* pending Promise for that doc_id. */
|
|
87
|
+
const PENDING_WRITES = new Map();
|
|
88
|
+
/** Best-effort, per-doc-serialised flush. The flow that triggered
|
|
89
|
+
* the mutation does not block on disk IO; we capture errors
|
|
90
|
+
* to console.error so a broken filesystem surfaces without
|
|
91
|
+
* crashing the chat server. */
|
|
92
|
+
function persistAsync(s) {
|
|
93
|
+
const prev = PENDING_WRITES.get(s.doc_id) || Promise.resolve();
|
|
94
|
+
/* Snapshot the session at enqueue time so the chained write
|
|
95
|
+
* reflects the state at the moment the mutator was called,
|
|
96
|
+
* not whatever the in-memory object has drifted to by then. */
|
|
97
|
+
const snapshot = JSON.parse(serialiseSession(s));
|
|
98
|
+
const next = prev.then(() => persistSession(snapshot)).catch((err) => {
|
|
99
|
+
try {
|
|
100
|
+
console.error('ingest_session: persist failed for ' + s.doc_id + ': '
|
|
101
|
+
+ (err instanceof Error ? err.message : String(err)));
|
|
102
|
+
}
|
|
103
|
+
catch { /* console may be redirected -- swallow */ }
|
|
104
|
+
});
|
|
105
|
+
PENDING_WRITES.set(s.doc_id, next);
|
|
106
|
+
/* Garbage-collect entries that have fully settled, so the map
|
|
107
|
+
* does not grow unbounded over a long-lived chat server run. */
|
|
108
|
+
next.finally(() => {
|
|
109
|
+
if (PENDING_WRITES.get(s.doc_id) === next)
|
|
110
|
+
PENDING_WRITES.delete(s.doc_id);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/** Wait for every queued persist to settle. The chat server calls
|
|
114
|
+
* this from close() so that test teardowns (which fs.rm the home
|
|
115
|
+
* directory immediately after close) do not race with in-flight
|
|
116
|
+
* fire-and-forget writes. */
|
|
117
|
+
export async function flushPendingIngestWrites() {
|
|
118
|
+
const pendings = Array.from(PENDING_WRITES.values());
|
|
119
|
+
await Promise.allSettled(pendings);
|
|
120
|
+
}
|
|
121
|
+
/** Hydrate SESSIONS from disk for `<project_slug>`. Idempotent;
|
|
122
|
+
* safe to call multiple times. Existing in-memory entries with
|
|
123
|
+
* the same doc_id are overwritten by the disk copy (disk is the
|
|
124
|
+
* source of truth across restarts). */
|
|
125
|
+
export async function loadProjectIngests(slug) {
|
|
126
|
+
const dir = path.join(ingestStoreRoot(), slug);
|
|
127
|
+
let files;
|
|
128
|
+
try {
|
|
129
|
+
files = await fs.readdir(dir);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
if (err.code === 'ENOENT')
|
|
133
|
+
return;
|
|
134
|
+
throw err;
|
|
135
|
+
}
|
|
136
|
+
for (const f of files) {
|
|
137
|
+
if (!f.endsWith('.json'))
|
|
138
|
+
continue;
|
|
139
|
+
try {
|
|
140
|
+
const raw = await fs.readFile(path.join(dir, f), 'utf-8');
|
|
141
|
+
const parsed = JSON.parse(raw);
|
|
142
|
+
if (parsed && typeof parsed.doc_id === 'string') {
|
|
143
|
+
SESSIONS.set(parsed.doc_id, parsed);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
/* Skip un-parseable file; do not abort the whole load. */
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
21
151
|
/** Build the flattened-text view of a NormalisedDocument. */
|
|
22
152
|
export function flattenDocument(doc) {
|
|
23
153
|
const parts = [];
|
|
@@ -52,6 +182,7 @@ export function recordIngest(doc) {
|
|
|
52
182
|
ingested_at: new Date().toISOString(),
|
|
53
183
|
};
|
|
54
184
|
SESSIONS.set(doc.id, session);
|
|
185
|
+
persistAsync(session);
|
|
55
186
|
return session;
|
|
56
187
|
}
|
|
57
188
|
export function getIngest(docId) {
|
|
@@ -62,24 +193,28 @@ export function setExtraction(docId, extraction) {
|
|
|
62
193
|
if (!s)
|
|
63
194
|
throw new Error('ingest_session: no session for ' + docId);
|
|
64
195
|
s.extraction = extraction;
|
|
196
|
+
persistAsync(s);
|
|
65
197
|
}
|
|
66
198
|
export function setPlan(docId, plan) {
|
|
67
199
|
const s = SESSIONS.get(docId);
|
|
68
200
|
if (!s)
|
|
69
201
|
throw new Error('ingest_session: no session for ' + docId);
|
|
70
202
|
s.plan = plan;
|
|
203
|
+
persistAsync(s);
|
|
71
204
|
}
|
|
72
205
|
export function setScaffold(docId, report) {
|
|
73
206
|
const s = SESSIONS.get(docId);
|
|
74
207
|
if (!s)
|
|
75
208
|
throw new Error('ingest_session: no session for ' + docId);
|
|
76
209
|
s.scaffold = report;
|
|
210
|
+
persistAsync(s);
|
|
77
211
|
}
|
|
78
212
|
export function clearScaffold(docId) {
|
|
79
213
|
const s = SESSIONS.get(docId);
|
|
80
214
|
if (!s)
|
|
81
215
|
throw new Error('ingest_session: no session for ' + docId);
|
|
82
216
|
delete s.scaffold;
|
|
217
|
+
persistAsync(s);
|
|
83
218
|
}
|
|
84
219
|
export function listIngest() {
|
|
85
220
|
return Array.from(SESSIONS.values()).map((s) => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ingest_session.js","sourceRoot":"","sources":["../../src/chat/ingest_session.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ingest_session.js","sourceRoot":"","sources":["../../src/chat/ingest_session.ts"],"names":[],"mappings":"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"}
|
package/dist/chat/panel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;2BAKuB;IACvB,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/chat/panel.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,iBAAiB,EAEvB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb;;;;;2BAKuB;IACvB,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAsjOxD"}
|