kith-coord 0.1.6 → 0.1.7

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.
@@ -1,3 +1,5 @@
1
+ import { createRequire as __kithRequire } from 'node:module'; const require = __kithRequire(import.meta.url);
2
+
1
3
  // src/core/command-worker.ts
2
4
  import os from "os";
3
5
  import { spawn } from "child_process";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/command-worker.ts"],"sourcesContent":["// A detached process-group leader. The command cannot start until its supervisor\n// has durably recorded this group and sent the start message over private IPC.\nimport os from 'node:os';\nimport { spawn } from 'node:child_process';\n\nlet started = false;\nprocess.on('disconnect', () => {\n try { process.kill(-process.pid, 'SIGKILL'); } catch { process.exit(1); }\n});\nprocess.once('message', (message: { command: string | string[]; cwd: string; mutexName: string; env?: Record<string, string> }) => {\n if (started) return;\n started = true;\n let finished = false;\n const env = { ...process.env, ...message.env, ...(message.mutexName === 'package-install' ? { KITH_PACKAGE_INSTALL_GUARDED: '1' } : {}) };\n const child = Array.isArray(message.command)\n ? spawn(message.command[0], message.command.slice(1), { cwd: message.cwd, env, stdio: ['ignore', 'inherit', 'inherit'] })\n : spawn(message.command, { cwd: message.cwd, env, stdio: ['ignore', 'inherit', 'inherit'], shell: true });\n child.once('error', (err) => {\n if (finished) return;\n finished = true;\n process.send?.({ error: err.message }, () => process.exit(1));\n });\n child.once('close', (code, signal) => {\n if (finished) return;\n finished = true;\n if (process.connected) process.send?.({ exitCode: code ?? (signal ? 128 + (os.constants.signals[signal] ?? 1) : 1), signal }, () => process.exit(0));\n });\n});\nprocess.send?.({ ready: true });\n"],"mappings":";AAEA,OAAO,QAAQ;AACf,SAAS,aAAa;AAEtB,IAAI,UAAU;AACd,QAAQ,GAAG,cAAc,MAAM;AAC7B,MAAI;AAAE,YAAQ,KAAK,CAAC,QAAQ,KAAK,SAAS;AAAA,EAAG,QAAQ;AAAE,YAAQ,KAAK,CAAC;AAAA,EAAG;AAC1E,CAAC;AACD,QAAQ,KAAK,WAAW,CAAC,YAA0G;AACjI,MAAI,QAAS;AACb,YAAU;AACV,MAAI,WAAW;AACf,QAAM,MAAM,EAAE,GAAG,QAAQ,KAAK,GAAG,QAAQ,KAAK,GAAI,QAAQ,cAAc,oBAAoB,EAAE,8BAA8B,IAAI,IAAI,CAAC,EAAG;AACxI,QAAM,QAAQ,MAAM,QAAQ,QAAQ,OAAO,IACvC,MAAM,QAAQ,QAAQ,CAAC,GAAG,QAAQ,QAAQ,MAAM,CAAC,GAAG,EAAE,KAAK,QAAQ,KAAK,KAAK,OAAO,CAAC,UAAU,WAAW,SAAS,EAAE,CAAC,IACtH,MAAM,QAAQ,SAAS,EAAE,KAAK,QAAQ,KAAK,KAAK,OAAO,CAAC,UAAU,WAAW,SAAS,GAAG,OAAO,KAAK,CAAC;AAC1G,QAAM,KAAK,SAAS,CAAC,QAAQ;AAC3B,QAAI,SAAU;AACd,eAAW;AACX,YAAQ,OAAO,EAAE,OAAO,IAAI,QAAQ,GAAG,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,EAC9D,CAAC;AACD,QAAM,KAAK,SAAS,CAAC,MAAM,WAAW;AACpC,QAAI,SAAU;AACd,eAAW;AACX,QAAI,QAAQ,UAAW,SAAQ,OAAO,EAAE,UAAU,SAAS,SAAS,OAAO,GAAG,UAAU,QAAQ,MAAM,KAAK,KAAK,IAAI,OAAO,GAAG,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,EACrJ,CAAC;AACH,CAAC;AACD,QAAQ,OAAO,EAAE,OAAO,KAAK,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/core/command-worker.ts"],"sourcesContent":["// A detached process-group leader. The command cannot start until its supervisor\n// has durably recorded this group and sent the start message over private IPC.\nimport os from 'node:os';\nimport { spawn } from 'node:child_process';\n\nlet started = false;\nprocess.on('disconnect', () => {\n try { process.kill(-process.pid, 'SIGKILL'); } catch { process.exit(1); }\n});\nprocess.once('message', (message: { command: string | string[]; cwd: string; mutexName: string; env?: Record<string, string> }) => {\n if (started) return;\n started = true;\n let finished = false;\n const env = { ...process.env, ...message.env, ...(message.mutexName === 'package-install' ? { KITH_PACKAGE_INSTALL_GUARDED: '1' } : {}) };\n const child = Array.isArray(message.command)\n ? spawn(message.command[0], message.command.slice(1), { cwd: message.cwd, env, stdio: ['ignore', 'inherit', 'inherit'] })\n : spawn(message.command, { cwd: message.cwd, env, stdio: ['ignore', 'inherit', 'inherit'], shell: true });\n child.once('error', (err) => {\n if (finished) return;\n finished = true;\n process.send?.({ error: err.message }, () => process.exit(1));\n });\n child.once('close', (code, signal) => {\n if (finished) return;\n finished = true;\n if (process.connected) process.send?.({ exitCode: code ?? (signal ? 128 + (os.constants.signals[signal] ?? 1) : 1), signal }, () => process.exit(0));\n });\n});\nprocess.send?.({ ready: true });\n"],"mappings":";;;AAEA,OAAO,QAAQ;AACf,SAAS,aAAa;AAEtB,IAAI,UAAU;AACd,QAAQ,GAAG,cAAc,MAAM;AAC7B,MAAI;AAAE,YAAQ,KAAK,CAAC,QAAQ,KAAK,SAAS;AAAA,EAAG,QAAQ;AAAE,YAAQ,KAAK,CAAC;AAAA,EAAG;AAC1E,CAAC;AACD,QAAQ,KAAK,WAAW,CAAC,YAA0G;AACjI,MAAI,QAAS;AACb,YAAU;AACV,MAAI,WAAW;AACf,QAAM,MAAM,EAAE,GAAG,QAAQ,KAAK,GAAG,QAAQ,KAAK,GAAI,QAAQ,cAAc,oBAAoB,EAAE,8BAA8B,IAAI,IAAI,CAAC,EAAG;AACxI,QAAM,QAAQ,MAAM,QAAQ,QAAQ,OAAO,IACvC,MAAM,QAAQ,QAAQ,CAAC,GAAG,QAAQ,QAAQ,MAAM,CAAC,GAAG,EAAE,KAAK,QAAQ,KAAK,KAAK,OAAO,CAAC,UAAU,WAAW,SAAS,EAAE,CAAC,IACtH,MAAM,QAAQ,SAAS,EAAE,KAAK,QAAQ,KAAK,KAAK,OAAO,CAAC,UAAU,WAAW,SAAS,GAAG,OAAO,KAAK,CAAC;AAC1G,QAAM,KAAK,SAAS,CAAC,QAAQ;AAC3B,QAAI,SAAU;AACd,eAAW;AACX,YAAQ,OAAO,EAAE,OAAO,IAAI,QAAQ,GAAG,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,EAC9D,CAAC;AACD,QAAM,KAAK,SAAS,CAAC,MAAM,WAAW;AACpC,QAAI,SAAU;AACd,eAAW;AACX,QAAI,QAAQ,UAAW,SAAQ,OAAO,EAAE,UAAU,SAAS,SAAS,OAAO,GAAG,UAAU,QAAQ,MAAM,KAAK,KAAK,IAAI,OAAO,GAAG,MAAM,QAAQ,KAAK,CAAC,CAAC;AAAA,EACrJ,CAAC;AACH,CAAC;AACD,QAAQ,OAAO,EAAE,OAAO,KAAK,CAAC;","names":[]}
package/dist/index.d.ts CHANGED
@@ -685,10 +685,12 @@ declare class IntentAndTaskEngine {
685
685
  * Orchestrator Mode: Atomically claims the highest-priority unblocked task whose scope locks are available.
686
686
  */
687
687
  claimNextTask(agentId: string): {
688
+ ok: boolean;
688
689
  claimed: boolean;
689
690
  task: TaskRecord | null;
690
691
  fencingToken: number | null;
691
692
  locks: LockRecord[];
693
+ activeSiblingIntents: TaskRecord[];
692
694
  reason?: string;
693
695
  };
694
696
  completeTask(params: {
@@ -703,6 +705,51 @@ declare class IntentAndTaskEngine {
703
705
  }): TaskRecord[];
704
706
  }
705
707
 
708
+ interface LinkedWorkspaceContract {
709
+ alias: string;
710
+ sourceRepo: string;
711
+ sourceRepoName: string;
712
+ filePath: string;
713
+ absolutePath: string;
714
+ symbols: Array<{
715
+ symbolName: string;
716
+ kind: ExtractedSymbol['kind'];
717
+ signature: string;
718
+ astHash: string;
719
+ }>;
720
+ dirtyInCheckout: boolean | null;
721
+ exportsComplete: boolean;
722
+ ownershipAvailable: boolean;
723
+ lockedByAgent: string | null;
724
+ activeWorktreeDrifts: Array<{
725
+ agentId: string;
726
+ worktreePath: string;
727
+ changedSymbols: string[];
728
+ removedSymbols: string[];
729
+ }>;
730
+ }
731
+ interface WorkspaceContractReport {
732
+ linkedContracts: LinkedWorkspaceContract[];
733
+ warnings: string[];
734
+ complete: boolean;
735
+ }
736
+ interface SwarmPrompts {
737
+ architect: string;
738
+ worker: string;
739
+ }
740
+ declare function buildSwarmPrompts(repoRoot: string): SwarmPrompts;
741
+ /** Inspect explicit local TS/JS path aliases, never arbitrary directories or a global file crawl.
742
+ * Wildcards are resolved against concrete imports at edit time, not unioned across a folder.
743
+ * This is advisory static inspection, not a compiler or a cross-language compatibility verdict.
744
+ */
745
+ declare function inspectWorkspaceContracts(repoRoot: string, worktreeDir?: string, imports?: string[]): WorkspaceContractReport;
746
+ declare function verifyCrossRepoImportsForFile(params: {
747
+ repoRoot: string;
748
+ worktreeDir?: string;
749
+ filePath: string;
750
+ content: string;
751
+ }): string[];
752
+
706
753
  interface AgentUnreadDelta {
707
754
  events: CoordEvent[];
708
755
  activeConflicts: ConflictRecord[];
@@ -760,6 +807,9 @@ declare class KithEngine {
760
807
  tasks: TaskRecord[];
761
808
  conflicts: ConflictRecord[];
762
809
  contracts: ContractRecord[];
810
+ linkedContracts: LinkedWorkspaceContract[];
811
+ crossRepoWarnings: string[];
812
+ crossRepoComplete: boolean;
763
813
  resources: ResourceRecord[];
764
814
  mergeQueue: MergeTrainEntry[];
765
815
  quarantined: QuarantineRecord[];
@@ -796,6 +846,9 @@ declare class KithEngine {
796
846
  isolateWorktree?: boolean;
797
847
  }): {
798
848
  worktree: SpawnedWorktree | null;
849
+ linkedContracts: LinkedWorkspaceContract[];
850
+ crossRepoWarnings: string[];
851
+ crossRepoComplete: boolean;
799
852
  ok: boolean;
800
853
  task: TaskRecord | null;
801
854
  fencingToken: number;
@@ -803,11 +856,54 @@ declare class KithEngine {
803
856
  lockConflicts: LockConflict[];
804
857
  activeSiblingIntents: TaskRecord[];
805
858
  };
859
+ claimNextTask(params: {
860
+ agentId: string;
861
+ isolateWorktree?: boolean;
862
+ }): {
863
+ worktree: SpawnedWorktree | null;
864
+ publishedContracts: ContractRecord[];
865
+ linkedContracts: LinkedWorkspaceContract[];
866
+ crossRepoWarnings: string[];
867
+ crossRepoComplete: boolean;
868
+ ok: boolean;
869
+ claimed: boolean;
870
+ task: TaskRecord | null;
871
+ fencingToken: number | null;
872
+ locks: LockRecord[];
873
+ activeSiblingIntents: TaskRecord[];
874
+ reason?: string;
875
+ };
876
+ private claimWorktree;
877
+ claimNextTaskWhenAvailable(params: {
878
+ agentId: string;
879
+ isolateWorktree?: boolean;
880
+ waitTimeoutMs: number;
881
+ signal?: AbortSignal;
882
+ }): Promise<{
883
+ worktree: SpawnedWorktree | null;
884
+ publishedContracts: ContractRecord[];
885
+ linkedContracts: LinkedWorkspaceContract[];
886
+ crossRepoWarnings: string[];
887
+ crossRepoComplete: boolean;
888
+ ok: boolean;
889
+ claimed: boolean;
890
+ task: TaskRecord | null;
891
+ fencingToken: number | null;
892
+ locks: LockRecord[];
893
+ activeSiblingIntents: TaskRecord[];
894
+ reason?: string;
895
+ } & {
896
+ waitedMs: number;
897
+ waitTimedOut: boolean;
898
+ }>;
806
899
  beginWorkWhenAvailable(params: Parameters<KithEngine['beginWork']>[0] & {
807
900
  waitTimeoutMs: number;
808
901
  signal?: AbortSignal;
809
902
  }): Promise<{
810
903
  worktree: SpawnedWorktree | null;
904
+ linkedContracts: LinkedWorkspaceContract[];
905
+ crossRepoWarnings: string[];
906
+ crossRepoComplete: boolean;
811
907
  ok: boolean;
812
908
  task: TaskRecord | null;
813
909
  fencingToken: number;
@@ -865,6 +961,7 @@ declare function caseSensitivePaths(root: string): boolean;
865
961
  /** Copies a consistent stopped-state set before opening SQLite, so even SHM reconstruction cannot touch original recovery files. */
866
962
  declare function readCoordinationState(directory?: string, options?: {
867
963
  ownersOnly?: boolean;
964
+ coordinationOnly?: boolean;
868
965
  }): {
869
966
  protocolVersion: string;
870
967
  observedAt: number;
@@ -878,6 +975,9 @@ declare function readCoordinationState(directory?: string, options?: {
878
975
  };
879
976
  state: "ready" | "missing" | "unavailable";
880
977
  error: string | undefined;
978
+ sessionEpochs: Record<string, number>;
979
+ truncated: boolean;
980
+ schemaVersion: number;
881
981
  fencingEpoch: number;
882
982
  agents: AgentRecord[];
883
983
  tasks: Record<string, unknown>[];
@@ -893,6 +993,7 @@ declare function readCoordinationState(directory?: string, options?: {
893
993
  workspaces: ReturnType<typeof observeWorkspaces>;
894
994
  } | {
895
995
  state: "ready";
996
+ schemaVersion: number;
896
997
  fencingEpoch: number;
897
998
  agents: AgentRecord[];
898
999
  tasks: {
@@ -926,6 +1027,42 @@ declare function readCoordinationState(directory?: string, options?: {
926
1027
  node: string;
927
1028
  };
928
1029
  error: string | undefined;
1030
+ sessionEpochs: Record<string, number>;
1031
+ truncated: boolean;
1032
+ } | {
1033
+ state: "ready";
1034
+ schemaVersion: number;
1035
+ agents: AgentRecord[];
1036
+ sessionEpochs: {
1037
+ [k: string]: number;
1038
+ };
1039
+ tasks: {
1040
+ depends_on: any;
1041
+ scope_globs: any;
1042
+ }[];
1043
+ locks: Record<string, unknown>[];
1044
+ resources: Record<string, unknown>[];
1045
+ mutexWaiters: Record<string, unknown>[];
1046
+ commandGuards: Record<string, unknown>[];
1047
+ mergeQueue: Record<string, unknown>[];
1048
+ truncated: boolean;
1049
+ protocolVersion: string;
1050
+ observedAt: number;
1051
+ repository: {
1052
+ root: string;
1053
+ commonGitDir: string | null;
1054
+ coordDir: string;
1055
+ };
1056
+ runtime: {
1057
+ node: string;
1058
+ };
1059
+ error: string | undefined;
1060
+ fencingEpoch: number;
1061
+ conflicts: Record<string, unknown>[];
1062
+ contracts: Record<string, unknown>[];
1063
+ quarantined: Record<string, unknown>[];
1064
+ events: Record<string, unknown>[];
1065
+ workspaces: ReturnType<typeof observeWorkspaces>;
929
1066
  };
930
1067
  /** Recovery is an inspection report: it never clears guards, expires claims, deletes worktrees or restores files. */
931
1068
  declare function recoveryReport(directory?: string): {
@@ -956,6 +1093,9 @@ declare function recoveryReport(directory?: string): {
956
1093
  };
957
1094
  state: "ready" | "missing" | "unavailable";
958
1095
  error: string | undefined;
1096
+ sessionEpochs: Record<string, number>;
1097
+ truncated: boolean;
1098
+ schemaVersion: number;
959
1099
  fencingEpoch: number;
960
1100
  agents: AgentRecord[];
961
1101
  tasks: Record<string, unknown>[];
@@ -986,6 +1126,7 @@ declare function recoveryReport(directory?: string): {
986
1126
  present: boolean;
987
1127
  };
988
1128
  state: "ready";
1129
+ schemaVersion: number;
989
1130
  fencingEpoch: number;
990
1131
  agents: AgentRecord[];
991
1132
  tasks: {
@@ -1019,9 +1160,60 @@ declare function recoveryReport(directory?: string): {
1019
1160
  node: string;
1020
1161
  };
1021
1162
  error: string | undefined;
1163
+ sessionEpochs: Record<string, number>;
1164
+ truncated: boolean;
1165
+ } | {
1166
+ retainedWorktrees: {
1167
+ path: string;
1168
+ symlink: boolean;
1169
+ agentIds: string[];
1170
+ }[];
1171
+ expiredClaims: Record<string, unknown>[];
1172
+ unfinishedIntegrations: Record<string, unknown>[];
1173
+ setupLock: {
1174
+ path: string;
1175
+ present: boolean;
1176
+ };
1177
+ integrationLock: {
1178
+ path: string;
1179
+ present: boolean;
1180
+ };
1181
+ state: "ready";
1182
+ schemaVersion: number;
1183
+ agents: AgentRecord[];
1184
+ sessionEpochs: {
1185
+ [k: string]: number;
1186
+ };
1187
+ tasks: {
1188
+ depends_on: any;
1189
+ scope_globs: any;
1190
+ }[];
1191
+ locks: Record<string, unknown>[];
1192
+ resources: Record<string, unknown>[];
1193
+ mutexWaiters: Record<string, unknown>[];
1194
+ commandGuards: Record<string, unknown>[];
1195
+ mergeQueue: Record<string, unknown>[];
1196
+ truncated: boolean;
1197
+ protocolVersion: string;
1198
+ observedAt: number;
1199
+ repository: {
1200
+ root: string;
1201
+ commonGitDir: string | null;
1202
+ coordDir: string;
1203
+ };
1204
+ runtime: {
1205
+ node: string;
1206
+ };
1207
+ error: string | undefined;
1208
+ fencingEpoch: number;
1209
+ conflicts: Record<string, unknown>[];
1210
+ contracts: Record<string, unknown>[];
1211
+ quarantined: Record<string, unknown>[];
1212
+ events: Record<string, unknown>[];
1213
+ workspaces: ReturnType<typeof observeWorkspaces>;
1022
1214
  };
1023
1215
 
1024
- declare const KITH_VERSION = "0.1.6";
1025
- declare const KITH_PROTOCOL_VERSION = "1.4.0";
1216
+ declare const KITH_VERSION = "0.1.7";
1217
+ declare const KITH_PROTOCOL_VERSION = "1.5.0";
1026
1218
 
1027
- export { type AcquireLockResult, type AgentRecord, type AgentUnreadDelta, AstAnalyzer, type BashGuardPostReport, BashMerkleGuard, type BlastRadiusAlert, CoWWorktreeManager, type ConflictRecord, type ContractRecord, CoordDatabase, type CoordEvent, type DeclareIntentResult, DependencyAndContractEngine, type DirtyMergeProbeResult, type ExtractedImport, type ExtractedSymbol, FencingAndAgentManager, type FileAstAnalysis, type FileModificationReport, type FileSnapshotEntry, IntentAndTaskEngine, KITH_PROTOCOL_VERSION, KITH_VERSION, KithEngine, type LockConflict, LockEngine, type LockRecord, type MergeTrainEntry, type PostFileEditHookResult, type QuarantineRecord, type RepositoryLayout, ResourceBroker, type ResourceRecord, SessionOwnershipError, type SessionRegistration, ShadowGitEngine, type SpawnedWorktree, type SpeculativeMergeResult, SpeculativeMergeTrain, StaleFencingTokenError, type SupervisedCommandOptions, type SymbolKind, type TaskRecord, type WorkspaceObservation, type WorktreeChange, caseSensitivePaths, discoverRepository, isWithin, observeWorkspaces, physicalPath, previewIntegration, readCoordinationState, recoveryReport, repositoryFile, worktreeChanges };
1219
+ export { type AcquireLockResult, type AgentRecord, type AgentUnreadDelta, AstAnalyzer, type BashGuardPostReport, BashMerkleGuard, type BlastRadiusAlert, CoWWorktreeManager, type ConflictRecord, type ContractRecord, CoordDatabase, type CoordEvent, type DeclareIntentResult, DependencyAndContractEngine, type DirtyMergeProbeResult, type ExtractedImport, type ExtractedSymbol, FencingAndAgentManager, type FileAstAnalysis, type FileModificationReport, type FileSnapshotEntry, IntentAndTaskEngine, KITH_PROTOCOL_VERSION, KITH_VERSION, KithEngine, type LinkedWorkspaceContract, type LockConflict, LockEngine, type LockRecord, type MergeTrainEntry, type PostFileEditHookResult, type QuarantineRecord, type RepositoryLayout, ResourceBroker, type ResourceRecord, SessionOwnershipError, type SessionRegistration, ShadowGitEngine, type SpawnedWorktree, type SpeculativeMergeResult, SpeculativeMergeTrain, StaleFencingTokenError, type SupervisedCommandOptions, type SwarmPrompts, type SymbolKind, type TaskRecord, type WorkspaceContractReport, type WorkspaceObservation, type WorktreeChange, buildSwarmPrompts, caseSensitivePaths, discoverRepository, inspectWorkspaceContracts, isWithin, observeWorkspaces, physicalPath, previewIntegration, readCoordinationState, recoveryReport, repositoryFile, verifyCrossRepoImportsForFile, worktreeChanges };