@mindflight/mindbrain-personal-studio 0.6.1 → 0.6.3
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 +16 -8
- package/build/client/_app/immutable/chunks/CIErFlYG.js +1 -0
- package/build/client/_app/immutable/chunks/CIErFlYG.js.br +0 -0
- package/build/client/_app/immutable/chunks/CIErFlYG.js.gz +0 -0
- package/build/client/_app/immutable/entry/{app.CVz6aYsT.js → app.mURYm8o_.js} +2 -2
- package/build/client/_app/immutable/entry/app.mURYm8o_.js.br +0 -0
- package/build/client/_app/immutable/entry/app.mURYm8o_.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.D4M9ZeGO.js +1 -0
- package/build/client/_app/immutable/entry/start.D4M9ZeGO.js.br +2 -0
- package/build/client/_app/immutable/entry/start.D4M9ZeGO.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{1.BBtxY46Q.js → 1.DHKtMeFI.js} +1 -1
- package/build/client/_app/immutable/nodes/1.DHKtMeFI.js.br +1 -0
- package/build/client/_app/immutable/nodes/1.DHKtMeFI.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/handler.js +4 -4
- package/build/index.js +4 -4
- package/build/server/chunks/chunks/{internal.js-D8EA_he2.js → internal.js-C3tV0XXj.js} +2 -2
- package/build/server/chunks/chunks/{internal.js-D8EA_he2.js.map → internal.js-C3tV0XXj.js.map} +1 -1
- package/build/server/chunks/entries/endpoints/api/graph/schema-registry/{_server.ts.js-Dyfsc-VA.js → _server.ts.js-CAsXxBRq.js} +7 -2
- package/build/server/chunks/entries/endpoints/api/graph/schema-registry/_server.ts.js-CAsXxBRq.js.map +1 -0
- package/build/server/chunks/{handler-BjXBCd1c.js → handler-DlaCCnxx.js} +3 -3
- package/build/server/chunks/{handler-BjXBCd1c.js.map → handler-DlaCCnxx.js.map} +1 -1
- package/build/server/chunks/{index.js-BJYcV8V7.js → index.js-BGfKWHak.js} +2 -2
- package/build/server/chunks/{index.js-BJYcV8V7.js.map → index.js-BGfKWHak.js.map} +1 -1
- package/build/server/chunks/{manifest.js-Ddaot0P4.js → manifest.js-CnmaNf5D.js} +4 -4
- package/build/server/chunks/{manifest.js-Ddaot0P4.js.map → manifest.js-CnmaNf5D.js.map} +1 -1
- package/build/server/chunks/nodes/{1.js-BRigw_9J.js → 1.js-BypjwBYB.js} +2 -2
- package/build/server/chunks/nodes/{1.js-BRigw_9J.js.map → 1.js-BypjwBYB.js.map} +1 -1
- package/examples/immeuble/ACCEPTANCE.yaml +82 -0
- package/examples/immeuble/BIM_LITE.md +15 -0
- package/examples/immeuble/CHECKLIST.md +128 -0
- package/examples/immeuble/README.md +121 -0
- package/examples/immeuble/bundle/immeuble.bundle.json +22786 -0
- package/examples/immeuble/contracts/answer_artifacts.seed.jsonl +34 -0
- package/examples/immeuble/contracts/business_capabilities.seed.jsonl +25 -0
- package/examples/immeuble/contracts/consumer_contract.yaml +131 -0
- package/examples/immeuble/contracts/immeuble_structured_import_model.json +310 -0
- package/examples/immeuble/contracts/mapping_external_to_canonical.json +375 -0
- package/examples/immeuble/contracts/mapping_external_to_canonical.yaml +55 -0
- package/examples/immeuble/contracts/mapping_external_to_canonical_ws.json +65 -0
- package/examples/immeuble/contracts/model_contract.json +943 -0
- package/examples/immeuble/contracts/projection_catalog.yaml +366 -0
- package/examples/immeuble/contracts/scenarios.yaml +27 -0
- package/examples/immeuble/contracts/semantic_proposal.golden.json +1 -0
- package/examples/immeuble/contracts/source_profile.yaml +38 -0
- package/examples/immeuble/fake_data/DeltaFinding.csv +20 -0
- package/examples/immeuble/fake_data/ProjectionResult.csv +13 -0
- package/examples/immeuble/fake_data/ag_meeting.csv +4 -0
- package/examples/immeuble/fake_data/agenda_item.csv +4 -0
- package/examples/immeuble/fake_data/architect.csv +3 -0
- package/examples/immeuble/fake_data/architecture_firm.csv +2 -0
- package/examples/immeuble/fake_data/bank_account.csv +3 -0
- package/examples/immeuble/fake_data/billing_group.csv +41 -0
- package/examples/immeuble/fake_data/block.csv +10 -0
- package/examples/immeuble/fake_data/budget_line.csv +3 -0
- package/examples/immeuble/fake_data/building.csv +6 -0
- package/examples/immeuble/fake_data/cellar.csv +41 -0
- package/examples/immeuble/fake_data/change_order.csv +2 -0
- package/examples/immeuble/fake_data/charge_call.csv +58 -0
- package/examples/immeuble/fake_data/claim.csv +4 -0
- package/examples/immeuble/fake_data/coda_entry.csv +49 -0
- package/examples/immeuble/fake_data/compliance_certificate.csv +10 -0
- package/examples/immeuble/fake_data/contractor.csv +4 -0
- package/examples/immeuble/fake_data/decision.csv +5 -0
- package/examples/immeuble/fake_data/defect_reserve.csv +3 -0
- package/examples/immeuble/fake_data/household.csv +41 -0
- package/examples/immeuble/fake_data/inspection.csv +3 -0
- package/examples/immeuble/fake_data/insurance_policy.csv +4 -0
- package/examples/immeuble/fake_data/intervention.csv +13 -0
- package/examples/immeuble/fake_data/invoice.csv +3 -0
- package/examples/immeuble/fake_data/lease_contract.csv +12 -0
- package/examples/immeuble/fake_data/maintenance_ticket.csv +13 -0
- package/examples/immeuble/fake_data/meter.csv +4 -0
- package/examples/immeuble/fake_data/meter_reading.csv +19 -0
- package/examples/immeuble/fake_data/milestone.csv +3 -0
- package/examples/immeuble/fake_data/organization.csv +12 -0
- package/examples/immeuble/fake_data/parking_space.csv +8 -0
- package/examples/immeuble/fake_data/permit.csv +3 -0
- package/examples/immeuble/fake_data/person.csv +85 -0
- package/examples/immeuble/fake_data/private_garden.csv +7 -0
- package/examples/immeuble/fake_data/progress_event.csv +2 -0
- package/examples/immeuble/fake_data/quote.csv +3 -0
- package/examples/immeuble/fake_data/receipt.csv +2 -0
- package/examples/immeuble/fake_data/reminder.csv +11 -0
- package/examples/immeuble/fake_data/service_contract.csv +4 -0
- package/examples/immeuble/fake_data/shared_equipment.csv +8 -0
- package/examples/immeuble/fake_data/shared_space.csv +10 -0
- package/examples/immeuble/fake_data/unit.csv +41 -0
- package/examples/immeuble/fake_data/work_package.csv +4 -0
- package/examples/immeuble/fake_data/worksite_project.csv +3 -0
- package/examples/immeuble/gap-rules/L0-patrimoine.json +57 -0
- package/examples/immeuble/gap-rules/L1-syndic-naive.json +36 -0
- package/examples/immeuble/gap-rules/L1-syndic.json +61 -0
- package/examples/immeuble/gap-rules/L2-chantier.json +87 -0
- package/examples/immeuble/gap-rules/L2-exploitation.json +87 -0
- package/examples/immeuble/gap-rules/L2-finance.json +48 -0
- package/examples/immeuble/gap-rules/L2-maintenance.json +107 -0
- package/examples/immeuble/gap-rules/L2-syndic-filtered.json +39 -0
- package/examples/immeuble/gap-rules/L3-full.json +332 -0
- package/examples/immeuble/gap-rules/closed-world-contract.md +76 -0
- package/examples/immeuble/gap-rules/demo.json +51 -0
- package/examples/immeuble/gap-rules/expected-findings.yaml +100 -0
- package/examples/immeuble/gap-rules/gap-scenarios.yaml +79 -0
- package/examples/immeuble/gap-rules/motifs.json +38 -0
- package/examples/immeuble/gap-rules/syndic.json +40 -0
- package/examples/immeuble/import_manifest.yaml +25 -0
- package/examples/immeuble/import_ready/graph_edges_import.csv +848 -0
- package/examples/immeuble/import_ready/mfo_facets_import.csv +559 -0
- package/examples/immeuble/index.md +140 -0
- package/examples/immeuble/model/immeuble_model.json +418 -0
- package/examples/immeuble/reports/01-model.validation.json +56 -0
- package/examples/immeuble/reports/02-mapping.validation.json +9 -0
- package/examples/immeuble/reports/acceptance.validation.json +161 -0
- package/examples/immeuble/reports/consumer_contract.validation.json +162 -0
- package/examples/immeuble/reports/graph_edges.jsonl +847 -0
- package/examples/immeuble/reports/graph_nodes.jsonl +558 -0
- package/examples/immeuble/reports/hybrid-compare.json +144 -0
- package/examples/immeuble/reports/immeuble-import-scenario.json +233 -0
- package/examples/immeuble/reports/live-artifacts-refresh.validation.json +51 -0
- package/examples/immeuble/reports/pipeline_audit.json +59 -0
- package/examples/immeuble/reports/projection_audit.json +69 -0
- package/examples/immeuble/reports/projection_audit_immeuble.json +257 -0
- package/examples/immeuble/reports/projection_audit_immeuble.md +122 -0
- package/examples/immeuble/reports/projection_candidates.json +1596 -0
- package/examples/immeuble/reports/projection_candidates.md +117 -0
- package/examples/immeuble/reports/projection_model_validation.md +115 -0
- package/examples/immeuble/reports/reindex.json +4 -0
- package/examples/immeuble/reports/reset-immeuble-workspace.json +32 -0
- package/examples/immeuble/reports/schema-id-prefix-check.json +5 -0
- package/examples/immeuble/scripts/audit-immeuble-projections.mjs +254 -0
- package/examples/immeuble/scripts/build-immeuble-model.mjs +308 -0
- package/examples/immeuble/scripts/compare-immeuble-snapshots.sh +227 -0
- package/examples/immeuble/scripts/enrich-immeuble-demo.mjs +1135 -0
- package/examples/immeuble/scripts/reset-immeuble-workspace.mjs +139 -0
- package/examples/immeuble/scripts/run-immeuble-backend.sh +164 -0
- package/examples/immeuble/scripts/run-immeuble-import.mjs +232 -0
- package/examples/immeuble/scripts/run-immeuble-live-lab.sh +439 -0
- package/examples/immeuble/scripts/seed-immeuble-gap-rules.mjs +69 -0
- package/examples/immeuble/scripts/start-immeuble-demo.sh +52 -0
- package/examples/immeuble/scripts/starterkit/analysis-lenses.mjs +181 -0
- package/examples/immeuble/scripts/starterkit/analyze-projection-candidates.mjs +714 -0
- package/examples/immeuble/scripts/starterkit/audit-ghostcrab-projections.mjs +674 -0
- package/examples/immeuble/scripts/starterkit/facet-prefix.mjs +166 -0
- package/examples/immeuble/scripts/starterkit/sqlite-utils.mjs +131 -0
- package/examples/immeuble/scripts/verify-immeuble-acceptance.mjs +284 -0
- package/examples/immeuble/scripts/verify-immeuble-live-artifacts.mjs +140 -0
- package/examples/immeuble/scripts/yaml-lite.mjs +96 -0
- package/examples/immeuble/sources/agent-prompts/prompts/00-prerequisites-immo-mcp.md +161 -0
- package/examples/immeuble/sources/agent-prompts/prompts/00-prerequisites.md +39 -0
- package/examples/immeuble/sources/agent-prompts/prompts/01-discovery-and-model-proposal.md +42 -0
- package/examples/immeuble/sources/agent-prompts/prompts/02-ontology-register.md +44 -0
- package/examples/immeuble/sources/agent-prompts/prompts/03-gap-rules-design.md +44 -0
- package/examples/immeuble/sources/agent-prompts/prompts/04-document-ingest.md +40 -0
- package/examples/immeuble/sources/agent-prompts/prompts/05-graph-extraction.md +44 -0
- package/examples/immeuble/sources/agent-prompts/prompts/06-validate-and-compare-immo-mcp.md +109 -0
- package/examples/immeuble/sources/agent-prompts/prompts/06-validate-and-compare-test-immo-mcp3.md +30 -0
- package/examples/immeuble/sources/agent-prompts/prompts/06-validate-and-compare.md +63 -0
- package/examples/immeuble/sources/checklists/gap-rules-checklist.md +42 -0
- package/examples/immeuble/sources/checklists/ontology-checklist.md +54 -0
- package/examples/immeuble/sources/documents/README.md +42 -0
- package/examples/immeuble/sources/documents/annexes-caves-garages-jardins.md +8 -0
- package/examples/immeuble/sources/documents/annexes-jardins-garages.md +1 -0
- package/examples/immeuble/sources/documents/baux-erables.md +1 -0
- package/examples/immeuble/sources/documents/baux-locatifs.md +11 -0
- package/examples/immeuble/sources/documents/coda-janvier-2026.md +10 -0
- package/examples/immeuble/sources/documents/composition-menages.md +1 -0
- package/examples/immeuble/sources/documents/composition-occupants.md +18 -0
- package/examples/immeuble/sources/documents/expected-coverage.json +70 -0
- package/examples/immeuble/sources/documents/extrait-coda-janvier-2026.md +1 -0
- package/examples/immeuble/sources/documents/groupes-facturation.md +30 -0
- package/examples/immeuble/sources/documents/manifest.json +79 -0
- package/examples/immeuble/sources/documents/note-architecte-chantier-erables.md +3 -0
- package/examples/immeuble/sources/documents/permis-urbanisme-erables.md +3 -0
- package/examples/immeuble/sources/documents/procedures-operationnelles.md +3 -0
- package/examples/immeuble/sources/documents/pv-ag-budget-2026.md +1 -0
- package/examples/immeuble/sources/documents/pv-reception-reserves-erables.md +3 -0
- package/examples/immeuble/sources/documents/registre-coproprietaires.md +24 -0
- package/examples/immeuble/sources/documents/reglement-copropriete-tilleuls.md +1 -0
- package/examples/immeuble/sources/documents/statuts-erables.md +22 -0
- package/examples/immeuble/sources/documents/statuts-tilleuls.md +19 -0
- package/examples/immeuble/sources/documents/succession-jean-dupont.md +3 -0
- package/examples/immeuble/sources/documents/titre-propriete-tilleuls-a3.md +1 -0
- package/examples/immeuble/sources/documents/trous-pedagogiques.md +3 -0
- package/examples/immeuble/sources/ontology/README.md +1 -0
- package/examples/immeuble/sources/ontology/core.yaml +444 -0
- package/examples/immeuble/success-criteria.yaml +35 -0
- package/fixtures/immeuble-demo.sqlite +0 -0
- package/package.json +16 -3
- package/scripts/lib/sqlite-runtime.mjs +1 -1
- package/scripts/load-immeuble-demo.sh +103 -0
- package/scripts/seed-immeuble-projections.mjs +75 -148
- package/scripts/verify-immeuble-demo-sources.mjs +93 -0
- package/scripts/verify-immeuble-demo.mjs +69 -0
- package/build/client/_app/immutable/chunks/BmeSanva.js +0 -1
- package/build/client/_app/immutable/chunks/BmeSanva.js.br +0 -0
- package/build/client/_app/immutable/chunks/BmeSanva.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.CVz6aYsT.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CVz6aYsT.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.Bt5tVOz8.js +0 -1
- package/build/client/_app/immutable/entry/start.Bt5tVOz8.js.br +0 -2
- package/build/client/_app/immutable/entry/start.Bt5tVOz8.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.BBtxY46Q.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.BBtxY46Q.js.gz +0 -0
- package/build/server/chunks/entries/endpoints/api/graph/schema-registry/_server.ts.js-Dyfsc-VA.js.map +0 -1
- package/scripts/build-serenity-v6-concept-review-pack.mjs +0 -493
- package/scripts/build-serenity-v6-review-pack.mjs +0 -479
- package/scripts/create-serenity-production-v6.mjs +0 -627
- package/scripts/export-serenity-v6-backup.mjs +0 -178
- package/scripts/import-serenity-v6-user-decisions.mjs +0 -543
- package/scripts/materialize-serenity-v6-snapshots.mjs +0 -675
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import { spawnSync } from 'node:child_process';
|
|
5
|
-
|
|
6
|
-
const WORKSPACE = 'serenity-production-v6';
|
|
7
|
-
const DEFAULT_DB = '/home/dlamotte/.ghostcrab/databases/ghostcrab-serenity-v4-demos.sqlite';
|
|
8
|
-
const DEFAULT_OUT_ROOT = 'docs/demo/export-audit/2026-06-26/serenity-production-v6-backups';
|
|
9
|
-
|
|
10
|
-
const dbPath = valueAfter('--db') ?? process.env.GHOSTCRAB_SQLITE_PATH ?? DEFAULT_DB;
|
|
11
|
-
const outRoot = valueAfter('--out-dir') ?? DEFAULT_OUT_ROOT;
|
|
12
|
-
const stamp = valueAfter('--stamp') ?? timestamp();
|
|
13
|
-
const outDir = join(outRoot, stamp);
|
|
14
|
-
|
|
15
|
-
function valueAfter(flag) {
|
|
16
|
-
const index = process.argv.indexOf(flag);
|
|
17
|
-
return index >= 0 ? process.argv[index + 1] : null;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function timestamp() {
|
|
21
|
-
const now = new Date();
|
|
22
|
-
const pad = (n) => String(n).padStart(2, '0');
|
|
23
|
-
return `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}T${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function runJson(sql) {
|
|
27
|
-
const result = spawnSync('sqlite3', ['-readonly', '-json', dbPath, sql], {
|
|
28
|
-
encoding: 'utf8',
|
|
29
|
-
maxBuffer: 1024 * 1024 * 256
|
|
30
|
-
});
|
|
31
|
-
if (result.status !== 0) throw new Error(result.stderr || result.stdout || `sqlite3 failed: ${sql}`);
|
|
32
|
-
return JSON.parse(result.stdout || '[]');
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function quote(value) {
|
|
36
|
-
if (value === null || value === undefined) return 'NULL';
|
|
37
|
-
if (typeof value === 'number') return Number.isFinite(value) ? String(value) : 'NULL';
|
|
38
|
-
if (typeof value === 'boolean') return value ? '1' : '0';
|
|
39
|
-
return `'${String(value).replaceAll("'", "''")}'`;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function sqlIn(values) {
|
|
43
|
-
if (values.length === 0) return "('__no_rows__')";
|
|
44
|
-
return `(${values.map(quote).join(', ')})`;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function tableColumns(table) {
|
|
48
|
-
return runJson(`PRAGMA table_info(${table})`).map((row) => row.name);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function selectTable(table, where) {
|
|
52
|
-
const rows = runJson(`SELECT * FROM ${table} WHERE ${where}`);
|
|
53
|
-
return { columns: tableColumns(table), rows };
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function insertSql(table, columns, row) {
|
|
57
|
-
const values = columns.map((column) => quote(row[column])).join(', ');
|
|
58
|
-
return `INSERT INTO ${table} (${columns.join(', ')}) VALUES (${values});`;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const ontologyIds = runJson(
|
|
62
|
-
`SELECT ontology_id FROM ontologies WHERE workspace_id=${quote(WORKSPACE)} ORDER BY ontology_id`
|
|
63
|
-
).map((row) => row.ontology_id);
|
|
64
|
-
const artifactIds = runJson(
|
|
65
|
-
`SELECT artifact_id FROM mindbrain_answer_artifacts WHERE workspace_id=${quote(WORKSPACE)} ORDER BY artifact_id`
|
|
66
|
-
).map((row) => row.artifact_id);
|
|
67
|
-
const entityIds = runJson(
|
|
68
|
-
`SELECT entity_id FROM graph_entity WHERE workspace_id=${quote(WORKSPACE)} ORDER BY entity_id`
|
|
69
|
-
).map((row) => row.entity_id);
|
|
70
|
-
const relationIds = runJson(
|
|
71
|
-
`SELECT relation_id FROM graph_relation WHERE workspace_id=${quote(WORKSPACE)} ORDER BY relation_id`
|
|
72
|
-
).map((row) => row.relation_id);
|
|
73
|
-
|
|
74
|
-
const tableSpecs = [
|
|
75
|
-
['workspaces', `workspace_id=${quote(WORKSPACE)} OR id=${quote(WORKSPACE)}`],
|
|
76
|
-
['workspace_settings', `workspace_id=${quote(WORKSPACE)}`],
|
|
77
|
-
['ontologies', `workspace_id=${quote(WORKSPACE)}`],
|
|
78
|
-
['ontology_namespaces', `ontology_id IN ${sqlIn(ontologyIds)}`],
|
|
79
|
-
['ontology_dimensions', `ontology_id IN ${sqlIn(ontologyIds)}`],
|
|
80
|
-
['ontology_values', `ontology_id IN ${sqlIn(ontologyIds)}`],
|
|
81
|
-
['ontology_entity_types', `ontology_id IN ${sqlIn(ontologyIds)}`],
|
|
82
|
-
['ontology_edge_types', `ontology_id IN ${sqlIn(ontologyIds)}`],
|
|
83
|
-
['ontology_triples_raw', `ontology_id IN ${sqlIn(ontologyIds)}`],
|
|
84
|
-
['ontology_entities_raw', `ontology_id IN ${sqlIn(ontologyIds)}`],
|
|
85
|
-
['ontology_relations_raw', `ontology_id IN ${sqlIn(ontologyIds)}`],
|
|
86
|
-
['collections', `workspace_id=${quote(WORKSPACE)}`],
|
|
87
|
-
['collection_ontologies', `workspace_id=${quote(WORKSPACE)}`],
|
|
88
|
-
['documents_raw', `workspace_id=${quote(WORKSPACE)}`],
|
|
89
|
-
['chunks_raw', `workspace_id=${quote(WORKSPACE)}`],
|
|
90
|
-
['document_links_raw', `workspace_id=${quote(WORKSPACE)}`],
|
|
91
|
-
['external_links_raw', `workspace_id=${quote(WORKSPACE)}`],
|
|
92
|
-
['facet_assignments_raw', `workspace_id=${quote(WORKSPACE)}`],
|
|
93
|
-
['agent_facts', `workspace_id=${quote(WORKSPACE)}`],
|
|
94
|
-
['graph_entity', `workspace_id=${quote(WORKSPACE)}`],
|
|
95
|
-
['graph_entity_alias', `entity_id IN ${sqlIn(entityIds)}`],
|
|
96
|
-
['graph_entity_chunk', `workspace_id=${quote(WORKSPACE)}`],
|
|
97
|
-
['graph_entity_document', `entity_id IN ${sqlIn(entityIds)}`],
|
|
98
|
-
['graph_entity_degree', `entity_id IN ${sqlIn(entityIds)}`],
|
|
99
|
-
['graph_lj_in', `entity_id IN ${sqlIn(entityIds)}`],
|
|
100
|
-
['graph_lj_out', `entity_id IN ${sqlIn(entityIds)}`],
|
|
101
|
-
['graph_relation', `workspace_id=${quote(WORKSPACE)}`],
|
|
102
|
-
['graph_relation_property', `relation_id IN ${sqlIn(relationIds)}`],
|
|
103
|
-
['graph_gap_rules', `workspace_id=${quote(WORKSPACE)}`],
|
|
104
|
-
['graph_rule_evaluations', `workspace_id=${quote(WORKSPACE)}`],
|
|
105
|
-
['graph_rule_events', `workspace_id=${quote(WORKSPACE)}`],
|
|
106
|
-
['entities_raw', `workspace_id=${quote(WORKSPACE)}`],
|
|
107
|
-
['entity_aliases_raw', `workspace_id=${quote(WORKSPACE)} OR entity_id IN ${sqlIn(entityIds)}`],
|
|
108
|
-
['entity_documents_raw', `workspace_id=${quote(WORKSPACE)}`],
|
|
109
|
-
['entity_chunks_raw', `workspace_id=${quote(WORKSPACE)}`],
|
|
110
|
-
['relations_raw', `workspace_id=${quote(WORKSPACE)}`],
|
|
111
|
-
['relation_properties_raw', `workspace_id=${quote(WORKSPACE)}`],
|
|
112
|
-
['table_semantics', `workspace_id=${quote(WORKSPACE)}`],
|
|
113
|
-
['column_semantics', `workspace_id=${quote(WORKSPACE)}`],
|
|
114
|
-
['relation_semantics', `workspace_id=${quote(WORKSPACE)}`],
|
|
115
|
-
['source_mappings', `workspace_id=${quote(WORKSPACE)}`],
|
|
116
|
-
['structured_import_provenance', `workspace_id=${quote(WORKSPACE)}`],
|
|
117
|
-
['pending_migrations', `workspace_id=${quote(WORKSPACE)}`],
|
|
118
|
-
['quality_convergence_run', `workspace_id=${quote(WORKSPACE)}`],
|
|
119
|
-
['quality_remediation_action', `workspace_id=${quote(WORKSPACE)}`],
|
|
120
|
-
['mindbrain_answer_artifacts', `workspace_id=${quote(WORKSPACE)}`],
|
|
121
|
-
['mindbrain_answer_events', `artifact_id IN ${sqlIn(artifactIds)}`]
|
|
122
|
-
];
|
|
123
|
-
|
|
124
|
-
const existingTables = new Set(runJson(`SELECT name FROM sqlite_master WHERE type='table'`).map((row) => row.name));
|
|
125
|
-
const tables = {};
|
|
126
|
-
for (const [table, where] of tableSpecs) {
|
|
127
|
-
if (!existingTables.has(table)) continue;
|
|
128
|
-
const data = selectTable(table, where);
|
|
129
|
-
if (data.rows.length > 0) tables[table] = data;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const manifest = {
|
|
133
|
-
generated_at: new Date().toISOString(),
|
|
134
|
-
workspace_id: WORKSPACE,
|
|
135
|
-
db_path: dbPath,
|
|
136
|
-
export_kind: 'workspace_scoped_json_and_sql',
|
|
137
|
-
row_counts: Object.fromEntries(Object.entries(tables).map(([table, data]) => [table, data.rows.length])),
|
|
138
|
-
total_rows: Object.values(tables).reduce((sum, data) => sum + data.rows.length, 0)
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
mkdirSync(outDir, { recursive: true });
|
|
142
|
-
writeFileSync(
|
|
143
|
-
join(outDir, 'serenity-production-v6.backup.json'),
|
|
144
|
-
`${JSON.stringify({ manifest, tables }, null, 2)}\n`
|
|
145
|
-
);
|
|
146
|
-
writeFileSync(join(outDir, 'manifest.json'), `${JSON.stringify(manifest, null, 2)}\n`);
|
|
147
|
-
|
|
148
|
-
const deleteOrder = Object.keys(tables).reverse();
|
|
149
|
-
const insertOrder = Object.keys(tables);
|
|
150
|
-
const sql = [
|
|
151
|
-
`-- Serenity Production V6 workspace-scoped SQL backup`,
|
|
152
|
-
`-- Generated at ${manifest.generated_at}`,
|
|
153
|
-
`-- Source DB: ${dbPath}`,
|
|
154
|
-
`PRAGMA foreign_keys=OFF;`,
|
|
155
|
-
`BEGIN IMMEDIATE;`,
|
|
156
|
-
...deleteOrder.map((table) => `DELETE FROM ${table} WHERE ${tableSpecs.find(([name]) => name === table)?.[1] ?? '1=0'};`),
|
|
157
|
-
...insertOrder.flatMap((table) =>
|
|
158
|
-
tables[table].rows.map((row) => insertSql(table, tables[table].columns, row))
|
|
159
|
-
),
|
|
160
|
-
`COMMIT;`,
|
|
161
|
-
`PRAGMA foreign_keys=ON;`
|
|
162
|
-
].join('\n');
|
|
163
|
-
|
|
164
|
-
writeFileSync(join(outDir, 'serenity-production-v6.backup.sql'), `${sql}\n`);
|
|
165
|
-
|
|
166
|
-
console.log(
|
|
167
|
-
JSON.stringify(
|
|
168
|
-
{
|
|
169
|
-
out_dir: outDir,
|
|
170
|
-
json: join(outDir, 'serenity-production-v6.backup.json'),
|
|
171
|
-
sql: join(outDir, 'serenity-production-v6.backup.sql'),
|
|
172
|
-
manifest: join(outDir, 'manifest.json'),
|
|
173
|
-
...manifest
|
|
174
|
-
},
|
|
175
|
-
null,
|
|
176
|
-
2
|
|
177
|
-
)
|
|
178
|
-
);
|