kiokuko-dsh 0.1.47 → 0.1.48

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.
Files changed (65) hide show
  1. package/dist/akinator/memory-probe-types.d.ts +141 -0
  2. package/dist/akinator/memory-probe-types.d.ts.map +1 -0
  3. package/dist/akinator/memory-probe-types.js +35 -0
  4. package/dist/akinator/memory-probe-types.js.map +1 -0
  5. package/dist/akinator/memory-probe.d.ts +23 -0
  6. package/dist/akinator/memory-probe.d.ts.map +1 -0
  7. package/dist/akinator/memory-probe.js +129 -0
  8. package/dist/akinator/memory-probe.js.map +1 -0
  9. package/dist/akinator/profile-memory-resolver.d.ts +10 -0
  10. package/dist/akinator/profile-memory-resolver.d.ts.map +1 -0
  11. package/dist/akinator/profile-memory-resolver.js +34 -0
  12. package/dist/akinator/profile-memory-resolver.js.map +1 -0
  13. package/dist/akinator/profile-memory-store.d.ts +35 -0
  14. package/dist/akinator/profile-memory-store.d.ts.map +1 -0
  15. package/dist/akinator/profile-memory-store.js +149 -0
  16. package/dist/akinator/profile-memory-store.js.map +1 -0
  17. package/dist/akinator/service.d.ts +4 -0
  18. package/dist/akinator/service.d.ts.map +1 -1
  19. package/dist/akinator/service.js +42 -25
  20. package/dist/akinator/service.js.map +1 -1
  21. package/dist/akinator/store.d.ts +1 -1
  22. package/dist/akinator/store.d.ts.map +1 -1
  23. package/dist/akinator/store.js +5 -2
  24. package/dist/akinator/store.js.map +1 -1
  25. package/dist/deep-thinker/core/contracts.d.ts +5 -5
  26. package/dist/deep-thinker/report.d.ts +1 -1
  27. package/dist/deep-thinker/store.d.ts +2 -2
  28. package/dist/dsh/config.d.ts +16 -3
  29. package/dist/dsh/config.d.ts.map +1 -1
  30. package/dist/dsh/config.js +3 -0
  31. package/dist/dsh/config.js.map +1 -1
  32. package/dist/dsh/host-adapter.d.ts +2 -1
  33. package/dist/dsh/host-adapter.d.ts.map +1 -1
  34. package/dist/dsh/host-adapter.js +3 -2
  35. package/dist/dsh/host-adapter.js.map +1 -1
  36. package/dist/dsh/index.d.ts.map +1 -1
  37. package/dist/dsh/index.js +2 -1
  38. package/dist/dsh/index.js.map +1 -1
  39. package/dist/dsh/intake-gate.d.ts +4 -1
  40. package/dist/dsh/intake-gate.d.ts.map +1 -1
  41. package/dist/dsh/intake-gate.js +19 -4
  42. package/dist/dsh/intake-gate.js.map +1 -1
  43. package/dist/dsh/run-intake-service.d.ts +4 -0
  44. package/dist/dsh/run-intake-service.d.ts.map +1 -1
  45. package/dist/dsh/run-intake-service.js +20 -3
  46. package/dist/dsh/run-intake-service.js.map +1 -1
  47. package/dist/dsh/task-intake.d.ts +12 -6
  48. package/dist/dsh/task-intake.d.ts.map +1 -1
  49. package/dist/dsh/task-intake.js +33 -6
  50. package/dist/dsh/task-intake.js.map +1 -1
  51. package/dist/dsh/user-interaction.d.ts +2 -1
  52. package/dist/dsh/user-interaction.d.ts.map +1 -1
  53. package/dist/dsh/user-interaction.js +6 -1
  54. package/dist/dsh/user-interaction.js.map +1 -1
  55. package/dist/enno-oduno/schemas.d.ts +22 -22
  56. package/dist/enno-oduno/service.js +2 -2
  57. package/dist/enno-oduno/service.js.map +1 -1
  58. package/dist/ledger/checkpoint-contract.d.ts +6 -6
  59. package/dist/memory/checkpoint-contract.d.ts +24 -24
  60. package/dist/memory/evolution/contracts.d.ts +2 -2
  61. package/dist/model-tools/contracts.d.ts +11 -11
  62. package/docs/akinator-memory.md +132 -0
  63. package/migrations/016_akinator_memory_probe.sql +87 -0
  64. package/package.json +6 -2
  65. package/scripts/backfill-akinator-memory.mjs +25 -0
@@ -0,0 +1,141 @@
1
+ import { z } from 'zod';
2
+ import type { TaskProfile } from './types.js';
3
+ export declare const AkinatorMemoryConfig: z.ZodObject<{
4
+ mode: z.ZodDefault<z.ZodEnum<{
5
+ off: "off";
6
+ shadow: "shadow";
7
+ suggest: "suggest";
8
+ resolve: "resolve";
9
+ }>>;
10
+ maxCandidates: z.ZodDefault<z.ZodNumber>;
11
+ maxHintsPerField: z.ZodDefault<z.ZodNumber>;
12
+ maxElapsedMs: z.ZodDefault<z.ZodNumber>;
13
+ }, z.core.$strict>;
14
+ export type ProbeConfig = z.infer<typeof AkinatorMemoryConfig>;
15
+ export type ProbeMode = ProbeConfig['mode'];
16
+ export declare const ProfileEvidenceSchema: z.ZodObject<{
17
+ sessionId: z.ZodString;
18
+ runId: z.ZodString;
19
+ workspace: z.ZodString;
20
+ repositoryId: z.ZodString;
21
+ profileHash: z.ZodString;
22
+ sourceMapHash: z.ZodString;
23
+ snapshotHash: z.ZodString;
24
+ originalSource: z.ZodEnum<{
25
+ inferred: "inferred";
26
+ client_supplied: "client_supplied";
27
+ user_answer: "user_answer";
28
+ memory: "memory";
29
+ }>;
30
+ observedAt: z.ZodISODateTime;
31
+ }, z.core.$strict>;
32
+ export type ProfileEvidenceRef = z.infer<typeof ProfileEvidenceSchema>;
33
+ export declare const FieldResolutionSchema: z.ZodObject<{
34
+ field: z.ZodEnum<{
35
+ taskType: "taskType";
36
+ target: "target";
37
+ expected: "expected";
38
+ constraints: "constraints";
39
+ }>;
40
+ decision: z.ZodEnum<{
41
+ suggest: "suggest";
42
+ keep_current: "keep_current";
43
+ adopt: "adopt";
44
+ reject: "reject";
45
+ }>;
46
+ value: z.ZodNullable<z.ZodString>;
47
+ rankingScore: z.ZodNumber;
48
+ reasons: z.ZodArray<z.ZodString>;
49
+ evidence: z.ZodArray<z.ZodObject<{
50
+ sessionId: z.ZodString;
51
+ runId: z.ZodString;
52
+ workspace: z.ZodString;
53
+ repositoryId: z.ZodString;
54
+ profileHash: z.ZodString;
55
+ sourceMapHash: z.ZodString;
56
+ snapshotHash: z.ZodString;
57
+ originalSource: z.ZodEnum<{
58
+ inferred: "inferred";
59
+ client_supplied: "client_supplied";
60
+ user_answer: "user_answer";
61
+ memory: "memory";
62
+ }>;
63
+ observedAt: z.ZodISODateTime;
64
+ }, z.core.$strict>>;
65
+ }, z.core.$strict>;
66
+ export type FieldResolution = z.infer<typeof FieldResolutionSchema>;
67
+ export declare const MemoryProbeResultSchema: z.ZodObject<{
68
+ policyVersion: z.ZodLiteral<"profile-memory-v1">;
69
+ mode: z.ZodEnum<{
70
+ off: "off";
71
+ shadow: "shadow";
72
+ suggest: "suggest";
73
+ resolve: "resolve";
74
+ }>;
75
+ status: z.ZodEnum<{
76
+ complete: "complete";
77
+ unavailable: "unavailable";
78
+ skipped: "skipped";
79
+ incomplete: "incomplete";
80
+ }>;
81
+ coverage: z.ZodEnum<{
82
+ complete: "complete";
83
+ partial: "partial";
84
+ }>;
85
+ resolutions: z.ZodArray<z.ZodObject<{
86
+ field: z.ZodEnum<{
87
+ taskType: "taskType";
88
+ target: "target";
89
+ expected: "expected";
90
+ constraints: "constraints";
91
+ }>;
92
+ decision: z.ZodEnum<{
93
+ suggest: "suggest";
94
+ keep_current: "keep_current";
95
+ adopt: "adopt";
96
+ reject: "reject";
97
+ }>;
98
+ value: z.ZodNullable<z.ZodString>;
99
+ rankingScore: z.ZodNumber;
100
+ reasons: z.ZodArray<z.ZodString>;
101
+ evidence: z.ZodArray<z.ZodObject<{
102
+ sessionId: z.ZodString;
103
+ runId: z.ZodString;
104
+ workspace: z.ZodString;
105
+ repositoryId: z.ZodString;
106
+ profileHash: z.ZodString;
107
+ sourceMapHash: z.ZodString;
108
+ snapshotHash: z.ZodString;
109
+ originalSource: z.ZodEnum<{
110
+ inferred: "inferred";
111
+ client_supplied: "client_supplied";
112
+ user_answer: "user_answer";
113
+ memory: "memory";
114
+ }>;
115
+ observedAt: z.ZodISODateTime;
116
+ }, z.core.$strict>>;
117
+ }, z.core.$strict>>;
118
+ scannedCandidates: z.ZodNumber;
119
+ expandedProfiles: z.ZodNumber;
120
+ queryCount: z.ZodNumber;
121
+ elapsedMs: z.ZodNumber;
122
+ truncated: z.ZodBoolean;
123
+ }, z.core.$strict>;
124
+ export type MemoryProbeResult = z.infer<typeof MemoryProbeResultSchema>;
125
+ export interface ProfileMemoryCandidate {
126
+ profile: TaskProfile;
127
+ evidence: ProfileEvidenceRef;
128
+ sources: Partial<Record<keyof TaskProfile, ProfileEvidenceRef['originalSource']>>;
129
+ completed: boolean;
130
+ exactTarget: boolean;
131
+ rankingScore: number;
132
+ }
133
+ export interface ProfileMemoryHint {
134
+ field: keyof TaskProfile;
135
+ value: string;
136
+ source: {
137
+ runId: string;
138
+ observedAt: string;
139
+ };
140
+ }
141
+ //# sourceMappingURL=memory-probe-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-probe-types.d.ts","sourceRoot":"","sources":["../../src/akinator/memory-probe-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,eAAO,MAAM,oBAAoB;;;;;;;;;;kBAKtB,CAAC;AACZ,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC/D,MAAM,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAG5C,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;kBAKvB,CAAC;AACZ,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACvE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAOvB,CAAC;AACZ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAUzB,CAAC;AACZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,WAAW,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAClF,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AACD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,WAAW,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C"}
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod';
2
+ export const AkinatorMemoryConfig = z.object({
3
+ mode: z.enum(['off', 'shadow', 'suggest', 'resolve']).default('off'),
4
+ maxCandidates: z.number().int().min(1).max(64).default(64),
5
+ maxHintsPerField: z.number().int().min(1).max(3).default(3),
6
+ maxElapsedMs: z.number().int().min(1).max(1000).default(50),
7
+ }).strict();
8
+ const id = z.string().min(1).max(256);
9
+ const hash = z.string().regex(/^[a-f0-9]{64}$/u);
10
+ export const ProfileEvidenceSchema = z.object({
11
+ sessionId: id, runId: id, workspace: z.string().min(1).max(16384), repositoryId: id,
12
+ profileHash: hash, sourceMapHash: hash, snapshotHash: hash,
13
+ originalSource: z.enum(['inferred', 'client_supplied', 'user_answer', 'memory']),
14
+ observedAt: z.iso.datetime(),
15
+ }).strict();
16
+ export const FieldResolutionSchema = z.object({
17
+ field: z.enum(['taskType', 'target', 'expected', 'constraints']),
18
+ decision: z.enum(['keep_current', 'adopt', 'suggest', 'reject']),
19
+ value: z.string().min(1).max(1024).nullable(),
20
+ rankingScore: z.number().finite().min(0).max(100),
21
+ reasons: z.array(z.string().min(1).max(64)).max(8),
22
+ evidence: z.array(ProfileEvidenceSchema).max(1),
23
+ }).strict();
24
+ export const MemoryProbeResultSchema = z.object({
25
+ policyVersion: z.literal('profile-memory-v1'), mode: z.enum(['off', 'shadow', 'suggest', 'resolve']),
26
+ status: z.enum(['skipped', 'complete', 'incomplete', 'unavailable']),
27
+ coverage: z.enum(['complete', 'partial']),
28
+ resolutions: z.array(FieldResolutionSchema).max(12),
29
+ scannedCandidates: z.number().int().min(0).max(64),
30
+ expandedProfiles: z.number().int().min(0).max(64),
31
+ queryCount: z.number().int().min(0).max(4),
32
+ elapsedMs: z.number().finite().min(0),
33
+ truncated: z.boolean(),
34
+ }).strict();
35
+ //# sourceMappingURL=memory-probe-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-probe-types.js","sourceRoot":"","sources":["../../src/akinator/memory-probe-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { SqliteDatabase } from '../db/adapter.js';
2
+ import type { TaskProfile } from './types.js';
3
+ import { type MemoryProbeResult, type ProbeConfig } from './memory-probe-types.js';
4
+ export interface MemoryProbeScope {
5
+ workspace: string;
6
+ repositoryId: string;
7
+ repositoryRoot: string;
8
+ allowed: boolean;
9
+ /** Current task path tokens verified before entering the write transaction. */
10
+ verifiedTargets: readonly string[];
11
+ }
12
+ /** Only literal path tokens qualify. No guessed paths, prefix matching, or repository-wide expansion. */
13
+ export declare function verifyTaskTargets(task: string, repositoryRoot: string, cwd?: string): string[];
14
+ export declare function shouldProbe(profile: TaskProfile, config: ProbeConfig, scope?: MemoryProbeScope): boolean;
15
+ /** Bounded synchronous local search. Elapsed budget is checked between queries, not a SQL hard timeout. */
16
+ export declare function probeProfileMemory(database: SqliteDatabase, input: {
17
+ task: string;
18
+ profile: TaskProfile;
19
+ config: ProbeConfig;
20
+ scope?: MemoryProbeScope;
21
+ now: string;
22
+ }): MemoryProbeResult;
23
+ //# sourceMappingURL=memory-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-probe.d.ts","sourceRoot":"","sources":["../../src/akinator/memory-probe.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,kBAAkB,CAAC;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAwB,KAAK,iBAAiB,EAAE,KAAK,WAAW,EAA+B,MAAM,yBAAyB,CAAC;AAItI,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,+EAA+E;IAC/E,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,yGAAyG;AACzG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,SAAiB,GAAG,MAAM,EAAE,CAuBtG;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAGxG;AAED,2GAA2G;AAC3G,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE;IAClE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAChG,GAAG,iBAAiB,CAuEpB"}
@@ -0,0 +1,129 @@
1
+ import { performance } from 'node:perf_hooks';
2
+ import { realpathSync } from 'node:fs';
3
+ import { isAbsolute, relative, resolve } from 'node:path';
4
+ import { KiokukoError } from '../errors.js';
5
+ import { AkinatorMemoryConfig } from './memory-probe-types.js';
6
+ import { profileCoverageComplete, readProfileMemorySource } from './profile-memory-store.js';
7
+ import { resolveProfileMemory } from './profile-memory-resolver.js';
8
+ /** Only literal path tokens qualify. No guessed paths, prefix matching, or repository-wide expansion. */
9
+ export function verifyTaskTargets(task, repositoryRoot, cwd = repositoryRoot) {
10
+ const tokens = [...new Set(task.slice(0, 16384).split(/[\s`"'<>()[\]{},;:!?。、]+/u))]
11
+ .filter(token => token.length <= 1024 && /[./]/u.test(token)).slice(0, 32);
12
+ const result = [];
13
+ for (const token of tokens) {
14
+ if (cwd !== repositoryRoot && !isAbsolute(token))
15
+ continue;
16
+ if (token.includes('..') || token.includes('\\') || token.includes('://'))
17
+ continue;
18
+ const absolute = resolve(repositoryRoot, token);
19
+ const rel = relative(repositoryRoot, absolute);
20
+ if (!rel || rel.startsWith('..') || isAbsolute(rel))
21
+ continue;
22
+ try {
23
+ const canonical = realpathSync(absolute);
24
+ const canonicalRelative = relative(repositoryRoot, canonical);
25
+ if (!canonicalRelative || canonicalRelative.startsWith('..') || isAbsolute(canonicalRelative))
26
+ continue;
27
+ // Symlinks and aliases do not prove the exact requested target in v1.
28
+ if (canonical !== absolute)
29
+ continue;
30
+ result.push(token);
31
+ }
32
+ catch (error) {
33
+ const code = error.code;
34
+ if (code !== 'ENOENT' && code !== 'ENOTDIR' && code !== 'EACCES' && code !== 'ELOOP')
35
+ throw error;
36
+ }
37
+ }
38
+ return result;
39
+ }
40
+ export function shouldProbe(profile, config, scope) {
41
+ return config.mode !== 'off' && scope?.allowed === true && profile.taskType !== 'chat'
42
+ && (profile.taskType === null || profile.target === null || profile.expected === null);
43
+ }
44
+ /** Bounded synchronous local search. Elapsed budget is checked between queries, not a SQL hard timeout. */
45
+ export function probeProfileMemory(database, input) {
46
+ const config = AkinatorMemoryConfig.parse(input.config);
47
+ const result = { policyVersion: 'profile-memory-v1', mode: config.mode, status: 'skipped',
48
+ coverage: 'partial', resolutions: [], scannedCandidates: 0, expandedProfiles: 0,
49
+ queryCount: 0, elapsedMs: 0, truncated: false };
50
+ if (!shouldProbe(input.profile, config, input.scope))
51
+ return result;
52
+ const scope = input.scope;
53
+ const started = performance.now();
54
+ const registered = database.prepare(`SELECT 1 FROM repositories r JOIN repository_locations l USING(repository_id)
55
+ WHERE r.workspace = ? AND r.repository_id = ? AND l.canonical_root = ?`)
56
+ .get(scope.workspace, scope.repositoryId, scope.repositoryRoot);
57
+ if (!registered)
58
+ throw new KiokukoError('CONFLICT', 'Profile probe repository location changed');
59
+ if (!database.prepare("SELECT 1 FROM sqlite_master WHERE name = 'akinator_profile_documents'").get()) {
60
+ return { ...result, status: 'unavailable', elapsedMs: performance.now() - started };
61
+ }
62
+ result.coverage = profileCoverageComplete(database, scope.workspace, scope.repositoryId) ? 'complete' : 'partial';
63
+ const ids = new Map();
64
+ const query = (sql, parameters, score) => {
65
+ if (performance.now() - started >= config.maxElapsedMs || ids.size >= config.maxCandidates) {
66
+ result.truncated = true;
67
+ return;
68
+ }
69
+ result.queryCount++;
70
+ const rows = database.prepare(sql).all(...parameters, config.maxCandidates + 1);
71
+ if (rows.length > config.maxCandidates)
72
+ result.truncated = true;
73
+ for (const row of rows) {
74
+ if (ids.has(row.id))
75
+ continue;
76
+ if (ids.size >= config.maxCandidates) {
77
+ result.truncated = true;
78
+ break;
79
+ }
80
+ ids.set(row.id, score);
81
+ }
82
+ };
83
+ if (scope.verifiedTargets.length)
84
+ query(`SELECT DISTINCT document_id AS id FROM akinator_profile_signals
85
+ WHERE workspace = ? AND repository_id = ? AND kind = 'target'
86
+ AND value IN (${scope.verifiedTargets.map(() => '?').join(',')}) ORDER BY document_id LIMIT ?`, [scope.workspace, scope.repositoryId, ...scope.verifiedTargets], 100);
87
+ const words = [...new Set(input.task.slice(0, 4096).match(/[\p{L}\p{N}_./-]+/gu) ?? [])]
88
+ .filter(word => word.length <= 128).slice(0, 16);
89
+ for (const lane of ['akinator_profile_fts', 'akinator_profile_trigram']) {
90
+ const terms = words.filter(word => lane !== 'akinator_profile_trigram' || [...word].length >= 3);
91
+ if (!terms.length)
92
+ continue;
93
+ const match = terms.map(word => '"' + word.replaceAll('"', '""') + '"').join(' OR ');
94
+ query(`SELECT d.id FROM ${lane} JOIN akinator_profile_documents d ON d.id = ${lane}.rowid
95
+ WHERE ${lane} MATCH ? AND d.workspace = ? AND d.repository_id = ? ORDER BY rank, d.id LIMIT ?`, [match, scope.workspace, scope.repositoryId], lane === 'akinator_profile_fts' ? 60 : 40);
96
+ }
97
+ const candidates = [];
98
+ for (const [id, rankingScore] of ids) {
99
+ if (performance.now() - started >= config.maxElapsedMs) {
100
+ result.truncated = true;
101
+ break;
102
+ }
103
+ const doc = database.prepare('SELECT * FROM akinator_profile_documents WHERE id = ?')
104
+ .get(id);
105
+ if (!doc || doc.workspace !== scope.workspace || doc.repository_id !== scope.repositoryId) {
106
+ throw new KiokukoError('INTEGRITY_ERROR', 'Profile search projection scope mismatch');
107
+ }
108
+ result.expandedProfiles++;
109
+ const source = readProfileMemorySource(database, scope.workspace, doc.run_id);
110
+ if (!source || source.profileHash !== doc.profile_hash || source.sourcesHash !== doc.sources_hash
111
+ || source.snapshotHash !== doc.snapshot_hash || doc.version !== 1
112
+ || doc.task_text !== source.session.task.slice(0, 4096) || doc.target_text !== (source.session.profile.target ?? '').slice(0, 1024)) {
113
+ throw new KiokukoError('INTEGRITY_ERROR', 'Profile search projection is stale or corrupt');
114
+ }
115
+ if (source.run.status !== 'completed')
116
+ continue;
117
+ candidates.push({ profile: source.session.profile, sources: source.link.profileSources, completed: true,
118
+ exactTarget: source.session.profile.target !== null && scope.verifiedTargets.includes(source.session.profile.target),
119
+ rankingScore, evidence: { sessionId: source.session.id, runId: source.run.runId, workspace: scope.workspace,
120
+ repositoryId: scope.repositoryId, profileHash: source.profileHash, sourceMapHash: source.sourcesHash,
121
+ snapshotHash: source.snapshotHash, originalSource: 'inferred', observedAt: source.session.updatedAt } });
122
+ }
123
+ result.scannedCandidates = ids.size;
124
+ result.status = result.truncated || result.coverage === 'partial' ? 'incomplete' : 'complete';
125
+ result.resolutions = resolveProfileMemory({ profile: input.profile, candidates, complete: result.status === 'complete', config });
126
+ result.elapsedMs = performance.now() - started;
127
+ return result;
128
+ }
129
+ //# sourceMappingURL=memory-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-probe.js","sourceRoot":"","sources":["../../src/akinator/memory-probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { TaskProfile } from './types.js';
2
+ import type { FieldResolution, ProfileMemoryCandidate, ProbeConfig } from './memory-probe-types.js';
3
+ /** Decide only from validated canonical candidates; scores order suggestions, never confer authority. */
4
+ export declare function resolveProfileMemory(input: {
5
+ profile: TaskProfile;
6
+ candidates: readonly ProfileMemoryCandidate[];
7
+ complete: boolean;
8
+ config: ProbeConfig;
9
+ }): FieldResolution[];
10
+ //# sourceMappingURL=profile-memory-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-memory-resolver.d.ts","sourceRoot":"","sources":["../../src/akinator/profile-memory-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEpG,yGAAyG;AACzG,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,OAAO,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACpE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;CACxC,GAAG,eAAe,EAAE,CA2BpB"}
@@ -0,0 +1,34 @@
1
+ /** Decide only from validated canonical candidates; scores order suggestions, never confer authority. */
2
+ export function resolveProfileMemory(input) {
3
+ if (input.profile.taskType === 'chat' || input.config.mode === 'off')
4
+ return [];
5
+ const resolutions = [];
6
+ const ordered = [...input.candidates].sort((a, b) => b.rankingScore - a.rankingScore
7
+ || b.evidence.observedAt.localeCompare(a.evidence.observedAt)
8
+ || a.evidence.runId.localeCompare(b.evidence.runId));
9
+ const targets = new Set(ordered.map(c => c.profile.target).filter(v => v !== null));
10
+ for (const field of ['taskType', 'target', 'expected']) {
11
+ if (input.profile[field] !== null)
12
+ continue;
13
+ const seen = new Set();
14
+ for (const candidate of ordered) {
15
+ const value = candidate.profile[field];
16
+ const source = candidate.sources[field];
17
+ if (value === null || value.length > 1024 || !source || source === 'memory' || seen.has(value))
18
+ continue;
19
+ const adopt = field === 'target' && (input.config.mode === 'resolve' || input.config.mode === 'shadow')
20
+ && input.complete && targets.size === 1 && candidate.exactTarget && candidate.completed
21
+ && (source === 'user_answer' || source === 'client_supplied');
22
+ resolutions.push({ field, value, decision: adopt ? 'adopt' : 'suggest',
23
+ rankingScore: candidate.rankingScore,
24
+ reasons: [adopt ? 'verified-current-target' : field === 'expected' ? 'previous-example-only' : 'confirmation-required'],
25
+ evidence: [{ ...candidate.evidence, originalSource: source }],
26
+ });
27
+ seen.add(value);
28
+ if (seen.size === input.config.maxHintsPerField)
29
+ break;
30
+ }
31
+ }
32
+ return resolutions;
33
+ }
34
+ //# sourceMappingURL=profile-memory-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-memory-resolver.js","sourceRoot":"","sources":["../../src/akinator/profile-memory-resolver.ts"],"names":[],"mappings":"AAGA,yGAAyG;AACzG,MAAM,UAAU,oBAAoB,CAAC,KAGpC;IACC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAChF,MAAM,WAAW,GAAsB,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY;WAC/E,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;WAC1D,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACpF,KAAK,MAAM,KAAK,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAU,EAAE,CAAC;QAChE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI;YAAE,SAAS;QAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,SAAS,IAAI,OAAO,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,SAAS;YACzG,MAAM,KAAK,GAAG,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;mBAClG,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,SAAS;mBACpF,CAAC,MAAM,KAAK,aAAa,IAAI,MAAM,KAAK,iBAAiB,CAAC,CAAC;YAChE,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;gBACpE,YAAY,EAAE,SAAS,CAAC,YAAY;gBACpC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,uBAAuB,CAAC;gBACvH,QAAQ,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;aAC9D,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChB,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,gBAAgB;gBAAE,MAAM;QACzD,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { SqliteDatabase } from '../db/adapter.js';
2
+ import { type MemoryProbeResult, type ProbeConfig, type ProfileMemoryHint } from './memory-probe-types.js';
3
+ export declare function readProfileMemorySource(database: SqliteDatabase, workspace: string, runId: string): {
4
+ link: import("./store.js").RunIntakeLinkView;
5
+ session: import("./types.js").AkinatorSessionView;
6
+ run: import("../ledger/types.js").RunRecord;
7
+ repositoryId: string;
8
+ profileHash: string;
9
+ sourcesHash: string;
10
+ snapshotHash: string;
11
+ } | null;
12
+ /** Refresh one finalized source inside the caller's write transaction. No history scan. */
13
+ export declare function projectProfileMemory(database: SqliteDatabase, workspace: string, runId: string): void;
14
+ /** Explicit, resumable maintenance. A batch and its cursor commit together. */
15
+ export declare function backfillProfileMemory(database: SqliteDatabase, batchSize?: number, rebuild?: boolean): {
16
+ processed: number;
17
+ complete: boolean;
18
+ };
19
+ export declare function profileCoverageComplete(database: SqliteDatabase, workspace: string, repositoryId: string): boolean;
20
+ export declare function saveMemoryResolution(database: SqliteDatabase, input: {
21
+ runId: string;
22
+ baseHash: string;
23
+ resultHash: string;
24
+ config: ProbeConfig;
25
+ result: MemoryProbeResult;
26
+ now: string;
27
+ }): void;
28
+ /** Revalidate source records before displaying a saved suggestion. Never restore an old profile. */
29
+ export declare function readMemoryHints(database: SqliteDatabase, input: {
30
+ runId: string;
31
+ workspace: string;
32
+ repositoryId: string;
33
+ enabled: boolean;
34
+ }): ProfileMemoryHint[];
35
+ //# sourceMappingURL=profile-memory-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-memory-store.d.ts","sourceRoot":"","sources":["../../src/akinator/profile-memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAOvD,OAAO,EAAiD,KAAK,iBAAiB,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE1J,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;;;;;;;SAiCjG;AAED,2FAA2F;AAC3F,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAqBrG;AAED,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,SAAM,EAAE,OAAO,UAAQ;;;EAkB/F;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAOlH;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE;IACpE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAClH,GAAG,IAAI,CASP;AAED,oGAAoG;AACpG,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE;IAC/D,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;CAC1E,GAAG,iBAAiB,EAAE,CA4BtB"}
@@ -0,0 +1,149 @@
1
+ import { withImmediateTransaction } from '../db/transaction.js';
2
+ import { KiokukoError } from '../errors.js';
3
+ import { LedgerStore } from '../ledger/store.js';
4
+ import { canonicalContentHash, canonicalJson } from '../serialization/validate.js';
5
+ import { readAkinatorAnswer, readAkinatorSession, readRunIntakeLink } from './store.js';
6
+ import { profileHash } from './domain.js';
7
+ import { MemoryProbeResultSchema, AkinatorMemoryConfig } from './memory-probe-types.js';
8
+ export function readProfileMemorySource(database, workspace, runId) {
9
+ const link = readRunIntakeLink(database, { workspace, runId });
10
+ const session = readAkinatorSession(database, { workspace, sessionId: link.sessionId });
11
+ const run = new LedgerStore(database).readRun(runId);
12
+ if (!run || run.workspace !== workspace)
13
+ throw new KiokukoError('INTEGRITY_ERROR', 'Profile source run scope mismatch');
14
+ const binding = run.metadata.kiokukoProjectManifestBinding;
15
+ if (!binding || typeof binding !== 'object' || Array.isArray(binding))
16
+ return null;
17
+ if (binding.version !== 1 || typeof binding.repositoryId !== 'string'
18
+ || typeof binding.manifestDigest !== 'string' || !/^[a-f0-9]{64}$/u.test(binding.manifestDigest)) {
19
+ throw new KiokukoError('INTEGRITY_ERROR', 'Profile source repository binding is invalid');
20
+ }
21
+ const repository = database.prepare('SELECT repository_id FROM repositories WHERE workspace = ?')
22
+ .get(workspace);
23
+ if (!repository || repository.repository_id !== binding.repositoryId) {
24
+ throw new KiokukoError('INTEGRITY_ERROR', 'Profile source repository binding mismatch');
25
+ }
26
+ if (session.status !== 'ready' || link.finalizedAt === null)
27
+ return null;
28
+ if (link.initialProfileHash !== profileHash(session.profile)) {
29
+ throw new KiokukoError('INTEGRITY_ERROR', 'Finalized profile hash mismatch');
30
+ }
31
+ for (const field of ['taskType', 'target', 'expected', 'constraints']) {
32
+ if (link.profileSources[field] === 'user_answer') {
33
+ const answer = readAkinatorAnswer(database, { workspace, sessionId: session.id, questionId: field });
34
+ if (!answer || answer.answer !== session.profile[field]) {
35
+ throw new KiokukoError('INTEGRITY_ERROR', 'Profile source answer mismatch');
36
+ }
37
+ }
38
+ }
39
+ return { link, session, run, repositoryId: repository.repository_id,
40
+ profileHash: profileHash(session.profile), sourcesHash: canonicalContentHash(link.profileSources),
41
+ snapshotHash: canonicalContentHash({ task: session.task, profile: session.profile, sources: link.profileSources,
42
+ repositoryId: repository.repository_id, binding, updatedAt: session.updatedAt }),
43
+ };
44
+ }
45
+ /** Refresh one finalized source inside the caller's write transaction. No history scan. */
46
+ export function projectProfileMemory(database, workspace, runId) {
47
+ // Old-schema fixtures and explicit compatibility reads have no projection yet.
48
+ if (!database.prepare("SELECT 1 FROM sqlite_master WHERE name = 'akinator_profile_documents'").get())
49
+ return;
50
+ const source = readProfileMemorySource(database, workspace, runId);
51
+ if (!source)
52
+ return;
53
+ const { session } = source;
54
+ database.prepare(`INSERT INTO akinator_profile_documents
55
+ (run_id, session_id, workspace, repository_id, task_text, target_text, profile_hash, sources_hash, snapshot_hash, version, updated_at)
56
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?)
57
+ ON CONFLICT(run_id) DO UPDATE SET task_text=excluded.task_text, target_text=excluded.target_text,
58
+ profile_hash=excluded.profile_hash, sources_hash=excluded.sources_hash, snapshot_hash=excluded.snapshot_hash,
59
+ updated_at=excluded.updated_at
60
+ `).run(runId, session.id, workspace, source.repositoryId, session.task.slice(0, 4096), (session.profile.target ?? '').slice(0, 1024), source.profileHash, source.sourcesHash, source.snapshotHash, session.updatedAt);
61
+ const document = database.prepare('SELECT id FROM akinator_profile_documents WHERE run_id = ?').get(runId);
62
+ database.prepare('DELETE FROM akinator_profile_signals WHERE document_id = ?').run(document.id);
63
+ if (session.profile.target && session.profile.target.length <= 1024) {
64
+ database.prepare(`INSERT INTO akinator_profile_signals(document_id, workspace, repository_id, kind, value)
65
+ VALUES (?, ?, ?, 'target', ?)`)
66
+ .run(document.id, workspace, source.repositoryId, session.profile.target);
67
+ }
68
+ }
69
+ /** Explicit, resumable maintenance. A batch and its cursor commit together. */
70
+ export function backfillProfileMemory(database, batchSize = 100, rebuild = false) {
71
+ if (!Number.isSafeInteger(batchSize) || batchSize < 1 || batchSize > 1000) {
72
+ throw new KiokukoError('VALIDATION_ERROR', 'Backfill batch size must be between 1 and 1000');
73
+ }
74
+ return withImmediateTransaction(database, () => {
75
+ if (rebuild) {
76
+ database.exec("DELETE FROM akinator_profile_documents; UPDATE akinator_profile_backfill SET cursor = '', complete = 0 WHERE version = 1;");
77
+ }
78
+ const state = database.prepare('SELECT cursor FROM akinator_profile_backfill WHERE version = 1').get();
79
+ const rows = database.prepare(`SELECT ri.run_id, lr.workspace FROM run_intakes ri
80
+ JOIN ledger_runs lr ON lr.run_id = ri.run_id WHERE ri.run_id > ? ORDER BY ri.run_id LIMIT ?`)
81
+ .all(state.cursor, batchSize);
82
+ for (const row of rows)
83
+ projectProfileMemory(database, row.workspace, row.run_id);
84
+ const complete = rows.length < batchSize;
85
+ database.prepare('UPDATE akinator_profile_backfill SET cursor = ?, complete = ? WHERE version = 1')
86
+ .run(rows.at(-1)?.run_id ?? state.cursor, complete ? 1 : 0);
87
+ return { processed: rows.length, complete };
88
+ });
89
+ }
90
+ export function profileCoverageComplete(database, workspace, repositoryId) {
91
+ return !database.prepare(`SELECT 1 AS missing FROM run_intakes ri
92
+ JOIN ledger_runs lr ON lr.run_id = ri.run_id JOIN akinator_sessions s ON s.id = ri.session_id
93
+ LEFT JOIN akinator_profile_documents d ON d.run_id = ri.run_id
94
+ WHERE lr.workspace = ? AND s.status = 'ready' AND ri.finalized_at IS NOT NULL
95
+ AND json_extract(lr.metadata_json, '$.kiokukoProjectManifestBinding.repositoryId') = ?
96
+ AND d.id IS NULL LIMIT 1`).get(workspace, repositoryId);
97
+ }
98
+ export function saveMemoryResolution(database, input) {
99
+ const result = MemoryProbeResultSchema.parse(input.result);
100
+ const config = AkinatorMemoryConfig.parse(input.config);
101
+ database.prepare(`INSERT INTO akinator_memory_resolutions
102
+ (run_id, base_hash, result_hash, config_json, result_json, created_at) VALUES (?, ?, ?, ?, ?, ?)`)
103
+ .run(input.runId, input.baseHash, input.resultHash, canonicalJson(config), canonicalJson(result), input.now);
104
+ const sources = new Set(result.resolutions.flatMap(r => r.evidence.map(e => e.runId)));
105
+ for (const source of sources)
106
+ database.prepare('INSERT INTO akinator_memory_resolution_sources(run_id, source_run_id) VALUES (?, ?)')
107
+ .run(input.runId, source);
108
+ }
109
+ /** Revalidate source records before displaying a saved suggestion. Never restore an old profile. */
110
+ export function readMemoryHints(database, input) {
111
+ if (!input.enabled)
112
+ return [];
113
+ const row = database.prepare('SELECT result_json FROM akinator_memory_resolutions WHERE run_id = ?')
114
+ .get(input.runId);
115
+ if (!row)
116
+ return [];
117
+ let result;
118
+ try {
119
+ result = MemoryProbeResultSchema.parse(JSON.parse(row.result_json));
120
+ }
121
+ catch {
122
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored profile memory resolution is invalid');
123
+ }
124
+ if (result.mode !== 'suggest' && result.mode !== 'resolve')
125
+ return [];
126
+ const hints = [];
127
+ for (const resolution of result.resolutions) {
128
+ if (resolution.decision !== 'suggest' || resolution.value === null)
129
+ continue;
130
+ const evidence = resolution.evidence[0];
131
+ if (!evidence || evidence.workspace !== input.workspace || evidence.repositoryId !== input.repositoryId) {
132
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored profile suggestion scope mismatch');
133
+ }
134
+ // Missing source links are expected after purge; no stale candidate body is displayed.
135
+ if (!database.prepare('SELECT 1 FROM run_intakes WHERE run_id = ?').get(evidence.runId))
136
+ continue;
137
+ const source = readProfileMemorySource(database, input.workspace, evidence.runId);
138
+ if (!source || source.snapshotHash !== evidence.snapshotHash || source.profileHash !== evidence.profileHash
139
+ || source.sourcesHash !== evidence.sourceMapHash || source.session.id !== evidence.sessionId
140
+ || source.session.profile[resolution.field] !== resolution.value
141
+ || source.link.profileSources[resolution.field] !== evidence.originalSource
142
+ || source.run.status !== 'completed')
143
+ continue;
144
+ hints.push({ field: resolution.field, value: resolution.value,
145
+ source: { runId: evidence.runId, observedAt: evidence.observedAt } });
146
+ }
147
+ return hints;
148
+ }
149
+ //# sourceMappingURL=profile-memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-memory-store.js","sourceRoot":"","sources":["../../src/akinator/profile-memory-store.ts"],"names":[],"mappings":"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"}