iranti 0.1.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/.env.example +63 -0
- package/LICENSE +12 -0
- package/README.md +520 -0
- package/bin/iranti.js +24 -0
- package/dist/scripts/api-key-create.js +57 -0
- package/dist/scripts/api-key-list.js +42 -0
- package/dist/scripts/api-key-revoke.js +42 -0
- package/dist/scripts/iranti-cli.js +387 -0
- package/dist/scripts/seed-codebase.js +138 -0
- package/dist/scripts/seed.js +121 -0
- package/dist/scripts/setup.js +86 -0
- package/dist/src/api/archivistScheduler.d.ts +8 -0
- package/dist/src/api/archivistScheduler.d.ts.map +1 -0
- package/dist/src/api/archivistScheduler.js +100 -0
- package/dist/src/api/archivistScheduler.js.map +1 -0
- package/dist/src/api/diag.d.ts +2 -0
- package/dist/src/api/diag.d.ts.map +1 -0
- package/dist/src/api/diag.js +54 -0
- package/dist/src/api/diag.js.map +1 -0
- package/dist/src/api/middleware/auth.d.ts +3 -0
- package/dist/src/api/middleware/auth.d.ts.map +1 -0
- package/dist/src/api/middleware/auth.js +36 -0
- package/dist/src/api/middleware/auth.js.map +1 -0
- package/dist/src/api/middleware/authorization.d.ts +4 -0
- package/dist/src/api/middleware/authorization.d.ts.map +1 -0
- package/dist/src/api/middleware/authorization.js +54 -0
- package/dist/src/api/middleware/authorization.js.map +1 -0
- package/dist/src/api/middleware/rateLimit.d.ts +23 -0
- package/dist/src/api/middleware/rateLimit.d.ts.map +1 -0
- package/dist/src/api/middleware/rateLimit.js +70 -0
- package/dist/src/api/middleware/rateLimit.js.map +1 -0
- package/dist/src/api/middleware/validation.d.ts +128 -0
- package/dist/src/api/middleware/validation.d.ts.map +1 -0
- package/dist/src/api/middleware/validation.js +137 -0
- package/dist/src/api/middleware/validation.js.map +1 -0
- package/dist/src/api/repro.d.ts +2 -0
- package/dist/src/api/repro.d.ts.map +1 -0
- package/dist/src/api/repro.js +25 -0
- package/dist/src/api/repro.js.map +1 -0
- package/dist/src/api/routes/agents.d.ts +4 -0
- package/dist/src/api/routes/agents.d.ts.map +1 -0
- package/dist/src/api/routes/agents.js +56 -0
- package/dist/src/api/routes/agents.js.map +1 -0
- package/dist/src/api/routes/batch.d.ts +2 -0
- package/dist/src/api/routes/batch.d.ts.map +1 -0
- package/dist/src/api/routes/batch.js +63 -0
- package/dist/src/api/routes/batch.js.map +1 -0
- package/dist/src/api/routes/dev.d.ts +2 -0
- package/dist/src/api/routes/dev.d.ts.map +1 -0
- package/dist/src/api/routes/dev.js +29 -0
- package/dist/src/api/routes/dev.js.map +1 -0
- package/dist/src/api/routes/knowledge.d.ts +4 -0
- package/dist/src/api/routes/knowledge.d.ts.map +1 -0
- package/dist/src/api/routes/knowledge.js +184 -0
- package/dist/src/api/routes/knowledge.js.map +1 -0
- package/dist/src/api/routes/memory.d.ts +4 -0
- package/dist/src/api/routes/memory.d.ts.map +1 -0
- package/dist/src/api/routes/memory.js +150 -0
- package/dist/src/api/routes/memory.js.map +1 -0
- package/dist/src/api/server.d.ts +2 -0
- package/dist/src/api/server.d.ts.map +1 -0
- package/dist/src/api/server.js +191 -0
- package/dist/src/api/server.js.map +1 -0
- package/dist/src/archivist/index.d.ts +10 -0
- package/dist/src/archivist/index.d.ts.map +1 -0
- package/dist/src/archivist/index.js +232 -0
- package/dist/src/archivist/index.js.map +1 -0
- package/dist/src/attendant/AttendantInstance.d.ts +96 -0
- package/dist/src/attendant/AttendantInstance.d.ts.map +1 -0
- package/dist/src/attendant/AttendantInstance.js +808 -0
- package/dist/src/attendant/AttendantInstance.js.map +1 -0
- package/dist/src/attendant/index.d.ts +12 -0
- package/dist/src/attendant/index.d.ts.map +1 -0
- package/dist/src/attendant/index.js +39 -0
- package/dist/src/attendant/index.js.map +1 -0
- package/dist/src/attendant/registry.d.ts +6 -0
- package/dist/src/attendant/registry.d.ts.map +1 -0
- package/dist/src/attendant/registry.js +27 -0
- package/dist/src/attendant/registry.js.map +1 -0
- package/dist/src/generated/prisma/browser.d.ts +35 -0
- package/dist/src/generated/prisma/browser.d.ts.map +1 -0
- package/dist/src/generated/prisma/browser.js +57 -0
- package/dist/src/generated/prisma/browser.js.map +1 -0
- package/dist/src/generated/prisma/client.d.ts +54 -0
- package/dist/src/generated/prisma/client.d.ts.map +1 -0
- package/dist/src/generated/prisma/client.js +71 -0
- package/dist/src/generated/prisma/client.js.map +1 -0
- package/dist/src/generated/prisma/commonInputTypes.d.ts +415 -0
- package/dist/src/generated/prisma/commonInputTypes.d.ts.map +1 -0
- package/dist/src/generated/prisma/commonInputTypes.js +12 -0
- package/dist/src/generated/prisma/commonInputTypes.js.map +1 -0
- package/dist/src/generated/prisma/enums.d.ts +2 -0
- package/dist/src/generated/prisma/enums.d.ts.map +1 -0
- package/dist/src/generated/prisma/enums.js +12 -0
- package/dist/src/generated/prisma/enums.js.map +1 -0
- package/dist/src/generated/prisma/internal/class.d.ts +186 -0
- package/dist/src/generated/prisma/internal/class.d.ts.map +1 -0
- package/dist/src/generated/prisma/internal/class.js +86 -0
- package/dist/src/generated/prisma/internal/class.js.map +1 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.d.ts +1015 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.d.ts.map +1 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.js +220 -0
- package/dist/src/generated/prisma/internal/prismaNamespace.js.map +1 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.d.ts +152 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.d.ts.map +1 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.js +191 -0
- package/dist/src/generated/prisma/internal/prismaNamespaceBrowser.js.map +1 -0
- package/dist/src/generated/prisma/models/Archive.d.ts +1425 -0
- package/dist/src/generated/prisma/models/Archive.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/Archive.js +3 -0
- package/dist/src/generated/prisma/models/Archive.js.map +1 -0
- package/dist/src/generated/prisma/models/Entity.d.ts +1129 -0
- package/dist/src/generated/prisma/models/Entity.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/Entity.js +3 -0
- package/dist/src/generated/prisma/models/Entity.js.map +1 -0
- package/dist/src/generated/prisma/models/EntityAlias.d.ts +1347 -0
- package/dist/src/generated/prisma/models/EntityAlias.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/EntityAlias.js +3 -0
- package/dist/src/generated/prisma/models/EntityAlias.js.map +1 -0
- package/dist/src/generated/prisma/models/EntityRelationship.d.ts +1143 -0
- package/dist/src/generated/prisma/models/EntityRelationship.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/EntityRelationship.js +3 -0
- package/dist/src/generated/prisma/models/EntityRelationship.js.map +1 -0
- package/dist/src/generated/prisma/models/KnowledgeEntry.d.ts +1322 -0
- package/dist/src/generated/prisma/models/KnowledgeEntry.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/KnowledgeEntry.js +3 -0
- package/dist/src/generated/prisma/models/KnowledgeEntry.js.map +1 -0
- package/dist/src/generated/prisma/models/WriteReceipt.d.ts +1147 -0
- package/dist/src/generated/prisma/models/WriteReceipt.d.ts.map +1 -0
- package/dist/src/generated/prisma/models/WriteReceipt.js +3 -0
- package/dist/src/generated/prisma/models/WriteReceipt.js.map +1 -0
- package/dist/src/generated/prisma/models.d.ts +8 -0
- package/dist/src/generated/prisma/models.d.ts.map +1 -0
- package/dist/src/generated/prisma/models.js +3 -0
- package/dist/src/generated/prisma/models.js.map +1 -0
- package/dist/src/lib/escalationPaths.d.ts +9 -0
- package/dist/src/lib/escalationPaths.d.ts.map +1 -0
- package/dist/src/lib/escalationPaths.js +38 -0
- package/dist/src/lib/escalationPaths.js.map +1 -0
- package/dist/src/lib/llm.d.ts +32 -0
- package/dist/src/lib/llm.d.ts.map +1 -0
- package/dist/src/lib/llm.js +161 -0
- package/dist/src/lib/llm.js.map +1 -0
- package/dist/src/lib/metrics.d.ts +21 -0
- package/dist/src/lib/metrics.d.ts.map +1 -0
- package/dist/src/lib/metrics.js +46 -0
- package/dist/src/lib/metrics.js.map +1 -0
- package/dist/src/lib/providers/claude.d.ts +7 -0
- package/dist/src/lib/providers/claude.d.ts.map +1 -0
- package/dist/src/lib/providers/claude.js +9 -0
- package/dist/src/lib/providers/claude.js.map +1 -0
- package/dist/src/lib/providers/gemini.d.ts +10 -0
- package/dist/src/lib/providers/gemini.d.ts.map +1 -0
- package/dist/src/lib/providers/gemini.js +40 -0
- package/dist/src/lib/providers/gemini.js.map +1 -0
- package/dist/src/lib/providers/groq.d.ts +10 -0
- package/dist/src/lib/providers/groq.d.ts.map +1 -0
- package/dist/src/lib/providers/groq.js +39 -0
- package/dist/src/lib/providers/groq.js.map +1 -0
- package/dist/src/lib/providers/mistral.d.ts +10 -0
- package/dist/src/lib/providers/mistral.d.ts.map +1 -0
- package/dist/src/lib/providers/mistral.js +39 -0
- package/dist/src/lib/providers/mistral.js.map +1 -0
- package/dist/src/lib/providers/mock.d.ts +24 -0
- package/dist/src/lib/providers/mock.d.ts.map +1 -0
- package/dist/src/lib/providers/mock.js +129 -0
- package/dist/src/lib/providers/mock.js.map +1 -0
- package/dist/src/lib/providers/ollama.d.ts +10 -0
- package/dist/src/lib/providers/ollama.d.ts.map +1 -0
- package/dist/src/lib/providers/ollama.js +39 -0
- package/dist/src/lib/providers/ollama.js.map +1 -0
- package/dist/src/lib/providers/openai.d.ts +11 -0
- package/dist/src/lib/providers/openai.d.ts.map +1 -0
- package/dist/src/lib/providers/openai.js +38 -0
- package/dist/src/lib/providers/openai.js.map +1 -0
- package/dist/src/lib/requestContext.d.ts +8 -0
- package/dist/src/lib/requestContext.d.ts.map +1 -0
- package/dist/src/lib/requestContext.js +10 -0
- package/dist/src/lib/requestContext.js.map +1 -0
- package/dist/src/lib/router.d.ts +16 -0
- package/dist/src/lib/router.d.ts.map +1 -0
- package/dist/src/lib/router.js +63 -0
- package/dist/src/lib/router.js.map +1 -0
- package/dist/src/librarian/chunker.d.ts +16 -0
- package/dist/src/librarian/chunker.d.ts.map +1 -0
- package/dist/src/librarian/chunker.js +67 -0
- package/dist/src/librarian/chunker.js.map +1 -0
- package/dist/src/librarian/getPolicy.d.ts +3 -0
- package/dist/src/librarian/getPolicy.d.ts.map +1 -0
- package/dist/src/librarian/getPolicy.js +22 -0
- package/dist/src/librarian/getPolicy.js.map +1 -0
- package/dist/src/librarian/guards.d.ts +9 -0
- package/dist/src/librarian/guards.d.ts.map +1 -0
- package/dist/src/librarian/guards.js +52 -0
- package/dist/src/librarian/guards.js.map +1 -0
- package/dist/src/librarian/index.d.ts +20 -0
- package/dist/src/librarian/index.d.ts.map +1 -0
- package/dist/src/librarian/index.js +512 -0
- package/dist/src/librarian/index.js.map +1 -0
- package/dist/src/librarian/policy.d.ts +13 -0
- package/dist/src/librarian/policy.d.ts.map +1 -0
- package/dist/src/librarian/policy.js +20 -0
- package/dist/src/librarian/policy.js.map +1 -0
- package/dist/src/librarian/scoring.d.ts +8 -0
- package/dist/src/librarian/scoring.d.ts.map +1 -0
- package/dist/src/librarian/scoring.js +10 -0
- package/dist/src/librarian/scoring.js.map +1 -0
- package/dist/src/librarian/source-reliability.d.ts +8 -0
- package/dist/src/librarian/source-reliability.d.ts.map +1 -0
- package/dist/src/librarian/source-reliability.js +105 -0
- package/dist/src/librarian/source-reliability.js.map +1 -0
- package/dist/src/library/agent-registry.d.ts +31 -0
- package/dist/src/library/agent-registry.d.ts.map +1 -0
- package/dist/src/library/agent-registry.js +197 -0
- package/dist/src/library/agent-registry.js.map +1 -0
- package/dist/src/library/client.d.ts +5 -0
- package/dist/src/library/client.d.ts.map +1 -0
- package/dist/src/library/client.js +39 -0
- package/dist/src/library/client.js.map +1 -0
- package/dist/src/library/entity-resolution.d.ts +47 -0
- package/dist/src/library/entity-resolution.d.ts.map +1 -0
- package/dist/src/library/entity-resolution.js +344 -0
- package/dist/src/library/entity-resolution.js.map +1 -0
- package/dist/src/library/locks.d.ts +9 -0
- package/dist/src/library/locks.d.ts.map +1 -0
- package/dist/src/library/locks.js +38 -0
- package/dist/src/library/locks.js.map +1 -0
- package/dist/src/library/queries.d.ts +66 -0
- package/dist/src/library/queries.d.ts.map +1 -0
- package/dist/src/library/queries.js +169 -0
- package/dist/src/library/queries.js.map +1 -0
- package/dist/src/library/relationships.d.ts +30 -0
- package/dist/src/library/relationships.d.ts.map +1 -0
- package/dist/src/library/relationships.js +97 -0
- package/dist/src/library/relationships.js.map +1 -0
- package/dist/src/sdk/index.d.ts +108 -0
- package/dist/src/sdk/index.d.ts.map +1 -0
- package/dist/src/sdk/index.js +323 -0
- package/dist/src/sdk/index.js.map +1 -0
- package/dist/src/security/apiKeys.d.ts +48 -0
- package/dist/src/security/apiKeys.d.ts.map +1 -0
- package/dist/src/security/apiKeys.js +279 -0
- package/dist/src/security/apiKeys.js.map +1 -0
- package/dist/src/types.d.ts +54 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +4 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +86 -0
- package/prisma/migrations/20260228090200_init/migration.sql +49 -0
- package/prisma/migrations/20260228121746_add_properties_and_relationships/migration.sql +29 -0
- package/prisma/migrations/20260301223834_add_superseded_by_pointer/migration.sql +4 -0
- package/prisma/migrations/20260301225152_add_write_receipts/migration.sql +20 -0
- package/prisma/migrations/20260302135650_entity_resolution/migration.sql +33 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +118 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require("dotenv/config");
|
|
4
|
+
const client_1 = require("../src/library/client");
|
|
5
|
+
const apiKeys_1 = require("../src/security/apiKeys");
|
|
6
|
+
async function main() {
|
|
7
|
+
const dbUrl = process.env.DATABASE_URL;
|
|
8
|
+
if (!dbUrl) {
|
|
9
|
+
console.error('DATABASE_URL is required.');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
(0, client_1.initDb)(dbUrl);
|
|
13
|
+
const keys = await (0, apiKeys_1.listApiKeys)();
|
|
14
|
+
if (keys.length === 0) {
|
|
15
|
+
console.log('No registry API keys found.');
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
console.log(`Found ${keys.length} registry API key(s):\n`);
|
|
19
|
+
for (const key of keys) {
|
|
20
|
+
console.log(`- keyId: ${key.keyId}`);
|
|
21
|
+
console.log(` owner: ${key.owner}`);
|
|
22
|
+
console.log(` active: ${key.isActive}`);
|
|
23
|
+
console.log(` scopes: ${key.scopes.join(',') || '(none)'}`);
|
|
24
|
+
console.log(` createdAt: ${key.createdAt}`);
|
|
25
|
+
if (key.revokedAt) {
|
|
26
|
+
console.log(` revokedAt: ${key.revokedAt}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
await (0, client_1.getDb)().$disconnect();
|
|
31
|
+
}
|
|
32
|
+
main().catch(async (err) => {
|
|
33
|
+
console.error('Failed to list API keys:', err instanceof Error ? err.message : String(err));
|
|
34
|
+
try {
|
|
35
|
+
await (0, client_1.getDb)().$disconnect();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// ignore
|
|
39
|
+
}
|
|
40
|
+
process.exit(1);
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=api-key-list.js.map
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require("dotenv/config");
|
|
4
|
+
const client_1 = require("../src/library/client");
|
|
5
|
+
const apiKeys_1 = require("../src/security/apiKeys");
|
|
6
|
+
function parseArg(flag) {
|
|
7
|
+
const idx = process.argv.indexOf(flag);
|
|
8
|
+
if (idx === -1)
|
|
9
|
+
return undefined;
|
|
10
|
+
return process.argv[idx + 1];
|
|
11
|
+
}
|
|
12
|
+
async function main() {
|
|
13
|
+
const keyId = parseArg('--key-id') ?? parseArg('-k');
|
|
14
|
+
if (!keyId) {
|
|
15
|
+
console.error('Usage: npm run api-key:revoke -- --key-id <id>');
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
const dbUrl = process.env.DATABASE_URL;
|
|
19
|
+
if (!dbUrl) {
|
|
20
|
+
console.error('DATABASE_URL is required.');
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
(0, client_1.initDb)(dbUrl);
|
|
24
|
+
const revoked = await (0, apiKeys_1.revokeApiKey)(keyId);
|
|
25
|
+
if (!revoked) {
|
|
26
|
+
console.error(`API key not found: ${keyId}`);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
console.log(`Revoked API key: ${keyId}`);
|
|
30
|
+
await (0, client_1.getDb)().$disconnect();
|
|
31
|
+
}
|
|
32
|
+
main().catch(async (err) => {
|
|
33
|
+
console.error('Failed to revoke API key:', err instanceof Error ? err.message : String(err));
|
|
34
|
+
try {
|
|
35
|
+
await (0, client_1.getDb)().$disconnect();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// ignore
|
|
39
|
+
}
|
|
40
|
+
process.exit(1);
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=api-key-revoke.js.map
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
9
|
+
const os_1 = __importDefault(require("os"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
function parseArgs(argv) {
|
|
12
|
+
const flags = new Map();
|
|
13
|
+
const positionals = [];
|
|
14
|
+
for (let i = 0; i < argv.length; i++) {
|
|
15
|
+
const token = argv[i];
|
|
16
|
+
if (token.startsWith('--')) {
|
|
17
|
+
const key = token.slice(2);
|
|
18
|
+
const next = argv[i + 1];
|
|
19
|
+
if (!next || next.startsWith('--')) {
|
|
20
|
+
flags.set(key, true);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
flags.set(key, next);
|
|
24
|
+
i++;
|
|
25
|
+
}
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
positionals.push(token);
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
command: positionals[0] ?? null,
|
|
32
|
+
subcommand: positionals[1] ?? null,
|
|
33
|
+
positionals: positionals.slice(2),
|
|
34
|
+
flags,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function getFlag(args, key) {
|
|
38
|
+
const value = args.flags.get(key);
|
|
39
|
+
return typeof value === 'string' ? value : undefined;
|
|
40
|
+
}
|
|
41
|
+
function hasFlag(args, key) {
|
|
42
|
+
return Boolean(args.flags.get(key));
|
|
43
|
+
}
|
|
44
|
+
function normalizeScope(raw) {
|
|
45
|
+
if (!raw)
|
|
46
|
+
return 'user';
|
|
47
|
+
const normalized = raw.trim().toLowerCase();
|
|
48
|
+
if (normalized === 'user' || normalized === 'system')
|
|
49
|
+
return normalized;
|
|
50
|
+
throw new Error(`Invalid scope '${raw}'. Use --scope user or --scope system.`);
|
|
51
|
+
}
|
|
52
|
+
function defaultInstallRoot(scope) {
|
|
53
|
+
const platform = process.platform;
|
|
54
|
+
if (platform === 'win32') {
|
|
55
|
+
if (scope === 'system') {
|
|
56
|
+
const programData = process.env.ProgramData ?? 'C:\\ProgramData';
|
|
57
|
+
return path_1.default.join(programData, 'Iranti');
|
|
58
|
+
}
|
|
59
|
+
return path_1.default.join(os_1.default.homedir(), '.iranti');
|
|
60
|
+
}
|
|
61
|
+
if (platform === 'darwin') {
|
|
62
|
+
if (scope === 'system')
|
|
63
|
+
return '/Library/Application Support/Iranti';
|
|
64
|
+
return path_1.default.join(os_1.default.homedir(), 'Library', 'Application Support', 'iranti');
|
|
65
|
+
}
|
|
66
|
+
// linux and other unix-like
|
|
67
|
+
if (scope === 'system')
|
|
68
|
+
return '/var/lib/iranti';
|
|
69
|
+
return path_1.default.join(os_1.default.homedir(), '.local', 'share', 'iranti');
|
|
70
|
+
}
|
|
71
|
+
function resolveInstallRoot(args, scope) {
|
|
72
|
+
const explicit = getFlag(args, 'root') ?? process.env.IRANTI_HOME;
|
|
73
|
+
if (explicit)
|
|
74
|
+
return path_1.default.resolve(explicit);
|
|
75
|
+
const userRoot = defaultInstallRoot('user');
|
|
76
|
+
const systemRoot = defaultInstallRoot('system');
|
|
77
|
+
const userMeta = path_1.default.join(userRoot, 'install.json');
|
|
78
|
+
const systemMeta = path_1.default.join(systemRoot, 'install.json');
|
|
79
|
+
if (scope === 'system')
|
|
80
|
+
return systemRoot;
|
|
81
|
+
if (fs_1.default.existsSync(userMeta))
|
|
82
|
+
return userRoot;
|
|
83
|
+
if (fs_1.default.existsSync(systemMeta))
|
|
84
|
+
return systemRoot;
|
|
85
|
+
return userRoot;
|
|
86
|
+
}
|
|
87
|
+
function getPackageVersion() {
|
|
88
|
+
let dir = __dirname;
|
|
89
|
+
for (let i = 0; i < 5; i++) {
|
|
90
|
+
const pkgPath = path_1.default.join(dir, 'package.json');
|
|
91
|
+
if (fs_1.default.existsSync(pkgPath)) {
|
|
92
|
+
try {
|
|
93
|
+
const raw = fs_1.default.readFileSync(pkgPath, 'utf-8');
|
|
94
|
+
const pkg = JSON.parse(raw);
|
|
95
|
+
return String(pkg.version ?? '0.0.0');
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return '0.0.0';
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const parent = path_1.default.dirname(dir);
|
|
102
|
+
if (parent === dir)
|
|
103
|
+
break;
|
|
104
|
+
dir = parent;
|
|
105
|
+
}
|
|
106
|
+
return '0.0.0';
|
|
107
|
+
}
|
|
108
|
+
async function ensureDir(dir) {
|
|
109
|
+
await promises_1.default.mkdir(dir, { recursive: true });
|
|
110
|
+
}
|
|
111
|
+
async function writeJson(filePath, value) {
|
|
112
|
+
await promises_1.default.writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`, 'utf-8');
|
|
113
|
+
}
|
|
114
|
+
async function writeText(filePath, content) {
|
|
115
|
+
await promises_1.default.writeFile(filePath, content, 'utf-8');
|
|
116
|
+
}
|
|
117
|
+
async function readEnvFile(filePath) {
|
|
118
|
+
const out = {};
|
|
119
|
+
const raw = await promises_1.default.readFile(filePath, 'utf-8');
|
|
120
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
121
|
+
const trimmed = line.trim();
|
|
122
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
123
|
+
continue;
|
|
124
|
+
const idx = trimmed.indexOf('=');
|
|
125
|
+
if (idx <= 0)
|
|
126
|
+
continue;
|
|
127
|
+
const key = trimmed.slice(0, idx).trim();
|
|
128
|
+
const valueRaw = trimmed.slice(idx + 1).trim();
|
|
129
|
+
const value = (valueRaw.startsWith('"') && valueRaw.endsWith('"')) ||
|
|
130
|
+
(valueRaw.startsWith("'") && valueRaw.endsWith("'"))
|
|
131
|
+
? valueRaw.slice(1, -1)
|
|
132
|
+
: valueRaw;
|
|
133
|
+
out[key] = value;
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
function makeInstanceEnv(name, port, dbUrl, apiKey, instanceDir) {
|
|
138
|
+
const lines = [
|
|
139
|
+
'# Iranti instance env',
|
|
140
|
+
`IRANTI_INSTANCE_NAME=${name}`,
|
|
141
|
+
`IRANTI_PORT=${port}`,
|
|
142
|
+
`DATABASE_URL=${dbUrl}`,
|
|
143
|
+
'LLM_PROVIDER=mock',
|
|
144
|
+
`IRANTI_ESCALATION_DIR=${path_1.default.join(instanceDir, 'escalation')}`,
|
|
145
|
+
`IRANTI_REQUEST_LOG_FILE=${path_1.default.join(instanceDir, 'logs', 'api-requests.log')}`,
|
|
146
|
+
'IRANTI_ARCHIVIST_WATCH=true',
|
|
147
|
+
'IRANTI_ARCHIVIST_DEBOUNCE_MS=60000',
|
|
148
|
+
'IRANTI_ARCHIVIST_INTERVAL_MS=0',
|
|
149
|
+
`IRANTI_API_KEY=${apiKey ?? 'replace_me_with_api_key'}`,
|
|
150
|
+
'',
|
|
151
|
+
];
|
|
152
|
+
return lines.join('\n');
|
|
153
|
+
}
|
|
154
|
+
async function installCommand(args) {
|
|
155
|
+
const scope = normalizeScope(getFlag(args, 'scope'));
|
|
156
|
+
const root = resolveInstallRoot(args, scope);
|
|
157
|
+
await ensureDir(root);
|
|
158
|
+
await ensureDir(path_1.default.join(root, 'instances'));
|
|
159
|
+
await ensureDir(path_1.default.join(root, 'logs'));
|
|
160
|
+
await ensureDir(path_1.default.join(root, 'tmp'));
|
|
161
|
+
const meta = {
|
|
162
|
+
version: getPackageVersion(),
|
|
163
|
+
scope,
|
|
164
|
+
root,
|
|
165
|
+
installedAt: new Date().toISOString(),
|
|
166
|
+
};
|
|
167
|
+
await writeJson(path_1.default.join(root, 'install.json'), meta);
|
|
168
|
+
console.log(`Iranti runtime initialized`);
|
|
169
|
+
console.log(` scope: ${scope}`);
|
|
170
|
+
console.log(` root : ${root}`);
|
|
171
|
+
console.log(`Next: iranti instance create local --port 3001`);
|
|
172
|
+
}
|
|
173
|
+
async function createInstanceCommand(args) {
|
|
174
|
+
const name = args.positionals[0];
|
|
175
|
+
if (!name) {
|
|
176
|
+
throw new Error('Missing instance name. Usage: iranti instance create <name> [--port 3001]');
|
|
177
|
+
}
|
|
178
|
+
const scope = normalizeScope(getFlag(args, 'scope'));
|
|
179
|
+
const root = resolveInstallRoot(args, scope);
|
|
180
|
+
const portRaw = getFlag(args, 'port') ?? '3001';
|
|
181
|
+
const port = Number.parseInt(portRaw, 10);
|
|
182
|
+
if (!Number.isFinite(port) || port <= 0)
|
|
183
|
+
throw new Error(`Invalid --port '${portRaw}'.`);
|
|
184
|
+
const dbUrl = getFlag(args, 'db-url') ??
|
|
185
|
+
`postgresql://postgres:yourpassword@localhost:5432/iranti_${name}`;
|
|
186
|
+
const apiKey = getFlag(args, 'api-key');
|
|
187
|
+
const instanceDir = path_1.default.join(root, 'instances', name);
|
|
188
|
+
const envFile = path_1.default.join(instanceDir, '.env');
|
|
189
|
+
if (fs_1.default.existsSync(instanceDir) && !hasFlag(args, 'force')) {
|
|
190
|
+
throw new Error(`Instance '${name}' already exists at ${instanceDir}. Use --force to overwrite.`);
|
|
191
|
+
}
|
|
192
|
+
await ensureDir(instanceDir);
|
|
193
|
+
await ensureDir(path_1.default.join(instanceDir, 'logs'));
|
|
194
|
+
await ensureDir(path_1.default.join(instanceDir, 'escalation', 'active'));
|
|
195
|
+
await ensureDir(path_1.default.join(instanceDir, 'escalation', 'resolved'));
|
|
196
|
+
await ensureDir(path_1.default.join(instanceDir, 'escalation', 'archived'));
|
|
197
|
+
await writeText(envFile, makeInstanceEnv(name, port, dbUrl, apiKey, instanceDir));
|
|
198
|
+
const meta = {
|
|
199
|
+
name,
|
|
200
|
+
createdAt: new Date().toISOString(),
|
|
201
|
+
port,
|
|
202
|
+
envFile,
|
|
203
|
+
instanceDir,
|
|
204
|
+
};
|
|
205
|
+
await writeJson(path_1.default.join(instanceDir, 'instance.json'), meta);
|
|
206
|
+
console.log(`Instance created: ${name}`);
|
|
207
|
+
console.log(` dir : ${instanceDir}`);
|
|
208
|
+
console.log(` env : ${envFile}`);
|
|
209
|
+
console.log(` port: ${port}`);
|
|
210
|
+
console.log(`Next: iranti instance show ${name}`);
|
|
211
|
+
}
|
|
212
|
+
async function listInstancesCommand(args) {
|
|
213
|
+
const scope = normalizeScope(getFlag(args, 'scope'));
|
|
214
|
+
const root = resolveInstallRoot(args, scope);
|
|
215
|
+
const instancesDir = path_1.default.join(root, 'instances');
|
|
216
|
+
if (!fs_1.default.existsSync(instancesDir)) {
|
|
217
|
+
console.log(`No install found at ${root}. Run: iranti install`);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const entries = await promises_1.default.readdir(instancesDir, { withFileTypes: true });
|
|
221
|
+
const dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();
|
|
222
|
+
if (dirs.length === 0) {
|
|
223
|
+
console.log(`No instances found under ${instancesDir}`);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
console.log(`Instances (${instancesDir}):`);
|
|
227
|
+
for (const name of dirs) {
|
|
228
|
+
const metaPath = path_1.default.join(instancesDir, name, 'instance.json');
|
|
229
|
+
if (fs_1.default.existsSync(metaPath)) {
|
|
230
|
+
try {
|
|
231
|
+
const raw = await promises_1.default.readFile(metaPath, 'utf-8');
|
|
232
|
+
const meta = JSON.parse(raw);
|
|
233
|
+
console.log(` - ${name} (port ${meta.port})`);
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// fall through
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
console.log(` - ${name}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async function showInstanceCommand(args) {
|
|
244
|
+
const name = args.positionals[0];
|
|
245
|
+
if (!name)
|
|
246
|
+
throw new Error('Missing instance name. Usage: iranti instance show <name>');
|
|
247
|
+
const scope = normalizeScope(getFlag(args, 'scope'));
|
|
248
|
+
const root = resolveInstallRoot(args, scope);
|
|
249
|
+
const instanceDir = path_1.default.join(root, 'instances', name);
|
|
250
|
+
const envFile = path_1.default.join(instanceDir, '.env');
|
|
251
|
+
if (!fs_1.default.existsSync(envFile))
|
|
252
|
+
throw new Error(`Instance '${name}' not found at ${instanceDir}`);
|
|
253
|
+
const env = await readEnvFile(envFile);
|
|
254
|
+
console.log(`Instance: ${name}`);
|
|
255
|
+
console.log(` dir : ${instanceDir}`);
|
|
256
|
+
console.log(` env : ${envFile}`);
|
|
257
|
+
console.log(` port: ${env.IRANTI_PORT ?? '3001'}`);
|
|
258
|
+
console.log(` db : ${env.DATABASE_URL ?? '(missing)'}`);
|
|
259
|
+
console.log(` esc : ${env.IRANTI_ESCALATION_DIR ?? '(missing)'}`);
|
|
260
|
+
console.log(`Run with: iranti run --instance ${name}`);
|
|
261
|
+
}
|
|
262
|
+
async function runInstanceCommand(args) {
|
|
263
|
+
const name = getFlag(args, 'instance') ?? args.positionals[0] ?? args.subcommand;
|
|
264
|
+
if (!name)
|
|
265
|
+
throw new Error('Missing instance name. Usage: iranti run --instance <name>');
|
|
266
|
+
const scope = normalizeScope(getFlag(args, 'scope'));
|
|
267
|
+
const root = resolveInstallRoot(args, scope);
|
|
268
|
+
const envFile = path_1.default.join(root, 'instances', name, '.env');
|
|
269
|
+
if (!fs_1.default.existsSync(envFile))
|
|
270
|
+
throw new Error(`Instance '${name}' not found. Create it first.`);
|
|
271
|
+
const env = await readEnvFile(envFile);
|
|
272
|
+
for (const [k, v] of Object.entries(env)) {
|
|
273
|
+
process.env[k] = v;
|
|
274
|
+
}
|
|
275
|
+
if (!process.env.DATABASE_URL || process.env.DATABASE_URL.includes('yourpassword')) {
|
|
276
|
+
throw new Error(`Instance '${name}' has placeholder DATABASE_URL. Edit ${envFile} first.`);
|
|
277
|
+
}
|
|
278
|
+
console.log(`Starting Iranti instance '${name}' on port ${process.env.IRANTI_PORT ?? '3001'}...`);
|
|
279
|
+
const serverEntry = path_1.default.resolve(__dirname, '..', 'src', 'api', 'server');
|
|
280
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
281
|
+
require(serverEntry);
|
|
282
|
+
}
|
|
283
|
+
async function projectInitCommand(args) {
|
|
284
|
+
const projectPath = path_1.default.resolve(args.positionals[0] ?? process.cwd());
|
|
285
|
+
const instanceName = getFlag(args, 'instance');
|
|
286
|
+
if (!instanceName) {
|
|
287
|
+
throw new Error('Missing --instance <name>. Usage: iranti project init [path] --instance <name>');
|
|
288
|
+
}
|
|
289
|
+
const scope = normalizeScope(getFlag(args, 'scope'));
|
|
290
|
+
const root = resolveInstallRoot(args, scope);
|
|
291
|
+
const envFile = path_1.default.join(root, 'instances', instanceName, '.env');
|
|
292
|
+
if (!fs_1.default.existsSync(envFile))
|
|
293
|
+
throw new Error(`Instance '${instanceName}' not found. Create it first.`);
|
|
294
|
+
const instanceEnv = await readEnvFile(envFile);
|
|
295
|
+
const port = instanceEnv.IRANTI_PORT ?? '3001';
|
|
296
|
+
const apiKey = getFlag(args, 'api-key') ?? instanceEnv.IRANTI_API_KEY ?? 'replace_me_with_api_key';
|
|
297
|
+
const agentId = getFlag(args, 'agent-id') ?? 'my_agent';
|
|
298
|
+
await ensureDir(projectPath);
|
|
299
|
+
const outFile = path_1.default.join(projectPath, '.env.iranti');
|
|
300
|
+
if (fs_1.default.existsSync(outFile) && !hasFlag(args, 'force')) {
|
|
301
|
+
throw new Error(`${outFile} already exists. Use --force to overwrite.`);
|
|
302
|
+
}
|
|
303
|
+
const content = [
|
|
304
|
+
'# Iranti project binding',
|
|
305
|
+
`IRANTI_URL=http://localhost:${port}`,
|
|
306
|
+
`IRANTI_API_KEY=${apiKey}`,
|
|
307
|
+
`IRANTI_AGENT_ID=${agentId}`,
|
|
308
|
+
'IRANTI_MEMORY_ENTITY=user/main',
|
|
309
|
+
`IRANTI_INSTANCE=${instanceName}`,
|
|
310
|
+
`IRANTI_INSTANCE_ENV=${envFile}`,
|
|
311
|
+
'',
|
|
312
|
+
].join('\n');
|
|
313
|
+
await writeText(outFile, content);
|
|
314
|
+
const gitignorePath = path_1.default.join(projectPath, '.gitignore');
|
|
315
|
+
const requiredLines = ['.env.iranti', '.env.iranti.local'];
|
|
316
|
+
if (fs_1.default.existsSync(gitignorePath)) {
|
|
317
|
+
const raw = await promises_1.default.readFile(gitignorePath, 'utf-8');
|
|
318
|
+
const existing = new Set(raw.split(/\r?\n/));
|
|
319
|
+
const missing = requiredLines.filter((line) => !existing.has(line));
|
|
320
|
+
if (missing.length > 0) {
|
|
321
|
+
await promises_1.default.writeFile(gitignorePath, `${raw.trimEnd()}\n${missing.join('\n')}\n`, 'utf-8');
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
await writeText(gitignorePath, `${requiredLines.join('\n')}\n`);
|
|
326
|
+
}
|
|
327
|
+
console.log(`Project initialized at ${projectPath}`);
|
|
328
|
+
console.log(` wrote ${outFile}`);
|
|
329
|
+
console.log(`Use with Python client/middleware by loading .env.iranti`);
|
|
330
|
+
}
|
|
331
|
+
function printHelp() {
|
|
332
|
+
console.log(`Iranti CLI
|
|
333
|
+
|
|
334
|
+
Machine-level:
|
|
335
|
+
iranti install [--scope user|system] [--root <path>]
|
|
336
|
+
|
|
337
|
+
Instance-level:
|
|
338
|
+
iranti instance create <name> [--port 3001] [--db-url <url>] [--api-key <token>] [--scope user|system]
|
|
339
|
+
iranti instance list [--scope user|system]
|
|
340
|
+
iranti instance show <name> [--scope user|system]
|
|
341
|
+
iranti run --instance <name> [--scope user|system]
|
|
342
|
+
|
|
343
|
+
Project-level:
|
|
344
|
+
iranti project init [path] --instance <name> [--api-key <token>] [--agent-id <id>] [--force]
|
|
345
|
+
`);
|
|
346
|
+
}
|
|
347
|
+
async function main() {
|
|
348
|
+
const args = parseArgs(process.argv.slice(2));
|
|
349
|
+
if (!args.command || args.command === 'help' || args.command === '--help') {
|
|
350
|
+
printHelp();
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
if (args.command === 'install') {
|
|
354
|
+
await installCommand(args);
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
if (args.command === 'instance') {
|
|
358
|
+
if (args.subcommand === 'create') {
|
|
359
|
+
await createInstanceCommand(args);
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
if (args.subcommand === 'list') {
|
|
363
|
+
await listInstancesCommand(args);
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
if (args.subcommand === 'show') {
|
|
367
|
+
await showInstanceCommand(args);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
throw new Error(`Unknown instance subcommand '${args.subcommand ?? ''}'.`);
|
|
371
|
+
}
|
|
372
|
+
if (args.command === 'run') {
|
|
373
|
+
await runInstanceCommand(args);
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
if (args.command === 'project' && args.subcommand === 'init') {
|
|
377
|
+
await projectInitCommand(args);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
throw new Error(`Unknown command '${args.command}'. Run: iranti help`);
|
|
381
|
+
}
|
|
382
|
+
main().catch((err) => {
|
|
383
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
384
|
+
console.error(`Error: ${message}`);
|
|
385
|
+
process.exit(1);
|
|
386
|
+
});
|
|
387
|
+
//# sourceMappingURL=iranti-cli.js.map
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require("dotenv/config");
|
|
4
|
+
const sdk_1 = require("../src/sdk");
|
|
5
|
+
async function seedCodebase() {
|
|
6
|
+
console.log('Seeding codebase knowledge...');
|
|
7
|
+
const iranti = new sdk_1.Iranti();
|
|
8
|
+
const facts = [
|
|
9
|
+
{
|
|
10
|
+
key: 'npm_packages',
|
|
11
|
+
value: {
|
|
12
|
+
dependencies: {
|
|
13
|
+
'@anthropic-ai/sdk': '^0.78.0',
|
|
14
|
+
'@prisma/adapter-pg': '^7.4.2',
|
|
15
|
+
'@prisma/client': '^7.4.2',
|
|
16
|
+
'dotenv': '^17.3.1',
|
|
17
|
+
'pg': '^8.19.0',
|
|
18
|
+
'prisma': '^7.4.2',
|
|
19
|
+
},
|
|
20
|
+
devDependencies: {
|
|
21
|
+
'@types/pg': '^8.16.0',
|
|
22
|
+
'ts-node': '^10.9.2',
|
|
23
|
+
'typescript': '^5.0.0',
|
|
24
|
+
},
|
|
25
|
+
installCommand: 'npm install',
|
|
26
|
+
},
|
|
27
|
+
summary: 'NPM packages — prisma@7.4.2, pg@8.19.0, dotenv@17.3.1, typescript@5.0.0, @anthropic-ai/sdk@0.78.0',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
key: 'database',
|
|
31
|
+
value: {
|
|
32
|
+
engine: 'PostgreSQL',
|
|
33
|
+
version: '16',
|
|
34
|
+
name: 'iranti',
|
|
35
|
+
user: 'postgres',
|
|
36
|
+
host: 'localhost',
|
|
37
|
+
port: 5432,
|
|
38
|
+
notes: 'No password required in default local setup. Docker container: iranti_db.',
|
|
39
|
+
},
|
|
40
|
+
summary: 'PostgreSQL 16, database name iranti, user postgres, port 5432, Docker container iranti_db',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
key: 'tech_stack',
|
|
44
|
+
value: {
|
|
45
|
+
language: 'TypeScript',
|
|
46
|
+
runtime: 'Node.js',
|
|
47
|
+
orm: 'Prisma v7',
|
|
48
|
+
prismaNotes: 'Requires @prisma/adapter-pg and PrismaPg adapter. Generator output: src/generated/prisma. Package versions: prisma@7.4.2, @prisma/adapter-pg@7.4.2, @prisma/client@7.4.2.',
|
|
49
|
+
runner: 'ts-node for scripts, tsc for build',
|
|
50
|
+
target: 'ES2020, commonjs modules',
|
|
51
|
+
},
|
|
52
|
+
summary: 'TypeScript, Node.js, Prisma v7 with PrismaPg adapter, ts-node runner',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
key: 'schema',
|
|
56
|
+
value: {
|
|
57
|
+
tables: ['knowledge_base', 'archive', 'entity_relationships'],
|
|
58
|
+
uniqueConstraints: {
|
|
59
|
+
knowledge_base: ['entityType', 'entityId', 'key'],
|
|
60
|
+
entity_relationships: ['fromType', 'fromId', 'relationshipType', 'toType', 'toId'],
|
|
61
|
+
},
|
|
62
|
+
jsonColumns: ['valueRaw', 'conflictLog', 'properties'],
|
|
63
|
+
protectedNamespace: 'entityType = system',
|
|
64
|
+
},
|
|
65
|
+
summary: '3 tables: knowledge_base, archive, entity_relationships. Unique on entityType/entityId/key.',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
key: 'llm_providers',
|
|
69
|
+
value: {
|
|
70
|
+
current: 'mock',
|
|
71
|
+
available: ['mock', 'gemini', 'claude'],
|
|
72
|
+
switchBy: 'LLM_PROVIDER env var',
|
|
73
|
+
geminiModel: 'gemini-2.0-flash-001',
|
|
74
|
+
conflictResolutionModel: 'gemini-2.5-pro',
|
|
75
|
+
rateLimit: 'Free Gemini tier: 10 req/min on gemini-2.0-flash-001',
|
|
76
|
+
},
|
|
77
|
+
summary: 'LLM provider set via LLM_PROVIDER env var. Current: mock. Gemini and Claude implemented.',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
key: 'architecture_decisions',
|
|
81
|
+
value: {
|
|
82
|
+
license: 'AGPL — allows free self-hosting, protects hosted business',
|
|
83
|
+
attendant: 'Per-agent class, singleton registry, persists state to KB',
|
|
84
|
+
librarian: 'Shared instance, owns all DB writes',
|
|
85
|
+
conflictThreshold: 'Gap >= 10 confidence points = deterministic resolution. Gap < 10 = LLM reasoning.',
|
|
86
|
+
escalationFormat: 'Status must be exactly "**Status:** RESOLVED" for Archivist to process',
|
|
87
|
+
entityFormat: 'entityType/entityId string in SDK e.g. researcher/jane_smith',
|
|
88
|
+
propertiesColumn: 'Escape hatch for caller-defined metadata, no migrations needed',
|
|
89
|
+
},
|
|
90
|
+
summary: 'AGPL license, per-agent Attendants, shared Librarian, conflict threshold 10 points',
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
key: 'open_questions',
|
|
94
|
+
value: {
|
|
95
|
+
hostedPricing: 'Consumption-based, reference Upstash model',
|
|
96
|
+
archiveRetention: 'Indefinite vs rolling window — undecided',
|
|
97
|
+
sdkLanguages: 'TypeScript first, Python SDK planned',
|
|
98
|
+
},
|
|
99
|
+
summary: 'Open: hosted pricing model, archive retention policy, Python SDK timeline',
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
key: 'repo',
|
|
103
|
+
value: {
|
|
104
|
+
url: 'https://github.com/nfemmanuel/iranti',
|
|
105
|
+
visibility: 'private — flip to public at open source launch',
|
|
106
|
+
defaultBranch: 'main',
|
|
107
|
+
commitFormat: '[component] description',
|
|
108
|
+
branchFormat: 'feature/description or fix/description',
|
|
109
|
+
},
|
|
110
|
+
summary: 'GitHub repo nfemmanuel/iranti, private until open source launch',
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
for (const fact of facts) {
|
|
114
|
+
const result = await iranti.write({
|
|
115
|
+
entity: 'codebase/iranti',
|
|
116
|
+
key: fact.key,
|
|
117
|
+
value: fact.value,
|
|
118
|
+
summary: fact.summary,
|
|
119
|
+
confidence: 100,
|
|
120
|
+
source: 'seed-codebase',
|
|
121
|
+
agent: 'system',
|
|
122
|
+
});
|
|
123
|
+
console.log(` [${fact.key}] ${result.action}`);
|
|
124
|
+
}
|
|
125
|
+
await iranti.registerAgent({
|
|
126
|
+
agentId: 'system',
|
|
127
|
+
name: 'System',
|
|
128
|
+
description: 'Internal system agent for seeding and maintenance',
|
|
129
|
+
capabilities: ['seeding', 'maintenance', 'setup'],
|
|
130
|
+
});
|
|
131
|
+
console.log(' ✓ Codebase knowledge seeded');
|
|
132
|
+
process.exit(0);
|
|
133
|
+
}
|
|
134
|
+
seedCodebase().catch((err) => {
|
|
135
|
+
console.error('Codebase seed failed:', err);
|
|
136
|
+
process.exit(1);
|
|
137
|
+
});
|
|
138
|
+
//# sourceMappingURL=seed-codebase.js.map
|