aura-code 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +137 -0
- package/dist/agent/context.d.ts +13 -0
- package/dist/agent/context.js +183 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/loop.d.ts +60 -0
- package/dist/agent/loop.js +228 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/session-store.d.ts +30 -0
- package/dist/agent/session-store.js +178 -0
- package/dist/agent/session-store.js.map +1 -0
- package/dist/agent/spawner.d.ts +57 -0
- package/dist/agent/spawner.js +112 -0
- package/dist/agent/spawner.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +3 -0
- package/dist/agent/system-prompt.js +100 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/architect/engine.d.ts +47 -0
- package/dist/architect/engine.js +217 -0
- package/dist/architect/engine.js.map +1 -0
- package/dist/architect/types.d.ts +61 -0
- package/dist/architect/types.js +6 -0
- package/dist/architect/types.js.map +1 -0
- package/dist/cli/diamond.d.ts +1 -0
- package/dist/cli/diamond.js +23 -0
- package/dist/cli/diamond.js.map +1 -0
- package/dist/cli/display.d.ts +44 -0
- package/dist/cli/display.js +234 -0
- package/dist/cli/display.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +1734 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/defaults.d.ts +46 -0
- package/dist/config/defaults.js +106 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/project-config.d.ts +90 -0
- package/dist/config/project-config.js +141 -0
- package/dist/config/project-config.js.map +1 -0
- package/dist/harness/proposer.d.ts +26 -0
- package/dist/harness/proposer.js +204 -0
- package/dist/harness/proposer.js.map +1 -0
- package/dist/harness/weakness-miner.d.ts +28 -0
- package/dist/harness/weakness-miner.js +359 -0
- package/dist/harness/weakness-miner.js.map +1 -0
- package/dist/integrations/harnesses.d.ts +23 -0
- package/dist/integrations/harnesses.js +161 -0
- package/dist/integrations/harnesses.js.map +1 -0
- package/dist/orchestration/competence.d.ts +53 -0
- package/dist/orchestration/competence.js +181 -0
- package/dist/orchestration/competence.js.map +1 -0
- package/dist/orchestration/executor.d.ts +42 -0
- package/dist/orchestration/executor.js +206 -0
- package/dist/orchestration/executor.js.map +1 -0
- package/dist/orchestration/index.d.ts +20 -0
- package/dist/orchestration/index.js +39 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/orchestrator-prompts.d.ts +11 -0
- package/dist/orchestration/orchestrator-prompts.js +153 -0
- package/dist/orchestration/orchestrator-prompts.js.map +1 -0
- package/dist/orchestration/orchestrator.d.ts +27 -0
- package/dist/orchestration/orchestrator.js +169 -0
- package/dist/orchestration/orchestrator.js.map +1 -0
- package/dist/orchestration/plan-store.d.ts +53 -0
- package/dist/orchestration/plan-store.js +176 -0
- package/dist/orchestration/plan-store.js.map +1 -0
- package/dist/orchestration/router-prompts.d.ts +6 -0
- package/dist/orchestration/router-prompts.js +55 -0
- package/dist/orchestration/router-prompts.js.map +1 -0
- package/dist/orchestration/router.d.ts +23 -0
- package/dist/orchestration/router.js +70 -0
- package/dist/orchestration/router.js.map +1 -0
- package/dist/orchestration/ruby-detect.d.ts +6 -0
- package/dist/orchestration/ruby-detect.js +130 -0
- package/dist/orchestration/ruby-detect.js.map +1 -0
- package/dist/orchestration/ruby-types.d.ts +44 -0
- package/dist/orchestration/ruby-types.js +6 -0
- package/dist/orchestration/ruby-types.js.map +1 -0
- package/dist/orchestration/specialist-prompts.d.ts +19 -0
- package/dist/orchestration/specialist-prompts.js +143 -0
- package/dist/orchestration/specialist-prompts.js.map +1 -0
- package/dist/orchestration/specialists.d.ts +66 -0
- package/dist/orchestration/specialists.js +175 -0
- package/dist/orchestration/specialists.js.map +1 -0
- package/dist/orchestration/types.d.ts +82 -0
- package/dist/orchestration/types.js +6 -0
- package/dist/orchestration/types.js.map +1 -0
- package/dist/perception/extractor.d.ts +7 -0
- package/dist/perception/extractor.js +521 -0
- package/dist/perception/extractor.js.map +1 -0
- package/dist/perception/graph-store.d.ts +25 -0
- package/dist/perception/graph-store.js +117 -0
- package/dist/perception/graph-store.js.map +1 -0
- package/dist/perception/index.d.ts +4 -0
- package/dist/perception/index.js +18 -0
- package/dist/perception/index.js.map +1 -0
- package/dist/perception/queries.d.ts +29 -0
- package/dist/perception/queries.js +354 -0
- package/dist/perception/queries.js.map +1 -0
- package/dist/perception/types.d.ts +103 -0
- package/dist/perception/types.js +6 -0
- package/dist/perception/types.js.map +1 -0
- package/dist/providers/anthropic.d.ts +11 -0
- package/dist/providers/anthropic.js +172 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/factory.d.ts +58 -0
- package/dist/providers/factory.js +354 -0
- package/dist/providers/factory.js.map +1 -0
- package/dist/providers/fallback.d.ts +24 -0
- package/dist/providers/fallback.js +72 -0
- package/dist/providers/fallback.js.map +1 -0
- package/dist/providers/google.d.ts +11 -0
- package/dist/providers/google.js +129 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +24 -0
- package/dist/providers/openai-compatible.js +216 -0
- package/dist/providers/openai-compatible.js.map +1 -0
- package/dist/providers/resilient-factory.d.ts +24 -0
- package/dist/providers/resilient-factory.js +57 -0
- package/dist/providers/resilient-factory.js.map +1 -0
- package/dist/providers/resilient.d.ts +63 -0
- package/dist/providers/resilient.js +145 -0
- package/dist/providers/resilient.js.map +1 -0
- package/dist/providers/types.d.ts +84 -0
- package/dist/providers/types.js +6 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/ruby/alternator.d.ts +40 -0
- package/dist/ruby/alternator.js +233 -0
- package/dist/ruby/alternator.js.map +1 -0
- package/dist/ruby/competence.d.ts +34 -0
- package/dist/ruby/competence.js +264 -0
- package/dist/ruby/competence.js.map +1 -0
- package/dist/ruby/episode-capture.d.ts +56 -0
- package/dist/ruby/episode-capture.js +193 -0
- package/dist/ruby/episode-capture.js.map +1 -0
- package/dist/ruby/fine-tune.d.ts +16 -0
- package/dist/ruby/fine-tune.js +253 -0
- package/dist/ruby/fine-tune.js.map +1 -0
- package/dist/ruby/index.d.ts +10 -0
- package/dist/ruby/index.js +26 -0
- package/dist/ruby/index.js.map +1 -0
- package/dist/ruby/ruby-model.d.ts +36 -0
- package/dist/ruby/ruby-model.js +81 -0
- package/dist/ruby/ruby-model.js.map +1 -0
- package/dist/ruby/training-data.d.ts +11 -0
- package/dist/ruby/training-data.js +107 -0
- package/dist/ruby/training-data.js.map +1 -0
- package/dist/ruby/types.d.ts +136 -0
- package/dist/ruby/types.js +20 -0
- package/dist/ruby/types.js.map +1 -0
- package/dist/safety/permissions.d.ts +32 -0
- package/dist/safety/permissions.js +304 -0
- package/dist/safety/permissions.js.map +1 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/index.js +342 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/session.d.ts +22 -0
- package/dist/server/session.js +16 -0
- package/dist/server/session.js.map +1 -0
- package/dist/setup/first-run.d.ts +41 -0
- package/dist/setup/first-run.js +386 -0
- package/dist/setup/first-run.js.map +1 -0
- package/dist/setup/global-config.d.ts +19 -0
- package/dist/setup/global-config.js +97 -0
- package/dist/setup/global-config.js.map +1 -0
- package/dist/tools/audio-transcribe.d.ts +8 -0
- package/dist/tools/audio-transcribe.js +156 -0
- package/dist/tools/audio-transcribe.js.map +1 -0
- package/dist/tools/browser.d.ts +15 -0
- package/dist/tools/browser.js +241 -0
- package/dist/tools/browser.js.map +1 -0
- package/dist/tools/calendar.d.ts +12 -0
- package/dist/tools/calendar.js +196 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/clipboard.d.ts +7 -0
- package/dist/tools/clipboard.js +90 -0
- package/dist/tools/clipboard.js.map +1 -0
- package/dist/tools/cron.d.ts +10 -0
- package/dist/tools/cron.js +167 -0
- package/dist/tools/cron.js.map +1 -0
- package/dist/tools/edit-file.d.ts +6 -0
- package/dist/tools/edit-file.js +98 -0
- package/dist/tools/edit-file.js.map +1 -0
- package/dist/tools/email.d.ts +11 -0
- package/dist/tools/email.js +153 -0
- package/dist/tools/email.js.map +1 -0
- package/dist/tools/git.d.ts +1 -0
- package/dist/tools/git.js +7 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/http-request.d.ts +12 -0
- package/dist/tools/http-request.js +91 -0
- package/dist/tools/http-request.js.map +1 -0
- package/dist/tools/image-read.d.ts +7 -0
- package/dist/tools/image-read.js +125 -0
- package/dist/tools/image-read.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.js +201 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-dir.d.ts +1 -0
- package/dist/tools/list-dir.js +6 -0
- package/dist/tools/list-dir.js.map +1 -0
- package/dist/tools/mcp.d.ts +11 -0
- package/dist/tools/mcp.js +356 -0
- package/dist/tools/mcp.js.map +1 -0
- package/dist/tools/memory.d.ts +9 -0
- package/dist/tools/memory.js +124 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/notify.d.ts +9 -0
- package/dist/tools/notify.js +40 -0
- package/dist/tools/notify.js.map +1 -0
- package/dist/tools/read-file.d.ts +6 -0
- package/dist/tools/read-file.js +76 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/run-shell.d.ts +1 -0
- package/dist/tools/run-shell.js +6 -0
- package/dist/tools/run-shell.js.map +1 -0
- package/dist/tools/run-tests.d.ts +1 -0
- package/dist/tools/run-tests.js +6 -0
- package/dist/tools/run-tests.js.map +1 -0
- package/dist/tools/search-code.d.ts +1 -0
- package/dist/tools/search-code.js +6 -0
- package/dist/tools/search-code.js.map +1 -0
- package/dist/tools/telegram-bot.d.ts +2 -0
- package/dist/tools/telegram-bot.js +693 -0
- package/dist/tools/telegram-bot.js.map +1 -0
- package/dist/tools/telegram-safety.d.ts +52 -0
- package/dist/tools/telegram-safety.js +189 -0
- package/dist/tools/telegram-safety.js.map +1 -0
- package/dist/tools/telegram.d.ts +16 -0
- package/dist/tools/telegram.js +227 -0
- package/dist/tools/telegram.js.map +1 -0
- package/dist/tools/tools.d.ts +48 -0
- package/dist/tools/tools.js +328 -0
- package/dist/tools/tools.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +11 -0
- package/dist/tools/web-fetch.js +119 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +8 -0
- package/dist/tools/web-search.js +81 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/whatsapp.d.ts +10 -0
- package/dist/tools/whatsapp.js +222 -0
- package/dist/tools/whatsapp.js.map +1 -0
- package/dist/tools/write-file.d.ts +1 -0
- package/dist/tools/write-file.js +6 -0
- package/dist/tools/write-file.js.map +1 -0
- package/dist/tools/youtube-transcript.d.ts +9 -0
- package/dist/tools/youtube-transcript.js +200 -0
- package/dist/tools/youtube-transcript.js.map +1 -0
- package/dist/util/circuit-breaker.d.ts +44 -0
- package/dist/util/circuit-breaker.js +78 -0
- package/dist/util/circuit-breaker.js.map +1 -0
- package/dist/util/env.d.ts +18 -0
- package/dist/util/env.js +39 -0
- package/dist/util/env.js.map +1 -0
- package/dist/util/errors.d.ts +42 -0
- package/dist/util/errors.js +121 -0
- package/dist/util/errors.js.map +1 -0
- package/dist/util/rate-limiter.d.ts +71 -0
- package/dist/util/rate-limiter.js +141 -0
- package/dist/util/rate-limiter.js.map +1 -0
- package/dist/util/retry.d.ts +30 -0
- package/dist/util/retry.js +57 -0
- package/dist/util/retry.js.map +1 -0
- package/dist/util/sanitize.d.ts +16 -0
- package/dist/util/sanitize.js +255 -0
- package/dist/util/sanitize.js.map +1 -0
- package/dist/verify/checks.d.ts +21 -0
- package/dist/verify/checks.js +311 -0
- package/dist/verify/checks.js.map +1 -0
- package/dist/verify/index.d.ts +33 -0
- package/dist/verify/index.js +127 -0
- package/dist/verify/index.js.map +1 -0
- package/dist/verify/types.d.ts +20 -0
- package/dist/verify/types.js +3 -0
- package/dist/verify/types.js.map +1 -0
- package/dist/versioncheck.d.ts +22 -0
- package/dist/versioncheck.js +203 -0
- package/dist/versioncheck.js.map +1 -0
- package/dist/viz/index.d.ts +2 -0
- package/dist/viz/index.js +733 -0
- package/dist/viz/index.js.map +1 -0
- package/dist/workflows/engine.d.ts +46 -0
- package/dist/workflows/engine.js +320 -0
- package/dist/workflows/engine.js.map +1 -0
- package/dist/workflows/types.d.ts +92 -0
- package/dist/workflows/types.js +6 -0
- package/dist/workflows/types.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.savePerception = savePerception;
|
|
37
|
+
exports.loadPerception = loadPerception;
|
|
38
|
+
exports.isStale = isStale;
|
|
39
|
+
exports.clearPerception = clearPerception;
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
43
|
+
// Graph store — persistence layer for ProjectPerception snapshots
|
|
44
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
45
|
+
const DEFAULT_MAX_AGE_MS = 60 * 60 * 1000; // 1 hour
|
|
46
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
47
|
+
/**
|
|
48
|
+
* Serialise and persist a perception snapshot to disk.
|
|
49
|
+
* If `filePath` is provided it writes to that exact path; otherwise it
|
|
50
|
+
* derives `{projectRoot}/.aura/perception.json`.
|
|
51
|
+
*
|
|
52
|
+
* Writes atomically (tmp file + rename) so a crash never leaves a partial file.
|
|
53
|
+
* Creates parent directories if they do not already exist.
|
|
54
|
+
*/
|
|
55
|
+
async function savePerception(perception, filePath) {
|
|
56
|
+
const target = filePath ?? defaultPath(perception.projectRoot);
|
|
57
|
+
const dir = path.dirname(target);
|
|
58
|
+
if (!fs.existsSync(dir))
|
|
59
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
60
|
+
const tmp = target + '.tmp';
|
|
61
|
+
await fs.promises.writeFile(tmp, JSON.stringify(perception, null, 2), 'utf8');
|
|
62
|
+
await fs.promises.rename(tmp, target);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Load a previously saved perception snapshot from `filePath`.
|
|
66
|
+
* Returns `null` when the file does not exist or cannot be parsed.
|
|
67
|
+
*/
|
|
68
|
+
async function loadPerception(filePath) {
|
|
69
|
+
if (!fs.existsSync(filePath))
|
|
70
|
+
return null;
|
|
71
|
+
let raw;
|
|
72
|
+
try {
|
|
73
|
+
raw = await fs.promises.readFile(filePath, 'utf8');
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
const parsed = JSON.parse(raw);
|
|
80
|
+
if (!parsed || typeof parsed !== 'object' || !Array.isArray(parsed.nodes) || !Array.isArray(parsed.edges))
|
|
81
|
+
return null;
|
|
82
|
+
return parsed;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Return `true` when the perception's extractedAt timestamp is older than
|
|
90
|
+
* `maxAgeMs` (default: 1 hour).
|
|
91
|
+
*/
|
|
92
|
+
function isStale(perception, maxAgeMs) {
|
|
93
|
+
const threshold = maxAgeMs ?? DEFAULT_MAX_AGE_MS;
|
|
94
|
+
// Guard: missing or non-numeric extractedAt should be treated as stale
|
|
95
|
+
if (typeof perception.extractedAt !== 'number' || !Number.isFinite(perception.extractedAt))
|
|
96
|
+
return true;
|
|
97
|
+
return Date.now() - perception.extractedAt >= threshold;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Remove the on-disk perception file.
|
|
101
|
+
* Silently succeeds when the file does not exist.
|
|
102
|
+
*/
|
|
103
|
+
async function clearPerception(filePath) {
|
|
104
|
+
try {
|
|
105
|
+
if (fs.existsSync(filePath))
|
|
106
|
+
fs.unlinkSync(filePath);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Already gone — no-op
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
113
|
+
function defaultPath(projectRoot) {
|
|
114
|
+
const dir = path.join(projectRoot, '.aura');
|
|
115
|
+
return path.join(dir, 'perception.json');
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=graph-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-store.js","sourceRoot":"","sources":["../../src/perception/graph-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { extractPerception } from './extractor.js';
|
|
2
|
+
export { savePerception, loadPerception, isStale, clearPerception } from './graph-store.js';
|
|
3
|
+
export { getDependencies, getImpact, getConstraints, getRiskAreas, getTrajectory, findRelated } from './queries.js';
|
|
4
|
+
export type { ProjectPerception, ArchitectureNode, ArchitectureEdge, PerceptionQuery, PerceptionQueryResult } from './types.js';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findRelated = exports.getTrajectory = exports.getRiskAreas = exports.getConstraints = exports.getImpact = exports.getDependencies = exports.clearPerception = exports.isStale = exports.loadPerception = exports.savePerception = exports.extractPerception = void 0;
|
|
4
|
+
var extractor_js_1 = require("./extractor.js");
|
|
5
|
+
Object.defineProperty(exports, "extractPerception", { enumerable: true, get: function () { return extractor_js_1.extractPerception; } });
|
|
6
|
+
var graph_store_js_1 = require("./graph-store.js");
|
|
7
|
+
Object.defineProperty(exports, "savePerception", { enumerable: true, get: function () { return graph_store_js_1.savePerception; } });
|
|
8
|
+
Object.defineProperty(exports, "loadPerception", { enumerable: true, get: function () { return graph_store_js_1.loadPerception; } });
|
|
9
|
+
Object.defineProperty(exports, "isStale", { enumerable: true, get: function () { return graph_store_js_1.isStale; } });
|
|
10
|
+
Object.defineProperty(exports, "clearPerception", { enumerable: true, get: function () { return graph_store_js_1.clearPerception; } });
|
|
11
|
+
var queries_js_1 = require("./queries.js");
|
|
12
|
+
Object.defineProperty(exports, "getDependencies", { enumerable: true, get: function () { return queries_js_1.getDependencies; } });
|
|
13
|
+
Object.defineProperty(exports, "getImpact", { enumerable: true, get: function () { return queries_js_1.getImpact; } });
|
|
14
|
+
Object.defineProperty(exports, "getConstraints", { enumerable: true, get: function () { return queries_js_1.getConstraints; } });
|
|
15
|
+
Object.defineProperty(exports, "getRiskAreas", { enumerable: true, get: function () { return queries_js_1.getRiskAreas; } });
|
|
16
|
+
Object.defineProperty(exports, "getTrajectory", { enumerable: true, get: function () { return queries_js_1.getTrajectory; } });
|
|
17
|
+
Object.defineProperty(exports, "findRelated", { enumerable: true, get: function () { return queries_js_1.findRelated; } });
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/perception/index.ts"],"names":[],"mappings":";;;AAAA,+CAAmD;AAA1C,iHAAA,iBAAiB,OAAA;AAC1B,mDAA4F;AAAnF,gHAAA,cAAc,OAAA;AAAE,gHAAA,cAAc,OAAA;AAAE,yGAAA,OAAO,OAAA;AAAE,iHAAA,eAAe,OAAA;AACjE,2CAAoH;AAA3G,6GAAA,eAAe,OAAA;AAAE,uGAAA,SAAS,OAAA;AAAE,4GAAA,cAAc,OAAA;AAAE,0GAAA,YAAY,OAAA;AAAE,2GAAA,aAAa,OAAA;AAAE,yGAAA,WAAW,OAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ProjectPerception, PerceptionQueryResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* What does `fileOrModule` depend on?
|
|
4
|
+
* Performs a BFS following `depends_on` edges to the specified depth (default 1).
|
|
5
|
+
*/
|
|
6
|
+
export declare function getDependencies(perception: ProjectPerception, fileOrModule: string, depth?: number): PerceptionQueryResult;
|
|
7
|
+
/**
|
|
8
|
+
* If I change `fileOrModule`, what else is affected?
|
|
9
|
+
* Finds all nodes that depend on this target (reverse `depends_on` lookup).
|
|
10
|
+
*/
|
|
11
|
+
export declare function getImpact(perception: ProjectPerception, fileOrModule: string): PerceptionQueryResult;
|
|
12
|
+
/**
|
|
13
|
+
* What rules, constraints, or risk areas apply to `fileOrModule`?
|
|
14
|
+
* Searches constraint nodes, risk areas, and read-only lists for matches.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getConstraints(perception: ProjectPerception, fileOrModule: string): PerceptionQueryResult;
|
|
17
|
+
/**
|
|
18
|
+
* Return all known high-risk or fragile areas in the codebase.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getRiskAreas(perception: ProjectPerception): PerceptionQueryResult;
|
|
21
|
+
/**
|
|
22
|
+
* Where is the project heading? What's deprecated, in-progress, or planned?
|
|
23
|
+
*/
|
|
24
|
+
export declare function getTrajectory(perception: ProjectPerception): PerceptionQueryResult;
|
|
25
|
+
/**
|
|
26
|
+
* Semantic search: find nodes related to `concept` by matching against
|
|
27
|
+
* labels and descriptions (case-insensitive substring match).
|
|
28
|
+
*/
|
|
29
|
+
export declare function findRelated(perception: ProjectPerception, concept: string): PerceptionQueryResult;
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDependencies = getDependencies;
|
|
4
|
+
exports.getImpact = getImpact;
|
|
5
|
+
exports.getConstraints = getConstraints;
|
|
6
|
+
exports.getRiskAreas = getRiskAreas;
|
|
7
|
+
exports.getTrajectory = getTrajectory;
|
|
8
|
+
exports.findRelated = findRelated;
|
|
9
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
10
|
+
// Internal helpers
|
|
11
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
12
|
+
function emptyResult(queryType, target, reason) {
|
|
13
|
+
return {
|
|
14
|
+
query: { type: queryType, target },
|
|
15
|
+
nodes: [],
|
|
16
|
+
edges: [],
|
|
17
|
+
summary: reason,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Find a node by its id (exact match) or by label (partial match). */
|
|
21
|
+
function resolveTarget(perception, target) {
|
|
22
|
+
// exact id
|
|
23
|
+
const exact = perception.nodes.find(n => n.id === target);
|
|
24
|
+
if (exact)
|
|
25
|
+
return exact;
|
|
26
|
+
// exact label
|
|
27
|
+
const labelMatch = perception.nodes.find(n => n.label === target);
|
|
28
|
+
if (labelMatch)
|
|
29
|
+
return labelMatch;
|
|
30
|
+
// id ends with target
|
|
31
|
+
const suffix = perception.nodes.find(n => n.id.endsWith(target) || n.id.endsWith('/' + target));
|
|
32
|
+
if (suffix)
|
|
33
|
+
return suffix;
|
|
34
|
+
// label contains target
|
|
35
|
+
const contains = perception.nodes.find(n => n.label.includes(target));
|
|
36
|
+
if (contains)
|
|
37
|
+
return contains;
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
function bfsTraverse(perception, startId, direction, relationships, maxDepth) {
|
|
41
|
+
const relSet = new Set(Array.isArray(relationships) ? relationships : [relationships]);
|
|
42
|
+
const visited = new Set();
|
|
43
|
+
const nodeIds = new Set();
|
|
44
|
+
const edgeKeys = new Set();
|
|
45
|
+
const queue = [{ id: startId, depth: 0 }];
|
|
46
|
+
visited.add(startId);
|
|
47
|
+
while (queue.length > 0) {
|
|
48
|
+
const { id, depth } = queue.shift();
|
|
49
|
+
nodeIds.add(id);
|
|
50
|
+
if (depth >= maxDepth)
|
|
51
|
+
continue;
|
|
52
|
+
for (const e of perception.edges) {
|
|
53
|
+
if (!relSet.has(e.relationship))
|
|
54
|
+
continue;
|
|
55
|
+
const matchId = direction === 'forward' ? e.from : e.to;
|
|
56
|
+
if (matchId !== id)
|
|
57
|
+
continue;
|
|
58
|
+
const nextId = direction === 'forward' ? e.to : e.from;
|
|
59
|
+
const key = `${e.from}\0${e.to}\0${e.relationship}`;
|
|
60
|
+
edgeKeys.add(key);
|
|
61
|
+
if (!visited.has(nextId)) {
|
|
62
|
+
visited.add(nextId);
|
|
63
|
+
queue.push({ id: nextId, depth: depth + 1 });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return { nodeIds, edgeKeys };
|
|
68
|
+
}
|
|
69
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
70
|
+
// Public query functions
|
|
71
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
72
|
+
/**
|
|
73
|
+
* What does `fileOrModule` depend on?
|
|
74
|
+
* Performs a BFS following `depends_on` edges to the specified depth (default 1).
|
|
75
|
+
*/
|
|
76
|
+
function getDependencies(perception, fileOrModule, depth = 1) {
|
|
77
|
+
const target = resolveTarget(perception, fileOrModule);
|
|
78
|
+
if (!target) {
|
|
79
|
+
return emptyResult('dependencies', fileOrModule, `No node found matching "${fileOrModule}".`);
|
|
80
|
+
}
|
|
81
|
+
const { nodeIds, edgeKeys } = bfsTraverse(perception, target.id, 'forward', ['depends_on', 'deprecated_by'], depth);
|
|
82
|
+
const existingNodes = perception.nodes.filter(n => nodeIds.has(n.id));
|
|
83
|
+
const existingIds = new Set(existingNodes.map(n => n.id));
|
|
84
|
+
// Create lightweight placeholder nodes for edge targets that don't have
|
|
85
|
+
// full node entries (e.g. a deprecated_by edge pointing to a future file).
|
|
86
|
+
for (const id of nodeIds) {
|
|
87
|
+
if (!existingIds.has(id)) {
|
|
88
|
+
existingNodes.push({
|
|
89
|
+
id,
|
|
90
|
+
type: 'file',
|
|
91
|
+
label: id,
|
|
92
|
+
description: `Referenced by an edge: ${id}`,
|
|
93
|
+
metadata: {},
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const edges = perception.edges.filter(e => edgeKeys.has(`${e.from}\0${e.to}\0${e.relationship}`));
|
|
98
|
+
// don't count the target itself in the dependency list for summary
|
|
99
|
+
const depCount = nodeIds.size - (nodeIds.has(target.id) ? 1 : 0);
|
|
100
|
+
const depNames = existingNodes.filter(n => n.id !== target.id).map(n => n.label).join(', ');
|
|
101
|
+
let summary;
|
|
102
|
+
if (depCount === 0) {
|
|
103
|
+
summary = `"${target.label}" has no recorded dependencies at depth ${depth}.`;
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
summary = `"${target.label}" depends on ${depCount} node${depCount === 1 ? '' : 's'} at depth ${depth}: ${depNames || '(external or unresolved)'}.`;
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
query: { type: 'dependencies', target: target.id },
|
|
110
|
+
nodes: existingNodes,
|
|
111
|
+
edges,
|
|
112
|
+
summary,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* If I change `fileOrModule`, what else is affected?
|
|
117
|
+
* Finds all nodes that depend on this target (reverse `depends_on` lookup).
|
|
118
|
+
*/
|
|
119
|
+
function getImpact(perception, fileOrModule) {
|
|
120
|
+
const target = resolveTarget(perception, fileOrModule);
|
|
121
|
+
if (!target) {
|
|
122
|
+
return emptyResult('impact', fileOrModule, `No node found matching "${fileOrModule}".`);
|
|
123
|
+
}
|
|
124
|
+
const { nodeIds, edgeKeys } = bfsTraverse(perception, target.id, 'reverse', ['depends_on', 'extends', 'implements', 'tests'], 3);
|
|
125
|
+
const nodes = perception.nodes.filter(n => nodeIds.has(n.id));
|
|
126
|
+
const edges = perception.edges.filter(e => edgeKeys.has(`${e.from}\0${e.to}\0${e.relationship}`));
|
|
127
|
+
const impactCount = nodeIds.size - (nodeIds.has(target.id) ? 1 : 0);
|
|
128
|
+
const impactNames = nodes.filter(n => n.id !== target.id).map(n => n.label).join(', ');
|
|
129
|
+
let summary;
|
|
130
|
+
if (impactCount === 0) {
|
|
131
|
+
summary = `Changing "${target.label}" is unlikely to impact other nodes — nothing currently depends on it.`;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
summary = `Changing "${target.label}" may impact ${impactCount} node${impactCount === 1 ? '' : 's'}: ${impactNames}. Review these before making changes.`;
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
query: { type: 'impact', target: target.id },
|
|
138
|
+
nodes,
|
|
139
|
+
edges,
|
|
140
|
+
summary,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* What rules, constraints, or risk areas apply to `fileOrModule`?
|
|
145
|
+
* Searches constraint nodes, risk areas, and read-only lists for matches.
|
|
146
|
+
*/
|
|
147
|
+
function getConstraints(perception, fileOrModule) {
|
|
148
|
+
const target = resolveTarget(perception, fileOrModule);
|
|
149
|
+
const matchId = target?.id ?? fileOrModule;
|
|
150
|
+
const matchLabel = target?.label ?? fileOrModule;
|
|
151
|
+
const relevantNodes = [];
|
|
152
|
+
const relevantEdges = [];
|
|
153
|
+
// Check readOnly paths
|
|
154
|
+
for (const ro of perception.constraints.readOnly) {
|
|
155
|
+
if (matchId.startsWith(ro) || matchId === ro) {
|
|
156
|
+
const roNode = perception.nodes.find(n => n.id === `constraint:readonly:${ro}`);
|
|
157
|
+
if (roNode) {
|
|
158
|
+
relevantNodes.push(roNode);
|
|
159
|
+
const edge = perception.edges.find(e => e.from === roNode.id);
|
|
160
|
+
if (edge)
|
|
161
|
+
relevantEdges.push(edge);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// Check risk areas
|
|
166
|
+
for (const ra of perception.constraints.riskAreas) {
|
|
167
|
+
if (matchId.startsWith(ra) || matchId === ra) {
|
|
168
|
+
const raNode = perception.nodes.find(n => n.id === ra || n.id === 'constraint:risk-areas');
|
|
169
|
+
if (raNode && !relevantNodes.includes(raNode)) {
|
|
170
|
+
relevantNodes.push(raNode);
|
|
171
|
+
}
|
|
172
|
+
const edge = perception.edges.find(e => (e.from === ra || e.from === matchId) && e.to === 'constraint:risk-areas');
|
|
173
|
+
if (edge)
|
|
174
|
+
relevantEdges.push(edge);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Check constraint / decision nodes related via edges
|
|
178
|
+
for (const e of perception.edges) {
|
|
179
|
+
const isConstraint = ['aligns_with', 'violates', 'implements'].includes(e.relationship);
|
|
180
|
+
if (!isConstraint)
|
|
181
|
+
continue;
|
|
182
|
+
if (e.from === matchId || e.to === matchId) {
|
|
183
|
+
const otherId = e.from === matchId ? e.to : e.from;
|
|
184
|
+
const node = perception.nodes.find(n => n.id === otherId);
|
|
185
|
+
if (node && (node.type === 'constraint' || node.type === 'decision')) {
|
|
186
|
+
if (!relevantNodes.includes(node))
|
|
187
|
+
relevantNodes.push(node);
|
|
188
|
+
if (!relevantEdges.includes(e))
|
|
189
|
+
relevantEdges.push(e);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Check test coverage for this module
|
|
194
|
+
const moduleDir = pathDir(matchId);
|
|
195
|
+
const tc = perception.constraints.testCoverage.find(t => t.module === moduleDir);
|
|
196
|
+
const readOnlyMatch = perception.constraints.readOnly.some(ro => matchId.startsWith(ro) || matchId === ro);
|
|
197
|
+
const riskMatch = perception.constraints.riskAreas.some(ra => matchId.startsWith(ra) || matchId === ra);
|
|
198
|
+
let summary;
|
|
199
|
+
if (relevantNodes.length === 0) {
|
|
200
|
+
summary = `No specific constraints or risk markers apply to "${matchLabel}".`;
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
const parts = [];
|
|
204
|
+
if (readOnlyMatch)
|
|
205
|
+
parts.push('it is marked read-only');
|
|
206
|
+
if (riskMatch)
|
|
207
|
+
parts.push('it is flagged as a risk area');
|
|
208
|
+
if (tc)
|
|
209
|
+
parts.push(`test coverage is ${tc.coverage}`);
|
|
210
|
+
if (parts.length === 0)
|
|
211
|
+
parts.push(`${relevantNodes.length} constraint/decision node(s) relate to this area`);
|
|
212
|
+
summary = `"${matchLabel}" has relevant constraints: ${parts.join('; ')}.`;
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
query: { type: 'constraints', target: matchId },
|
|
216
|
+
nodes: relevantNodes,
|
|
217
|
+
edges: relevantEdges,
|
|
218
|
+
summary,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Return all known high-risk or fragile areas in the codebase.
|
|
223
|
+
*/
|
|
224
|
+
function getRiskAreas(perception) {
|
|
225
|
+
const riskIds = new Set(perception.constraints.riskAreas);
|
|
226
|
+
const relevantNodes = [];
|
|
227
|
+
const relevantEdges = [];
|
|
228
|
+
// The constraint node itself
|
|
229
|
+
const raConstraint = perception.nodes.find(n => n.id === 'constraint:risk-areas');
|
|
230
|
+
if (raConstraint)
|
|
231
|
+
relevantNodes.push(raConstraint);
|
|
232
|
+
// Individual risk area file/module nodes
|
|
233
|
+
for (const raId of riskIds) {
|
|
234
|
+
const node = perception.nodes.find(n => n.id === raId);
|
|
235
|
+
if (node)
|
|
236
|
+
relevantNodes.push(node);
|
|
237
|
+
const edge = perception.edges.find(e => (e.from === raId || e.to === raId) && e.relationship === 'violates');
|
|
238
|
+
if (edge)
|
|
239
|
+
relevantEdges.push(edge);
|
|
240
|
+
}
|
|
241
|
+
let summary;
|
|
242
|
+
if (riskIds.size === 0) {
|
|
243
|
+
summary = 'No risk areas have been identified in this project.';
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
const names = [...riskIds].join(', ');
|
|
247
|
+
summary = `${riskIds.size} risk area${riskIds.size === 1 ? '' : 's'} identified: ${names}. These files have TODOs, FIXMEs, or are imported by many other files. Exercise caution when modifying them.`;
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
query: { type: 'risk', target: 'all' },
|
|
251
|
+
nodes: relevantNodes,
|
|
252
|
+
edges: relevantEdges,
|
|
253
|
+
summary,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Where is the project heading? What's deprecated, in-progress, or planned?
|
|
258
|
+
*/
|
|
259
|
+
function getTrajectory(perception) {
|
|
260
|
+
const relevantNodes = [];
|
|
261
|
+
const relevantEdges = [];
|
|
262
|
+
const seen = new Set();
|
|
263
|
+
// Deprecated nodes — only return nodes that exist in the perception
|
|
264
|
+
for (const depId of perception.trajectory.deprecated) {
|
|
265
|
+
const node = perception.nodes.find(n => n.id === depId);
|
|
266
|
+
if (node && !seen.has(node.id)) {
|
|
267
|
+
seen.add(node.id);
|
|
268
|
+
relevantNodes.push(node);
|
|
269
|
+
}
|
|
270
|
+
const depEdge = perception.edges.find(e => e.from === depId && e.relationship === 'deprecated_by');
|
|
271
|
+
if (depEdge && !relevantEdges.includes(depEdge))
|
|
272
|
+
relevantEdges.push(depEdge);
|
|
273
|
+
}
|
|
274
|
+
// In-progress nodes
|
|
275
|
+
for (const ipId of perception.trajectory.inProgress) {
|
|
276
|
+
const node = perception.nodes.find(n => n.id === ipId);
|
|
277
|
+
if (node && !seen.has(node.id)) {
|
|
278
|
+
seen.add(node.id);
|
|
279
|
+
relevantNodes.push(node);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Planned nodes — only include if they exist as real nodes
|
|
283
|
+
for (const pId of perception.trajectory.planned) {
|
|
284
|
+
const node = perception.nodes.find(n => n.id === pId);
|
|
285
|
+
if (node && !seen.has(node.id)) {
|
|
286
|
+
seen.add(node.id);
|
|
287
|
+
relevantNodes.push(node);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
const parts = [];
|
|
291
|
+
if (perception.trajectory.vision)
|
|
292
|
+
parts.push(`vision: "${perception.trajectory.vision}"`);
|
|
293
|
+
if (perception.trajectory.deprecated.length)
|
|
294
|
+
parts.push(`${perception.trajectory.deprecated.length} item(s) deprecated`);
|
|
295
|
+
if (perception.trajectory.inProgress.length)
|
|
296
|
+
parts.push(`${perception.trajectory.inProgress.length} item(s) in progress`);
|
|
297
|
+
if (perception.trajectory.planned.length)
|
|
298
|
+
parts.push(`${perception.trajectory.planned.length} item(s) planned`);
|
|
299
|
+
const summary = parts.length > 0
|
|
300
|
+
? `Project trajectory: ${parts.join('; ')}.`
|
|
301
|
+
: 'No trajectory information has been extracted yet.';
|
|
302
|
+
return {
|
|
303
|
+
query: { type: 'trajectory', target: 'all' },
|
|
304
|
+
nodes: relevantNodes,
|
|
305
|
+
edges: relevantEdges,
|
|
306
|
+
summary,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Semantic search: find nodes related to `concept` by matching against
|
|
311
|
+
* labels and descriptions (case-insensitive substring match).
|
|
312
|
+
*/
|
|
313
|
+
function findRelated(perception, concept) {
|
|
314
|
+
const lower = concept.toLowerCase();
|
|
315
|
+
const matched = perception.nodes.filter(n => n.label.toLowerCase().includes(lower) ||
|
|
316
|
+
n.description.toLowerCase().includes(lower) ||
|
|
317
|
+
n.id.toLowerCase().includes(lower));
|
|
318
|
+
if (matched.length === 0) {
|
|
319
|
+
return {
|
|
320
|
+
query: { type: 'related', target: concept },
|
|
321
|
+
nodes: [],
|
|
322
|
+
edges: [],
|
|
323
|
+
summary: `No nodes found related to "${concept}". Try a different search term.`,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
const matchIds = new Set(matched.map(n => n.id));
|
|
327
|
+
const relatedEdges = perception.edges.filter(e => matchIds.has(e.from) || matchIds.has(e.to));
|
|
328
|
+
// Also pull in nodes connected to matched nodes by a single edge
|
|
329
|
+
const extraNodeIds = new Set();
|
|
330
|
+
for (const e of relatedEdges) {
|
|
331
|
+
if (!matchIds.has(e.from))
|
|
332
|
+
extraNodeIds.add(e.from);
|
|
333
|
+
if (!matchIds.has(e.to))
|
|
334
|
+
extraNodeIds.add(e.to);
|
|
335
|
+
}
|
|
336
|
+
const extraNodes = perception.nodes.filter(n => extraNodeIds.has(n.id));
|
|
337
|
+
const allNodes = [...matched, ...extraNodes];
|
|
338
|
+
const names = matched.map(n => n.label).join(', ');
|
|
339
|
+
const summary = `Found ${matched.length} node${matched.length === 1 ? '' : 's'} related to "${concept}": ${names}.`;
|
|
340
|
+
return {
|
|
341
|
+
query: { type: 'related', target: concept },
|
|
342
|
+
nodes: allNodes,
|
|
343
|
+
edges: relatedEdges,
|
|
344
|
+
summary,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
348
|
+
// Browser-compatible path.dirname (avoid import for CommonJS interop)
|
|
349
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
350
|
+
function pathDir(p) {
|
|
351
|
+
const i = p.lastIndexOf('/');
|
|
352
|
+
return i === -1 ? '.' : p.slice(0, i);
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/perception/queries.ts"],"names":[],"mappings":"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"}
|