@quaglius/ai-comms 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.
Files changed (48) hide show
  1. package/.claude-plugin/plugin.json +35 -0
  2. package/LICENSE +21 -0
  3. package/README.md +481 -0
  4. package/bin/ai-comms.js +2 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +303 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/config.d.ts +136 -0
  9. package/dist/config.js +81 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/context.d.ts +49 -0
  12. package/dist/context.js +143 -0
  13. package/dist/context.js.map +1 -0
  14. package/dist/daemon.d.ts +3 -0
  15. package/dist/daemon.js +245 -0
  16. package/dist/daemon.js.map +1 -0
  17. package/dist/discord.d.ts +52 -0
  18. package/dist/discord.js +203 -0
  19. package/dist/discord.js.map +1 -0
  20. package/dist/envelope.d.ts +208 -0
  21. package/dist/envelope.js +209 -0
  22. package/dist/envelope.js.map +1 -0
  23. package/dist/mcp.d.ts +4 -0
  24. package/dist/mcp.js +169 -0
  25. package/dist/mcp.js.map +1 -0
  26. package/dist/migrate.d.ts +2 -0
  27. package/dist/migrate.js +99 -0
  28. package/dist/migrate.js.map +1 -0
  29. package/dist/paths.d.ts +16 -0
  30. package/dist/paths.js +47 -0
  31. package/dist/paths.js.map +1 -0
  32. package/dist/prompt.d.ts +2 -0
  33. package/dist/prompt.js +70 -0
  34. package/dist/prompt.js.map +1 -0
  35. package/dist/secrets.d.ts +15 -0
  36. package/dist/secrets.js +72 -0
  37. package/dist/secrets.js.map +1 -0
  38. package/dist/store.d.ts +46 -0
  39. package/dist/store.js +186 -0
  40. package/dist/store.js.map +1 -0
  41. package/docs/INSTALL.md +128 -0
  42. package/docs/OPEN-QUESTIONS.md +53 -0
  43. package/docs/PROTOCOL.md +81 -0
  44. package/docs/SETUP-FOR-AGENTS.md +293 -0
  45. package/docs/SPEC-v0.md +142 -0
  46. package/docs/SPEC-v1.md +190 -0
  47. package/package.json +61 -0
  48. package/skills/ai-comms/SKILL.md +71 -0
@@ -0,0 +1,99 @@
1
+ import { existsSync, mkdirSync, renameSync, readFileSync, writeFileSync, } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { z } from 'zod';
4
+ import { getConfigPath, getProjectDir, getV0CursorPath, getV0DaemonLogPath, getV0DaemonPidPath, getV0LogPath, getV0ReadPath, } from './paths.js';
5
+ import { setProjectToken } from './secrets.js';
6
+ const V0_CONFIG_SCHEMA = z.object({
7
+ dev: z.string().min(1),
8
+ agent: z.string().min(1),
9
+ repo: z.string().min(1),
10
+ discord: z.object({
11
+ token: z.string().min(1),
12
+ channelId: z.string().min(1),
13
+ }),
14
+ });
15
+ let migrationDone = false;
16
+ export function resetMigrationForTests() {
17
+ migrationDone = false;
18
+ }
19
+ export function maybeMigrateV0() {
20
+ if (migrationDone)
21
+ return [];
22
+ migrationDone = true;
23
+ const messages = [];
24
+ const configPath = getConfigPath();
25
+ if (existsSync(configPath)) {
26
+ try {
27
+ const raw = JSON.parse(readFileSync(configPath, 'utf8'));
28
+ const v0 = V0_CONFIG_SCHEMA.safeParse(raw);
29
+ if (v0.success) {
30
+ messages.push(...migrateV0Config(v0.data, configPath));
31
+ }
32
+ }
33
+ catch {
34
+ // invalid config: loadConfig will report it
35
+ }
36
+ }
37
+ messages.push(...migrateV0StateFiles(configPath));
38
+ return messages;
39
+ }
40
+ function migrateV0Config(v0, configPath) {
41
+ const messages = [];
42
+ const project = v0.repo;
43
+ setProjectToken(project, v0.discord.token);
44
+ const v2 = {
45
+ version: 2,
46
+ identity: { dev: v0.dev, agent: v0.agent },
47
+ defaultProject: project,
48
+ projects: {
49
+ [project]: {
50
+ discord: { channelId: v0.discord.channelId },
51
+ repos: [],
52
+ },
53
+ },
54
+ };
55
+ mkdirSync(path.dirname(configPath), { recursive: true });
56
+ writeFileSync(configPath, JSON.stringify(v2, null, 2) + '\n', 'utf8');
57
+ messages.push(`Migrated config v0 → v2 (project "${project}"). Token moved to secrets.json.`);
58
+ return messages;
59
+ }
60
+ function migrateV0StateFiles(configPath) {
61
+ const v0StateFiles = [
62
+ { from: getV0LogPath(), name: 'log.jsonl' },
63
+ { from: getV0CursorPath(), name: 'cursor.json' },
64
+ { from: getV0ReadPath(), name: 'read.json' },
65
+ { from: getV0DaemonLogPath(), name: 'daemon.log' },
66
+ { from: getV0DaemonPidPath(), name: 'daemon.pid' },
67
+ ];
68
+ const hasV0State = v0StateFiles.some((f) => existsSync(f.from));
69
+ if (!hasV0State)
70
+ return [];
71
+ let defaultProject = 'default';
72
+ if (existsSync(configPath)) {
73
+ try {
74
+ const raw = JSON.parse(readFileSync(configPath, 'utf8'));
75
+ if (raw.defaultProject)
76
+ defaultProject = raw.defaultProject;
77
+ }
78
+ catch {
79
+ // ignore
80
+ }
81
+ }
82
+ const projectDir = getProjectDir(defaultProject);
83
+ mkdirSync(projectDir, { recursive: true });
84
+ const messages = [];
85
+ for (const file of v0StateFiles) {
86
+ if (!existsSync(file.from))
87
+ continue;
88
+ const dest = path.join(projectDir, file.name);
89
+ if (existsSync(dest))
90
+ continue;
91
+ renameSync(file.from, dest);
92
+ messages.push(`Moved ${file.from} → ${dest}`);
93
+ }
94
+ if (messages.length > 0) {
95
+ messages.unshift(`Migrated v0 state to project "${defaultProject}" in ~/.ai-comms/projects/${defaultProject}/`);
96
+ }
97
+ return messages;
98
+ }
99
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare function getConfigDir(): string;
2
+ export declare function getConfigPath(): string;
3
+ export declare function getSecretsPath(): string;
4
+ export declare const REPO_COMMS_FILENAME = ".ai-comms.json";
5
+ export declare function getProjectDir(project: string): string;
6
+ export declare function getProjectLogPath(project: string): string;
7
+ export declare function getProjectCursorPath(project: string): string;
8
+ export declare function getProjectReadPath(project: string): string;
9
+ export declare function getProjectDaemonLogPath(project: string): string;
10
+ export declare function getProjectDaemonPidPath(project: string): string;
11
+ /** @deprecated v0 layout — migration only */
12
+ export declare function getV0LogPath(): string;
13
+ export declare function getV0CursorPath(): string;
14
+ export declare function getV0ReadPath(): string;
15
+ export declare function getV0DaemonLogPath(): string;
16
+ export declare function getV0DaemonPidPath(): string;
package/dist/paths.js ADDED
@@ -0,0 +1,47 @@
1
+ import { homedir } from 'node:os';
2
+ import path from 'node:path';
3
+ export function getConfigDir() {
4
+ return path.join(homedir(), '.ai-comms');
5
+ }
6
+ export function getConfigPath() {
7
+ return path.join(getConfigDir(), 'config.json');
8
+ }
9
+ export function getSecretsPath() {
10
+ return path.join(getConfigDir(), 'secrets.json');
11
+ }
12
+ export const REPO_COMMS_FILENAME = '.ai-comms.json';
13
+ export function getProjectDir(project) {
14
+ return path.join(getConfigDir(), 'projects', project);
15
+ }
16
+ export function getProjectLogPath(project) {
17
+ return path.join(getProjectDir(project), 'log.jsonl');
18
+ }
19
+ export function getProjectCursorPath(project) {
20
+ return path.join(getProjectDir(project), 'cursor.json');
21
+ }
22
+ export function getProjectReadPath(project) {
23
+ return path.join(getProjectDir(project), 'read.json');
24
+ }
25
+ export function getProjectDaemonLogPath(project) {
26
+ return path.join(getProjectDir(project), 'daemon.log');
27
+ }
28
+ export function getProjectDaemonPidPath(project) {
29
+ return path.join(getProjectDir(project), 'daemon.pid');
30
+ }
31
+ /** @deprecated v0 layout — migration only */
32
+ export function getV0LogPath() {
33
+ return path.join(getConfigDir(), 'log.jsonl');
34
+ }
35
+ export function getV0CursorPath() {
36
+ return path.join(getConfigDir(), 'cursor.json');
37
+ }
38
+ export function getV0ReadPath() {
39
+ return path.join(getConfigDir(), 'read.json');
40
+ }
41
+ export function getV0DaemonLogPath() {
42
+ return path.join(getConfigDir(), 'daemon.log');
43
+ }
44
+ export function getV0DaemonPidPath() {
45
+ return path.join(getConfigDir(), 'daemon.pid');
46
+ }
47
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,cAAc,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAgB,CAAC;AAEpD,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC;AACzD,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,YAAY,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function prompt(question: string, defaultValue?: string): Promise<string>;
2
+ export declare function promptSecret(question: string): Promise<string>;
package/dist/prompt.js ADDED
@@ -0,0 +1,70 @@
1
+ import { createInterface } from 'node:readline/promises';
2
+ import { stdin as input, stdout as output } from 'node:process';
3
+ export async function prompt(question, defaultValue) {
4
+ const rl = createInterface({ input, output });
5
+ try {
6
+ const suffix = defaultValue ? ` [${defaultValue}]` : '';
7
+ const answer = (await rl.question(`${question}${suffix}: `)).trim();
8
+ return answer || defaultValue || '';
9
+ }
10
+ finally {
11
+ rl.close();
12
+ }
13
+ }
14
+ export async function promptSecret(question) {
15
+ return new Promise((resolve, reject) => {
16
+ process.stderr.write(`${question}: `);
17
+ if (!input.isTTY) {
18
+ input.resume();
19
+ input.setEncoding('utf8');
20
+ let data = '';
21
+ const onData = (chunk) => {
22
+ data += chunk;
23
+ if (data.includes('\n')) {
24
+ input.removeListener('data', onData);
25
+ resolve(data.trim());
26
+ }
27
+ };
28
+ input.on('data', onData);
29
+ return;
30
+ }
31
+ let secret = '';
32
+ input.setRawMode(true);
33
+ input.resume();
34
+ input.setEncoding('utf8');
35
+ const onData = (char) => {
36
+ switch (char) {
37
+ case '\n':
38
+ case '\r':
39
+ case '\u0004':
40
+ input.setRawMode(false);
41
+ input.pause();
42
+ input.removeListener('data', onData);
43
+ process.stderr.write('\n');
44
+ resolve(secret.trim());
45
+ break;
46
+ case '\u0003':
47
+ input.setRawMode(false);
48
+ input.pause();
49
+ input.removeListener('data', onData);
50
+ reject(new Error('Cancelled'));
51
+ break;
52
+ case '\u007f':
53
+ case '\b':
54
+ if (secret.length > 0) {
55
+ secret = secret.slice(0, -1);
56
+ process.stderr.write('\b \b');
57
+ }
58
+ break;
59
+ default:
60
+ if (char >= ' ' || char === '\t') {
61
+ secret += char;
62
+ process.stderr.write('*');
63
+ }
64
+ break;
65
+ }
66
+ };
67
+ input.on('data', onData);
68
+ });
69
+ }
70
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type SecretsFile = Record<string, {
2
+ token: string;
3
+ }>;
4
+ export declare function projectTokenEnvKey(project: string): string;
5
+ export declare function loadSecrets(secretsPath?: string): SecretsFile;
6
+ export declare function saveSecrets(secrets: SecretsFile, secretsPath?: string): void;
7
+ export declare function setProjectToken(project: string, token: string, secretsPath?: string): void;
8
+ export declare function getEffectiveToken(project: string, secretsPath?: string): {
9
+ token: string;
10
+ source: 'env-project' | 'env-global' | 'secrets';
11
+ };
12
+ export declare class SecretsError extends Error {
13
+ constructor(message: string);
14
+ }
15
+ export declare function tokenSourceLabel(source: 'env-project' | 'env-global' | 'secrets', project: string): string;
@@ -0,0 +1,72 @@
1
+ import { chmodSync, readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
2
+ import { getConfigDir, getSecretsPath } from './paths.js';
3
+ export function projectTokenEnvKey(project) {
4
+ return `AI_COMMS_TOKEN_${project.replace(/-/g, '_').toUpperCase()}`;
5
+ }
6
+ export function loadSecrets(secretsPath = getSecretsPath()) {
7
+ if (!existsSync(secretsPath))
8
+ return {};
9
+ try {
10
+ const raw = JSON.parse(readFileSync(secretsPath, 'utf8'));
11
+ return raw && typeof raw === 'object' ? raw : {};
12
+ }
13
+ catch {
14
+ return {};
15
+ }
16
+ }
17
+ export function saveSecrets(secrets, secretsPath = getSecretsPath()) {
18
+ mkdirSync(getConfigDir(), { recursive: true });
19
+ writeFileSync(secretsPath, JSON.stringify(secrets, null, 2) + '\n', {
20
+ encoding: 'utf8',
21
+ mode: 0o600,
22
+ });
23
+ // mode only applies on create: force it on pre-existing files too.
24
+ // On Windows this is effectively a no-op; on macOS/Linux it keeps the token
25
+ // from being readable by other users on the machine.
26
+ try {
27
+ chmodSync(secretsPath, 0o600);
28
+ }
29
+ catch {
30
+ // systems without POSIX permissions
31
+ }
32
+ }
33
+ export function setProjectToken(project, token, secretsPath = getSecretsPath()) {
34
+ const secrets = loadSecrets(secretsPath);
35
+ secrets[project] = { token };
36
+ saveSecrets(secrets, secretsPath);
37
+ }
38
+ export function getEffectiveToken(project, secretsPath = getSecretsPath()) {
39
+ const projectKey = projectTokenEnvKey(project);
40
+ const projectEnv = process.env[projectKey]?.trim();
41
+ if (projectEnv) {
42
+ return { token: projectEnv, source: 'env-project' };
43
+ }
44
+ const globalEnv = process.env.AI_COMMS_TOKEN?.trim();
45
+ if (globalEnv) {
46
+ return { token: globalEnv, source: 'env-global' };
47
+ }
48
+ const secrets = loadSecrets(secretsPath);
49
+ const entry = secrets[project];
50
+ if (entry?.token?.trim()) {
51
+ return { token: entry.token.trim(), source: 'secrets' };
52
+ }
53
+ throw new SecretsError(`No token for project "${project}". Run "ai-comms secret set ${project}" ` +
54
+ `or set ${projectKey} / AI_COMMS_TOKEN.`);
55
+ }
56
+ export class SecretsError extends Error {
57
+ constructor(message) {
58
+ super(message);
59
+ this.name = 'SecretsError';
60
+ }
61
+ }
62
+ export function tokenSourceLabel(source, project) {
63
+ switch (source) {
64
+ case 'env-project':
65
+ return `[env ${projectTokenEnvKey(project)}]`;
66
+ case 'env-global':
67
+ return '[env AI_COMMS_TOKEN]';
68
+ case 'secrets':
69
+ return '[secrets.json]';
70
+ }
71
+ }
72
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type Envelope } from './envelope.js';
2
+ export interface CursorState {
3
+ lastMessageId: string;
4
+ }
5
+ export interface ReadState {
6
+ ids: string[];
7
+ }
8
+ export interface ActiveClaim {
9
+ id: string;
10
+ dev: string;
11
+ agent: string;
12
+ repo: string;
13
+ paths: string[];
14
+ until: string;
15
+ subject: string;
16
+ }
17
+ export interface ClaimConflict {
18
+ claimId: string;
19
+ dev: string;
20
+ agent: string;
21
+ repo: string;
22
+ paths: string[];
23
+ until: string;
24
+ }
25
+ export declare function appendEnvelope(envelope: Envelope, project: string, existing?: Envelope[]): void;
26
+ export declare function loadLog(project: string): Envelope[];
27
+ export declare function loadCursor(project: string): CursorState | null;
28
+ export declare function saveCursor(project: string, state: CursorState): void;
29
+ export declare function loadReadState(project: string): ReadState;
30
+ export declare function saveReadState(project: string, state: ReadState): void;
31
+ export declare function markRead(project: string, ids: string[]): void;
32
+ export declare function getLogLastModified(project: string): Date | null;
33
+ export declare function isDaemonRunning(project: string): boolean;
34
+ export declare function writeDaemonPid(project: string, pid?: number): void;
35
+ export declare function removeDaemonPid(project: string): void;
36
+ export declare function getDaemonLogPath(project: string): string;
37
+ export declare function materializeActiveClaims(envelopes: Envelope[], now?: Date): ActiveClaim[];
38
+ export declare function findClaimConflicts(paths: string[], dev: string, repo: string, envelopes: Envelope[], now?: Date): ClaimConflict[];
39
+ export declare function materializeInbox(envelopes: Envelope[], dev: string, options?: {
40
+ since?: string;
41
+ unreadOnly?: boolean;
42
+ now?: Date;
43
+ readState?: ReadState;
44
+ }): Envelope[];
45
+ export declare function isLogStale(project: string, staleMs?: number, now?: number): boolean;
46
+ export declare function isAnyDaemonRunning(projects: string[]): boolean;
package/dist/store.js ADDED
@@ -0,0 +1,186 @@
1
+ import { appendFileSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync, } from 'node:fs';
2
+ import { getProjectCursorPath, getProjectDaemonLogPath, getProjectDaemonPidPath, getProjectDir, getProjectLogPath, getProjectReadPath, } from './paths.js';
3
+ import { EnvelopeSchema, globsOverlap, isDirectedTo, isExpired, isHopsBlocked, } from './envelope.js';
4
+ function ensureProjectDir(project) {
5
+ mkdirSync(getProjectDir(project), { recursive: true });
6
+ }
7
+ export function appendEnvelope(envelope, project, existing) {
8
+ const logPath = getProjectLogPath(project);
9
+ const known = existing ?? loadLog(project);
10
+ if (known.some((e) => e.id === envelope.id))
11
+ return;
12
+ ensureProjectDir(project);
13
+ appendFileSync(logPath, JSON.stringify(envelope) + '\n', 'utf8');
14
+ }
15
+ export function loadLog(project) {
16
+ const logPath = getProjectLogPath(project);
17
+ if (!existsSync(logPath))
18
+ return [];
19
+ const lines = readFileSync(logPath, 'utf8').split('\n').filter(Boolean);
20
+ const envelopes = [];
21
+ for (const line of lines) {
22
+ try {
23
+ const parsed = EnvelopeSchema.parse(JSON.parse(line));
24
+ envelopes.push(parsed);
25
+ }
26
+ catch {
27
+ // corrupt line: skip
28
+ }
29
+ }
30
+ return envelopes;
31
+ }
32
+ export function loadCursor(project) {
33
+ const cursorPath = getProjectCursorPath(project);
34
+ if (!existsSync(cursorPath))
35
+ return null;
36
+ try {
37
+ return JSON.parse(readFileSync(cursorPath, 'utf8'));
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ export function saveCursor(project, state) {
44
+ ensureProjectDir(project);
45
+ writeFileSync(getProjectCursorPath(project), JSON.stringify(state, null, 2) + '\n', 'utf8');
46
+ }
47
+ export function loadReadState(project) {
48
+ const readPath = getProjectReadPath(project);
49
+ if (!existsSync(readPath))
50
+ return { ids: [] };
51
+ try {
52
+ const raw = JSON.parse(readFileSync(readPath, 'utf8'));
53
+ return { ids: Array.isArray(raw.ids) ? raw.ids : [] };
54
+ }
55
+ catch {
56
+ return { ids: [] };
57
+ }
58
+ }
59
+ export function saveReadState(project, state) {
60
+ ensureProjectDir(project);
61
+ writeFileSync(getProjectReadPath(project), JSON.stringify(state, null, 2) + '\n', 'utf8');
62
+ }
63
+ export function markRead(project, ids) {
64
+ const state = loadReadState(project);
65
+ const merged = new Set([...state.ids, ...ids]);
66
+ saveReadState(project, { ids: [...merged] });
67
+ }
68
+ export function getLogLastModified(project) {
69
+ const logPath = getProjectLogPath(project);
70
+ if (!existsSync(logPath))
71
+ return null;
72
+ return statSync(logPath).mtime;
73
+ }
74
+ export function isDaemonRunning(project) {
75
+ const pidPath = getProjectDaemonPidPath(project);
76
+ if (!existsSync(pidPath))
77
+ return false;
78
+ try {
79
+ const pid = Number.parseInt(readFileSync(pidPath, 'utf8').trim(), 10);
80
+ if (!Number.isFinite(pid))
81
+ return false;
82
+ process.kill(pid, 0);
83
+ return true;
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ export function writeDaemonPid(project, pid = process.pid) {
90
+ ensureProjectDir(project);
91
+ writeFileSync(getProjectDaemonPidPath(project), String(pid) + '\n', 'utf8');
92
+ }
93
+ export function removeDaemonPid(project) {
94
+ const pidPath = getProjectDaemonPidPath(project);
95
+ if (existsSync(pidPath)) {
96
+ try {
97
+ writeFileSync(pidPath, '');
98
+ }
99
+ catch {
100
+ // ignore
101
+ }
102
+ }
103
+ }
104
+ export function getDaemonLogPath(project) {
105
+ return getProjectDaemonLogPath(project);
106
+ }
107
+ export function materializeActiveClaims(envelopes, now = new Date()) {
108
+ const released = new Set();
109
+ const claims = [];
110
+ for (const env of envelopes) {
111
+ if (env.type === 'release' && env.reply_to) {
112
+ released.add(env.reply_to);
113
+ }
114
+ }
115
+ for (const env of envelopes) {
116
+ if (env.type !== 'claim')
117
+ continue;
118
+ if (released.has(env.id))
119
+ continue;
120
+ if (!env.refs.paths?.length || !env.refs.until)
121
+ continue;
122
+ if (new Date(env.refs.until) <= now)
123
+ continue;
124
+ claims.push({
125
+ id: env.id,
126
+ dev: env.from.dev,
127
+ agent: env.from.agent,
128
+ repo: env.from.repo,
129
+ paths: env.refs.paths,
130
+ until: env.refs.until,
131
+ subject: env.subject,
132
+ });
133
+ }
134
+ return claims;
135
+ }
136
+ export function findClaimConflicts(paths, dev, repo, envelopes, now = new Date()) {
137
+ const active = materializeActiveClaims(envelopes, now);
138
+ const conflicts = [];
139
+ for (const claim of active) {
140
+ if (claim.dev === dev)
141
+ continue;
142
+ if (claim.repo !== repo)
143
+ continue;
144
+ if (globsOverlap(paths, claim.paths)) {
145
+ conflicts.push({
146
+ claimId: claim.id,
147
+ dev: claim.dev,
148
+ agent: claim.agent,
149
+ repo: claim.repo,
150
+ paths: claim.paths,
151
+ until: claim.until,
152
+ });
153
+ }
154
+ }
155
+ return conflicts;
156
+ }
157
+ export function materializeInbox(envelopes, dev, options = {}) {
158
+ const now = options.now ?? new Date();
159
+ const readSet = new Set((options.readState ?? { ids: [] }).ids);
160
+ const sinceDate = options.since ? new Date(options.since) : null;
161
+ return envelopes.filter((env) => {
162
+ if (env.from.dev === dev)
163
+ return false;
164
+ if (!isDirectedTo(env, dev))
165
+ return false;
166
+ if (isExpired(env, now))
167
+ return false;
168
+ if (isHopsBlocked(env))
169
+ return false;
170
+ if (sinceDate && new Date(env.ts) < sinceDate)
171
+ return false;
172
+ if (options.unreadOnly && readSet.has(env.id))
173
+ return false;
174
+ return true;
175
+ });
176
+ }
177
+ export function isLogStale(project, staleMs = 5 * 60 * 1000, now = Date.now()) {
178
+ const mtime = getLogLastModified(project);
179
+ if (!mtime)
180
+ return true;
181
+ return now - mtime.getTime() > staleMs;
182
+ }
183
+ export function isAnyDaemonRunning(projects) {
184
+ return projects.some((p) => isDaemonRunning(p));
185
+ }
186
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}