ai-hist 0.4.1 → 0.8.2
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 +34 -156
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +248 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud-client.d.ts +0 -1
- package/dist/cloud-client.d.ts.map +1 -1
- package/dist/cloud-client.js +0 -2
- package/dist/cloud-client.js.map +1 -1
- package/dist/index.d.ts +153 -211
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +263 -902
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.d.ts +0 -9
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +52 -675
- package/dist/mcp-server.js.map +1 -1
- package/package.json +14 -8
- package/dist/cloud-push.d.ts +0 -47
- package/dist/cloud-push.d.ts.map +0 -1
- package/dist/cloud-push.js +0 -111
- package/dist/cloud-push.js.map +0 -1
- package/dist/cloud-push.test.d.ts +0 -2
- package/dist/cloud-push.test.d.ts.map +0 -1
- package/dist/cloud-push.test.js +0 -68
- package/dist/cloud-push.test.js.map +0 -1
- package/dist/jsonl-sources.d.ts +0 -35
- package/dist/jsonl-sources.d.ts.map +0 -1
- package/dist/jsonl-sources.js +0 -354
- package/dist/jsonl-sources.js.map +0 -1
- package/dist/mcp-smoke.test.d.ts +0 -2
- package/dist/mcp-smoke.test.d.ts.map +0 -1
- package/dist/mcp-smoke.test.js +0 -424
- package/dist/mcp-smoke.test.js.map +0 -1
- package/dist/pair-client.d.ts +0 -41
- package/dist/pair-client.d.ts.map +0 -1
- package/dist/pair-client.js +0 -60
- package/dist/pair-client.js.map +0 -1
- package/dist/pair-client.test.d.ts +0 -2
- package/dist/pair-client.test.d.ts.map +0 -1
- package/dist/pair-client.test.js +0 -118
- package/dist/pair-client.test.js.map +0 -1
- package/dist/trajectory-sources.d.ts +0 -36
- package/dist/trajectory-sources.d.ts.map +0 -1
- package/dist/trajectory-sources.js +0 -201
- package/dist/trajectory-sources.js.map +0 -1
package/dist/pair-client.test.js
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import { mkdtemp, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
-
import { tmpdir } from 'node:os';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
import { test } from 'node:test';
|
|
6
|
-
import { formatPairWarnings, pairCheck } from './pair-client.js';
|
|
7
|
-
test('pairCheck shells to ai-hist pair check with locked v1 context args', async () => {
|
|
8
|
-
const root = await mkdtemp(join(tmpdir(), 'ai-hist-pair-cli-'));
|
|
9
|
-
const callsPath = join(root, 'calls.json');
|
|
10
|
-
const binPath = join(root, 'ai-hist-mock.mjs');
|
|
11
|
-
await writeFile(binPath, `#!/usr/bin/env node
|
|
12
|
-
import { writeFileSync } from 'node:fs';
|
|
13
|
-
writeFileSync(${JSON.stringify(callsPath)}, JSON.stringify(process.argv.slice(2)));
|
|
14
|
-
process.stdout.write(JSON.stringify({
|
|
15
|
-
decision: 'warn',
|
|
16
|
-
warnings: [{
|
|
17
|
-
text: 'Update permissions config before editing auth middleware.',
|
|
18
|
-
kind: 'reflection',
|
|
19
|
-
lens: 'trajectories',
|
|
20
|
-
score: 0.91,
|
|
21
|
-
evidence: [{
|
|
22
|
-
machineId: 'm_1',
|
|
23
|
-
source: 'trajectory',
|
|
24
|
-
sessionId: 'tA',
|
|
25
|
-
kind: 'reflection',
|
|
26
|
-
eventId: 'reflection:tA:suggestion:0',
|
|
27
|
-
ts: '2026-06-21T20:00:00Z',
|
|
28
|
-
snippet: 'update permissions config'
|
|
29
|
-
}]
|
|
30
|
-
}],
|
|
31
|
-
correlationId: 'pair_test'
|
|
32
|
-
}));
|
|
33
|
-
`, { mode: 0o755 });
|
|
34
|
-
const previousBin = process.env.AI_HIST_PAIR_CHECK_BIN;
|
|
35
|
-
process.env.AI_HIST_PAIR_CHECK_BIN = binPath;
|
|
36
|
-
try {
|
|
37
|
-
const result = await pairCheck({
|
|
38
|
-
context: {
|
|
39
|
-
projectId: 'proj-auth-svc',
|
|
40
|
-
repoPath: '/work/auth',
|
|
41
|
-
cwd: '/work/auth',
|
|
42
|
-
gitRemote: 'git@github.com:org/auth.git',
|
|
43
|
-
task: 'refactor auth middleware token check',
|
|
44
|
-
files: ['src/auth/middleware.ts'],
|
|
45
|
-
tool: 'Edit',
|
|
46
|
-
target: 'src/auth/middleware.ts',
|
|
47
|
-
action: 'edit',
|
|
48
|
-
recentPrompt: 'short prompt summary',
|
|
49
|
-
},
|
|
50
|
-
limit: 5,
|
|
51
|
-
});
|
|
52
|
-
assert.equal(result.decision, 'warn');
|
|
53
|
-
assert.equal(result.warnings[0].evidence?.[0].eventId, 'reflection:tA:suggestion:0');
|
|
54
|
-
assert.deepEqual(JSON.parse(await readFile(callsPath, 'utf8')), [
|
|
55
|
-
'pair',
|
|
56
|
-
'check',
|
|
57
|
-
'--json',
|
|
58
|
-
'--project-id',
|
|
59
|
-
'proj-auth-svc',
|
|
60
|
-
'--repo-path',
|
|
61
|
-
'/work/auth',
|
|
62
|
-
'--cwd',
|
|
63
|
-
'/work/auth',
|
|
64
|
-
'--git-remote',
|
|
65
|
-
'git@github.com:org/auth.git',
|
|
66
|
-
'--task',
|
|
67
|
-
'refactor auth middleware token check',
|
|
68
|
-
'--tool',
|
|
69
|
-
'Edit',
|
|
70
|
-
'--target',
|
|
71
|
-
'src/auth/middleware.ts',
|
|
72
|
-
'--action',
|
|
73
|
-
'edit',
|
|
74
|
-
'--recent-prompt',
|
|
75
|
-
'short prompt summary',
|
|
76
|
-
'--file',
|
|
77
|
-
'src/auth/middleware.ts',
|
|
78
|
-
'--limit',
|
|
79
|
-
'5',
|
|
80
|
-
]);
|
|
81
|
-
}
|
|
82
|
-
finally {
|
|
83
|
-
if (previousBin === undefined)
|
|
84
|
-
delete process.env.AI_HIST_PAIR_CHECK_BIN;
|
|
85
|
-
else
|
|
86
|
-
process.env.AI_HIST_PAIR_CHECK_BIN = previousBin;
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
test('formatPairWarnings renders advisory evidence and no-ops on empty warnings', () => {
|
|
90
|
-
assert.equal(formatPairWarnings({ decision: 'allow', warnings: [] }), '');
|
|
91
|
-
const text = formatPairWarnings({
|
|
92
|
-
decision: 'warn',
|
|
93
|
-
warnings: [
|
|
94
|
-
{
|
|
95
|
-
text: 'Prior finding applies here.',
|
|
96
|
-
kind: 'finding',
|
|
97
|
-
lens: 'trajectories',
|
|
98
|
-
score: 0.875,
|
|
99
|
-
evidence: [
|
|
100
|
-
{
|
|
101
|
-
machineId: 'm_1',
|
|
102
|
-
source: 'trajectory',
|
|
103
|
-
sessionId: 'tA',
|
|
104
|
-
eventId: 'finding:tA:learning:0',
|
|
105
|
-
ts: '2026-06-21T20:00:00Z',
|
|
106
|
-
snippet: 'rth_at hash lookup bypasses JWT verify',
|
|
107
|
-
},
|
|
108
|
-
],
|
|
109
|
-
},
|
|
110
|
-
],
|
|
111
|
-
correlationId: 'pair_1',
|
|
112
|
-
});
|
|
113
|
-
assert.match(text, /Pair advisory warnings/);
|
|
114
|
-
assert.match(text, /\[finding\/trajectories score=0\.88\]/);
|
|
115
|
-
assert.match(text, /m_1:trajectory:tA:finding:tA:learning:0/);
|
|
116
|
-
assert.match(text, /correlationId: pair_1/);
|
|
117
|
-
});
|
|
118
|
-
//# sourceMappingURL=pair-client.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pair-client.test.js","sourceRoot":"","sources":["../src/pair-client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
export interface TrajectoryDecision {
|
|
2
|
-
question: string;
|
|
3
|
-
chosen: string;
|
|
4
|
-
reasoning: string;
|
|
5
|
-
alternatives: string[];
|
|
6
|
-
}
|
|
7
|
-
export interface TrajectoryRetrospective {
|
|
8
|
-
summary: string | null;
|
|
9
|
-
approach: string | null;
|
|
10
|
-
learnings: string[];
|
|
11
|
-
confidence: unknown;
|
|
12
|
-
}
|
|
13
|
-
export interface RawTrajectory {
|
|
14
|
-
id: string;
|
|
15
|
-
version: number | null;
|
|
16
|
-
personaId: string | null;
|
|
17
|
-
projectId: string | null;
|
|
18
|
-
task: {
|
|
19
|
-
title: string | null;
|
|
20
|
-
description: string | null;
|
|
21
|
-
};
|
|
22
|
-
status: string | null;
|
|
23
|
-
startedAt: string | null;
|
|
24
|
-
completedAt: string | null;
|
|
25
|
-
decisions: TrajectoryDecision[];
|
|
26
|
-
retrospective: TrajectoryRetrospective;
|
|
27
|
-
searchText: string;
|
|
28
|
-
path: string;
|
|
29
|
-
updatedMs: number;
|
|
30
|
-
timestampMs: number;
|
|
31
|
-
}
|
|
32
|
-
export declare const DEFAULT_TRAJECTORY_SEARCH_ROOT: string;
|
|
33
|
-
export declare function trajectoryRootDescription(): string;
|
|
34
|
-
export declare function readTrajectoryFile(path: string): Promise<RawTrajectory | null>;
|
|
35
|
-
export declare function scanLocalTrajectories(): Promise<RawTrajectory[]>;
|
|
36
|
-
//# sourceMappingURL=trajectory-sources.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trajectory-sources.d.ts","sourceRoot":"","sources":["../src/trajectory-sources.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC;IACF,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,aAAa,EAAE,uBAAuB,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,8BAA8B,QAA8B,CAAC;AAyC1E,wBAAgB,yBAAyB,IAAI,MAAM,CAIlD;AA2FD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA8CpF;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CActE"}
|
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
import { readFile, readdir, stat } from 'node:fs/promises';
|
|
2
|
-
import { homedir } from 'node:os';
|
|
3
|
-
import { basename, dirname, join } from 'node:path';
|
|
4
|
-
export const DEFAULT_TRAJECTORY_SEARCH_ROOT = join(homedir(), 'Projects');
|
|
5
|
-
function yieldToEventLoop() {
|
|
6
|
-
return new Promise((resolve) => setImmediate(resolve));
|
|
7
|
-
}
|
|
8
|
-
async function safeStat(path) {
|
|
9
|
-
try {
|
|
10
|
-
const s = await stat(path);
|
|
11
|
-
return { isDirectory: s.isDirectory(), isFile: s.isFile(), size: s.size, mtimeMs: s.mtimeMs };
|
|
12
|
-
}
|
|
13
|
-
catch {
|
|
14
|
-
return null;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
async function readDirSafe(path) {
|
|
18
|
-
try {
|
|
19
|
-
return await readdir(path);
|
|
20
|
-
}
|
|
21
|
-
catch {
|
|
22
|
-
return [];
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
async function walkDirs(root, visit) {
|
|
26
|
-
const rootStat = await safeStat(root);
|
|
27
|
-
if (!rootStat?.isDirectory)
|
|
28
|
-
return;
|
|
29
|
-
await visit(root);
|
|
30
|
-
for (const name of await readDirSafe(root)) {
|
|
31
|
-
await walkDirs(join(root, name), visit);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
function configuredTrajectoryRoots() {
|
|
35
|
-
const env = process.env.TRAJECTORY_ROOT?.trim();
|
|
36
|
-
if (!env)
|
|
37
|
-
return [];
|
|
38
|
-
return env
|
|
39
|
-
.split(process.platform === 'win32' ? ';' : ':')
|
|
40
|
-
.map((part) => part.trim())
|
|
41
|
-
.filter(Boolean);
|
|
42
|
-
}
|
|
43
|
-
export function trajectoryRootDescription() {
|
|
44
|
-
const roots = configuredTrajectoryRoots();
|
|
45
|
-
if (roots.length > 0)
|
|
46
|
-
return roots.join(', ');
|
|
47
|
-
return join(DEFAULT_TRAJECTORY_SEARCH_ROOT, '**', '.trajectories');
|
|
48
|
-
}
|
|
49
|
-
async function defaultTrajectoryRoots() {
|
|
50
|
-
const projects = await safeStat(DEFAULT_TRAJECTORY_SEARCH_ROOT);
|
|
51
|
-
if (!projects?.isDirectory)
|
|
52
|
-
return [];
|
|
53
|
-
const roots = [];
|
|
54
|
-
await walkDirs(DEFAULT_TRAJECTORY_SEARCH_ROOT, async (path) => {
|
|
55
|
-
if (basename(path) === '.trajectories')
|
|
56
|
-
roots.push(path);
|
|
57
|
-
});
|
|
58
|
-
return roots.sort();
|
|
59
|
-
}
|
|
60
|
-
async function trajectoryRoots() {
|
|
61
|
-
const configured = configuredTrajectoryRoots();
|
|
62
|
-
if (configured.length > 0)
|
|
63
|
-
return configured;
|
|
64
|
-
return defaultTrajectoryRoots();
|
|
65
|
-
}
|
|
66
|
-
async function compactedJsonFiles(root) {
|
|
67
|
-
const rootStat = await safeStat(root);
|
|
68
|
-
if (!rootStat)
|
|
69
|
-
return [];
|
|
70
|
-
if (rootStat.isFile && root.endsWith('.json'))
|
|
71
|
-
return [root];
|
|
72
|
-
const searchRoot = basename(root) === 'compacted' ? dirname(root) : root;
|
|
73
|
-
const files = [];
|
|
74
|
-
await walkDirs(searchRoot, async (path) => {
|
|
75
|
-
if (basename(path) !== 'compacted')
|
|
76
|
-
return;
|
|
77
|
-
for (const name of await readDirSafe(path)) {
|
|
78
|
-
if (!name.endsWith('.json') || name === 'index.json' || name === '.sync-state.json')
|
|
79
|
-
continue;
|
|
80
|
-
const full = join(path, name);
|
|
81
|
-
if ((await safeStat(full))?.isFile)
|
|
82
|
-
files.push(full);
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
return files;
|
|
86
|
-
}
|
|
87
|
-
function isRecord(value) {
|
|
88
|
-
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
89
|
-
}
|
|
90
|
-
function asString(value) {
|
|
91
|
-
return typeof value === 'string' && value.length > 0 ? value : null;
|
|
92
|
-
}
|
|
93
|
-
function asStringArray(value) {
|
|
94
|
-
return Array.isArray(value) ? value.filter((item) => typeof item === 'string') : [];
|
|
95
|
-
}
|
|
96
|
-
function parseTimestampMs(value, fallbackMs) {
|
|
97
|
-
if (!value)
|
|
98
|
-
return fallbackMs;
|
|
99
|
-
const parsed = Date.parse(value);
|
|
100
|
-
return Number.isFinite(parsed) ? parsed : fallbackMs;
|
|
101
|
-
}
|
|
102
|
-
function normalizeDecision(value) {
|
|
103
|
-
if (!isRecord(value))
|
|
104
|
-
return null;
|
|
105
|
-
return {
|
|
106
|
-
question: asString(value.question) ?? '',
|
|
107
|
-
chosen: asString(value.chosen) ?? '',
|
|
108
|
-
reasoning: asString(value.reasoning) ?? '',
|
|
109
|
-
alternatives: asStringArray(value.alternatives),
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
function normalizeRetrospective(value) {
|
|
113
|
-
const obj = isRecord(value) ? value : {};
|
|
114
|
-
return {
|
|
115
|
-
summary: asString(obj.summary),
|
|
116
|
-
approach: asString(obj.approach),
|
|
117
|
-
learnings: asStringArray(obj.learnings),
|
|
118
|
-
confidence: obj.confidence ?? null,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
function buildSearchText(t) {
|
|
122
|
-
const parts = [
|
|
123
|
-
t.id,
|
|
124
|
-
t.personaId,
|
|
125
|
-
t.projectId,
|
|
126
|
-
t.status,
|
|
127
|
-
t.task.title,
|
|
128
|
-
t.task.description,
|
|
129
|
-
...t.decisions.flatMap((d) => [d.question, d.chosen, d.reasoning, ...d.alternatives]),
|
|
130
|
-
t.retrospective.summary,
|
|
131
|
-
t.retrospective.approach,
|
|
132
|
-
...t.retrospective.learnings,
|
|
133
|
-
t.retrospective.confidence == null ? null : String(t.retrospective.confidence),
|
|
134
|
-
];
|
|
135
|
-
return parts.filter((part) => typeof part === 'string' && part.length > 0).join('\n');
|
|
136
|
-
}
|
|
137
|
-
export async function readTrajectoryFile(path) {
|
|
138
|
-
const fileStat = await safeStat(path);
|
|
139
|
-
if (!fileStat?.isFile)
|
|
140
|
-
return null;
|
|
141
|
-
let raw;
|
|
142
|
-
try {
|
|
143
|
-
raw = JSON.parse(await readFile(path, 'utf8'));
|
|
144
|
-
}
|
|
145
|
-
catch {
|
|
146
|
-
return null;
|
|
147
|
-
}
|
|
148
|
-
if (!isRecord(raw))
|
|
149
|
-
return null;
|
|
150
|
-
const id = asString(raw.id);
|
|
151
|
-
if (!id)
|
|
152
|
-
return null;
|
|
153
|
-
if (raw.type === 'compacted' &&
|
|
154
|
-
Array.isArray(raw.sourceTrajectories) &&
|
|
155
|
-
!('task' in raw || 'retrospective' in raw || 'personaId' in raw || 'projectId' in raw)) {
|
|
156
|
-
return null;
|
|
157
|
-
}
|
|
158
|
-
const task = isRecord(raw.task) ? raw.task : {};
|
|
159
|
-
const completedAt = asString(raw.completedAt);
|
|
160
|
-
const startedAt = asString(raw.startedAt);
|
|
161
|
-
const timestampMs = parseTimestampMs(completedAt ?? startedAt ?? asString(raw.compactedAt), Math.trunc(fileStat.mtimeMs));
|
|
162
|
-
const trajectory = {
|
|
163
|
-
id,
|
|
164
|
-
version: typeof raw.version === 'number' && Number.isFinite(raw.version) ? raw.version : null,
|
|
165
|
-
personaId: asString(raw.personaId),
|
|
166
|
-
projectId: asString(raw.projectId),
|
|
167
|
-
task: {
|
|
168
|
-
title: asString(task.title),
|
|
169
|
-
description: asString(task.description),
|
|
170
|
-
},
|
|
171
|
-
status: asString(raw.status),
|
|
172
|
-
startedAt,
|
|
173
|
-
completedAt,
|
|
174
|
-
decisions: Array.isArray(raw.decisions)
|
|
175
|
-
? raw.decisions.map(normalizeDecision).filter((d) => d !== null)
|
|
176
|
-
: [],
|
|
177
|
-
retrospective: normalizeRetrospective(raw.retrospective),
|
|
178
|
-
path,
|
|
179
|
-
updatedMs: Math.trunc(fileStat.mtimeMs),
|
|
180
|
-
timestampMs,
|
|
181
|
-
};
|
|
182
|
-
return { ...trajectory, searchText: buildSearchText(trajectory) };
|
|
183
|
-
}
|
|
184
|
-
export async function scanLocalTrajectories() {
|
|
185
|
-
const roots = await trajectoryRoots();
|
|
186
|
-
const seen = new Set();
|
|
187
|
-
const trajectories = [];
|
|
188
|
-
for (const root of roots) {
|
|
189
|
-
for (const file of await compactedJsonFiles(root)) {
|
|
190
|
-
if (seen.has(file))
|
|
191
|
-
continue;
|
|
192
|
-
seen.add(file);
|
|
193
|
-
const trajectory = await readTrajectoryFile(file);
|
|
194
|
-
if (trajectory)
|
|
195
|
-
trajectories.push(trajectory);
|
|
196
|
-
}
|
|
197
|
-
await yieldToEventLoop();
|
|
198
|
-
}
|
|
199
|
-
return trajectories;
|
|
200
|
-
}
|
|
201
|
-
//# sourceMappingURL=trajectory-sources.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trajectory-sources.js","sourceRoot":"","sources":["../src/trajectory-sources.ts"],"names":[],"mappings":"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"}
|