instar 0.26.11 → 0.27.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/README.md +1 -1
  2. package/dist/commands/init.d.ts +5 -0
  3. package/dist/commands/init.d.ts.map +1 -1
  4. package/dist/commands/init.js +46 -1
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/commands/server.d.ts.map +1 -1
  7. package/dist/commands/server.js +228 -36
  8. package/dist/commands/server.js.map +1 -1
  9. package/dist/commands/slack-cli.d.ts +6 -0
  10. package/dist/commands/slack-cli.d.ts.map +1 -1
  11. package/dist/commands/slack-cli.js +99 -1
  12. package/dist/commands/slack-cli.js.map +1 -1
  13. package/dist/core/GitSync.d.ts.map +1 -1
  14. package/dist/core/GitSync.js +47 -5
  15. package/dist/core/GitSync.js.map +1 -1
  16. package/dist/core/PostUpdateMigrator.d.ts +7 -1
  17. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  18. package/dist/core/PostUpdateMigrator.js +19 -1
  19. package/dist/core/PostUpdateMigrator.js.map +1 -1
  20. package/dist/core/types.d.ts +9 -0
  21. package/dist/core/types.d.ts.map +1 -1
  22. package/dist/identity/IdentityManager.d.ts +70 -0
  23. package/dist/identity/IdentityManager.d.ts.map +1 -0
  24. package/dist/identity/IdentityManager.js +179 -0
  25. package/dist/identity/IdentityManager.js.map +1 -0
  26. package/dist/identity/KeyEncryption.d.ts +40 -0
  27. package/dist/identity/KeyEncryption.d.ts.map +1 -0
  28. package/dist/identity/KeyEncryption.js +93 -0
  29. package/dist/identity/KeyEncryption.js.map +1 -0
  30. package/dist/identity/KeyRevocation.d.ts +68 -0
  31. package/dist/identity/KeyRevocation.d.ts.map +1 -0
  32. package/dist/identity/KeyRevocation.js +171 -0
  33. package/dist/identity/KeyRevocation.js.map +1 -0
  34. package/dist/identity/KeyRotation.d.ts +43 -0
  35. package/dist/identity/KeyRotation.d.ts.map +1 -0
  36. package/dist/identity/KeyRotation.js +81 -0
  37. package/dist/identity/KeyRotation.js.map +1 -0
  38. package/dist/identity/Migration.d.ts +50 -0
  39. package/dist/identity/Migration.d.ts.map +1 -0
  40. package/dist/identity/Migration.js +125 -0
  41. package/dist/identity/Migration.js.map +1 -0
  42. package/dist/identity/RecoveryPhrase.d.ts +43 -0
  43. package/dist/identity/RecoveryPhrase.d.ts.map +1 -0
  44. package/dist/identity/RecoveryPhrase.js +93 -0
  45. package/dist/identity/RecoveryPhrase.js.map +1 -0
  46. package/dist/identity/index.d.ts +13 -0
  47. package/dist/identity/index.d.ts.map +1 -0
  48. package/dist/identity/index.js +20 -0
  49. package/dist/identity/index.js.map +1 -0
  50. package/dist/identity/types.d.ts +101 -0
  51. package/dist/identity/types.d.ts.map +1 -0
  52. package/dist/identity/types.js +55 -0
  53. package/dist/identity/types.js.map +1 -0
  54. package/dist/knowledge/TreeTriage.d.ts.map +1 -1
  55. package/dist/knowledge/TreeTriage.js +9 -0
  56. package/dist/knowledge/TreeTriage.js.map +1 -1
  57. package/dist/memory/TopicMemory.d.ts +2 -0
  58. package/dist/memory/TopicMemory.d.ts.map +1 -1
  59. package/dist/memory/TopicMemory.js +55 -0
  60. package/dist/memory/TopicMemory.js.map +1 -1
  61. package/dist/messaging/slack/SlackAdapter.d.ts +15 -4
  62. package/dist/messaging/slack/SlackAdapter.d.ts.map +1 -1
  63. package/dist/messaging/slack/SlackAdapter.js +131 -14
  64. package/dist/messaging/slack/SlackAdapter.js.map +1 -1
  65. package/dist/messaging/slack/SocketModeClient.d.ts +2 -0
  66. package/dist/messaging/slack/SocketModeClient.d.ts.map +1 -1
  67. package/dist/messaging/slack/SocketModeClient.js +31 -1
  68. package/dist/messaging/slack/SocketModeClient.js.map +1 -1
  69. package/dist/moltbridge/MoltBridgeClient.d.ts +124 -0
  70. package/dist/moltbridge/MoltBridgeClient.d.ts.map +1 -0
  71. package/dist/moltbridge/MoltBridgeClient.js +321 -0
  72. package/dist/moltbridge/MoltBridgeClient.js.map +1 -0
  73. package/dist/moltbridge/ProfileCompiler.d.ts +68 -0
  74. package/dist/moltbridge/ProfileCompiler.d.ts.map +1 -0
  75. package/dist/moltbridge/ProfileCompiler.js +317 -0
  76. package/dist/moltbridge/ProfileCompiler.js.map +1 -0
  77. package/dist/moltbridge/index.d.ts +12 -0
  78. package/dist/moltbridge/index.d.ts.map +1 -0
  79. package/dist/moltbridge/index.js +11 -0
  80. package/dist/moltbridge/index.js.map +1 -0
  81. package/dist/moltbridge/routes.d.ts +21 -0
  82. package/dist/moltbridge/routes.d.ts.map +1 -0
  83. package/dist/moltbridge/routes.js +224 -0
  84. package/dist/moltbridge/routes.js.map +1 -0
  85. package/dist/moltbridge/types.d.ts +93 -0
  86. package/dist/moltbridge/types.d.ts.map +1 -0
  87. package/dist/moltbridge/types.js +20 -0
  88. package/dist/moltbridge/types.js.map +1 -0
  89. package/dist/monitoring/PresenceProxy.d.ts +3 -0
  90. package/dist/monitoring/PresenceProxy.d.ts.map +1 -1
  91. package/dist/monitoring/PresenceProxy.js +80 -3
  92. package/dist/monitoring/PresenceProxy.js.map +1 -1
  93. package/dist/monitoring/SessionMonitor.d.ts +7 -0
  94. package/dist/monitoring/SessionMonitor.d.ts.map +1 -1
  95. package/dist/monitoring/SessionMonitor.js +47 -22
  96. package/dist/monitoring/SessionMonitor.js.map +1 -1
  97. package/dist/monitoring/TriageOrchestrator.d.ts.map +1 -1
  98. package/dist/monitoring/TriageOrchestrator.js +25 -1
  99. package/dist/monitoring/TriageOrchestrator.js.map +1 -1
  100. package/dist/scaffold/templates.d.ts.map +1 -1
  101. package/dist/scaffold/templates.js +29 -1
  102. package/dist/scaffold/templates.js.map +1 -1
  103. package/dist/server/AgentServer.d.ts +1 -0
  104. package/dist/server/AgentServer.d.ts.map +1 -1
  105. package/dist/server/AgentServer.js +1 -0
  106. package/dist/server/AgentServer.js.map +1 -1
  107. package/dist/server/routes.d.ts +2 -0
  108. package/dist/server/routes.d.ts.map +1 -1
  109. package/dist/server/routes.js +21 -0
  110. package/dist/server/routes.js.map +1 -1
  111. package/dist/threadline/AuthorizationPolicy.d.ts +110 -0
  112. package/dist/threadline/AuthorizationPolicy.d.ts.map +1 -0
  113. package/dist/threadline/AuthorizationPolicy.js +226 -0
  114. package/dist/threadline/AuthorizationPolicy.js.map +1 -0
  115. package/dist/threadline/DiscoveryWaterfall.d.ts +73 -0
  116. package/dist/threadline/DiscoveryWaterfall.d.ts.map +1 -0
  117. package/dist/threadline/DiscoveryWaterfall.js +113 -0
  118. package/dist/threadline/DiscoveryWaterfall.js.map +1 -0
  119. package/dist/threadline/ListenerSessionManager.d.ts.map +1 -1
  120. package/dist/threadline/ListenerSessionManager.js +2 -0
  121. package/dist/threadline/ListenerSessionManager.js.map +1 -1
  122. package/dist/threadline/MessageSecurity.d.ts +49 -0
  123. package/dist/threadline/MessageSecurity.d.ts.map +1 -0
  124. package/dist/threadline/MessageSecurity.js +93 -0
  125. package/dist/threadline/MessageSecurity.js.map +1 -0
  126. package/dist/threadline/SecureInvitation.d.ts +79 -0
  127. package/dist/threadline/SecureInvitation.d.ts.map +1 -0
  128. package/dist/threadline/SecureInvitation.js +164 -0
  129. package/dist/threadline/SecureInvitation.js.map +1 -0
  130. package/dist/threadline/TrustAuditLog.d.ts +49 -0
  131. package/dist/threadline/TrustAuditLog.d.ts.map +1 -0
  132. package/dist/threadline/TrustAuditLog.js +111 -0
  133. package/dist/threadline/TrustAuditLog.js.map +1 -0
  134. package/dist/threadline/TrustEvaluator.d.ts +69 -0
  135. package/dist/threadline/TrustEvaluator.d.ts.map +1 -0
  136. package/dist/threadline/TrustEvaluator.js +93 -0
  137. package/dist/threadline/TrustEvaluator.js.map +1 -0
  138. package/dist/threadline/UnifiedTrustWiring.d.ts +66 -0
  139. package/dist/threadline/UnifiedTrustWiring.d.ts.map +1 -0
  140. package/dist/threadline/UnifiedTrustWiring.js +192 -0
  141. package/dist/threadline/UnifiedTrustWiring.js.map +1 -0
  142. package/dist/threadline/client/IdentityManager.d.ts +27 -6
  143. package/dist/threadline/client/IdentityManager.d.ts.map +1 -1
  144. package/dist/threadline/client/IdentityManager.js +64 -18
  145. package/dist/threadline/client/IdentityManager.js.map +1 -1
  146. package/dist/threadline/relay/SybilProtection.d.ts +78 -0
  147. package/dist/threadline/relay/SybilProtection.d.ts.map +1 -0
  148. package/dist/threadline/relay/SybilProtection.js +187 -0
  149. package/dist/threadline/relay/SybilProtection.js.map +1 -0
  150. package/package.json +9 -3
  151. package/playbook-scripts/build-state.py +529 -0
  152. package/scripts/check-contract-evidence.js +103 -0
  153. package/scripts/pre-push-gate.js +53 -0
  154. package/scripts/run-contract-tests.js +75 -0
  155. package/src/data/builtin-manifest.json +87 -63
  156. package/src/templates/hooks/build-stop-hook.sh +79 -0
  157. package/upgrades/0.26.10.md +36 -0
  158. package/upgrades/0.27.1.md +101 -0
  159. package/upgrades/0.27.2.md +36 -0
  160. package/upgrades/NEXT.md +0 -27
  161. /package/.claude/skills/secret-setup/{SKILL.md → skill.md} +0 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * TrustEvaluator — Computes trust level from local history + optional network signals.
3
+ *
4
+ * Spec Section 3.2 Layer 2:
5
+ * - Local trust: direct interaction history, circuit breaker state, user-granted upgrades
6
+ * - Network trust: MoltBridge IQS score (advisory only)
7
+ * - Local trust ALWAYS takes precedence over network signals
8
+ *
9
+ * Trust levels: untrusted → verified → trusted (no auto-escalation)
10
+ * Decay: trusted → verified at 90d inactivity, verified → untrusted at 180d
11
+ */
12
+ import { TRUST_DECAY } from '../identity/types.js';
13
+ // ── Evaluator ────────────────────────────────────────────────────────
14
+ /**
15
+ * Evaluate the effective trust level for an agent.
16
+ *
17
+ * Pure function — no side effects, no state mutation.
18
+ * Deterministic given the same signals.
19
+ */
20
+ export function evaluateTrust(signals, now) {
21
+ const currentTime = (now ?? new Date()).getTime();
22
+ let level = signals.localLevel;
23
+ let reason = `Local trust: ${level} (source: ${signals.source})`;
24
+ let downgraded = false;
25
+ // Circuit breaker auto-downgrade: 3 activations in 24h → untrusted
26
+ if (signals.circuitBreakerActivations >= 3) {
27
+ level = 'untrusted';
28
+ reason = `Auto-downgraded: ${signals.circuitBreakerActivations} circuit breaker activations in 24h`;
29
+ downgraded = true;
30
+ }
31
+ // Trust decay (only if not already downgraded by circuit breaker)
32
+ if (!downgraded && signals.lastInteraction) {
33
+ const lastTime = new Date(signals.lastInteraction).getTime();
34
+ const daysSinceInteraction = (currentTime - lastTime) / (24 * 60 * 60 * 1000);
35
+ if (level === 'trusted' && daysSinceInteraction > TRUST_DECAY.trustedToVerifiedDays) {
36
+ level = 'verified';
37
+ reason = `Trust decayed: no interaction for ${Math.floor(daysSinceInteraction)} days (threshold: ${TRUST_DECAY.trustedToVerifiedDays}d)`;
38
+ downgraded = true;
39
+ }
40
+ const totalDecayDays = TRUST_DECAY.trustedToVerifiedDays + TRUST_DECAY.verifiedToUntrustedDays;
41
+ if ((level === 'verified' || signals.localLevel === 'trusted') && daysSinceInteraction > totalDecayDays) {
42
+ level = 'untrusted';
43
+ reason = `Trust decayed: no interaction for ${Math.floor(daysSinceInteraction)} days (threshold: ${totalDecayDays}d)`;
44
+ downgraded = true;
45
+ }
46
+ }
47
+ // Network advisory (MoltBridge IQS) — advisory only, never overrides local
48
+ let networkAdvisory;
49
+ if (signals.networkIQS) {
50
+ if (signals.networkIQS === 'low' && level !== 'untrusted') {
51
+ networkAdvisory = `Warning: Network trust score is LOW for this agent. Local trust is ${level}.`;
52
+ }
53
+ else if (signals.networkIQS === 'high' && level === 'untrusted') {
54
+ networkAdvisory = `Note: Network trust score is HIGH but local trust is untrusted. Consider verifying.`;
55
+ }
56
+ }
57
+ return { level, reason, networkAdvisory, downgraded };
58
+ }
59
+ /**
60
+ * Check if a trust upgrade is allowed.
61
+ *
62
+ * Only user-granted and paired-machine-granted sources can upgrade trust.
63
+ * No auto-escalation ever.
64
+ */
65
+ export function canUpgradeTrust(currentLevel, targetLevel, source) {
66
+ const order = ['untrusted', 'verified', 'trusted'];
67
+ const currentIdx = order.indexOf(currentLevel);
68
+ const targetIdx = order.indexOf(targetLevel);
69
+ if (targetIdx <= currentIdx) {
70
+ return { allowed: false, reason: 'Target level is not higher than current level' };
71
+ }
72
+ const allowedSources = ['user-granted', 'paired-machine-granted', 'invitation', 'os-verified'];
73
+ if (!allowedSources.includes(source)) {
74
+ return { allowed: false, reason: `Source "${source}" cannot upgrade trust. Requires user or verified source.` };
75
+ }
76
+ return { allowed: true, reason: `Upgrade from ${currentLevel} to ${targetLevel} via ${source}` };
77
+ }
78
+ /**
79
+ * Determine same-machine trust eligibility.
80
+ * Returns 'verified' if trust-domain criteria are met, null otherwise.
81
+ *
82
+ * Spec Section 3.5: Same OS user + same host + local IPC = auto-verified.
83
+ */
84
+ export function evaluateSameMachineTrust(localUid, remoteUid, isLocalTransport) {
85
+ if (!isLocalTransport) {
86
+ return { eligible: false, reason: 'Not a local transport (Unix domain socket or loopback required)' };
87
+ }
88
+ if (localUid !== remoteUid) {
89
+ return { eligible: false, reason: `Different OS user: local=${localUid}, remote=${remoteUid}` };
90
+ }
91
+ return { eligible: true, reason: 'Same OS user, local transport — auto-verified eligible' };
92
+ }
93
+ //# sourceMappingURL=TrustEvaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrustEvaluator.js","sourceRoot":"","sources":["../../src/threadline/TrustEvaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * UnifiedTrustWiring — Connects the three-layer trust model into the existing Threadline infrastructure.
3
+ *
4
+ * This module is the integration glue between:
5
+ * - Build 1: Canonical identity (src/identity/)
6
+ * - Build 2: AuthorizationPolicy, TrustEvaluator, SecureInvitation, MoltBridgeClient,
7
+ * DiscoveryWaterfall, MessageSecurity, TrustAuditLog, SybilProtection
8
+ * - Existing: AgentTrustManager, InboundMessageGate, ThreadlineBootstrap
9
+ *
10
+ * Rather than modifying existing classes (risky for regressions), this creates
11
+ * a unified facade that composes all components.
12
+ */
13
+ import type { AgentTrustManager } from './AgentTrustManager.js';
14
+ import { AuthorizationPolicyManager, type PolicyEvaluation, type ResourceType, type ActionType } from './AuthorizationPolicy.js';
15
+ import { type TrustLevel } from './TrustEvaluator.js';
16
+ import { TrustAuditLog, type AuditAction } from './TrustAuditLog.js';
17
+ import { SecureInvitationManager } from './SecureInvitation.js';
18
+ import { DiscoveryWaterfall, type DiscoveryResult, type DiscoveryOptions } from './DiscoveryWaterfall.js';
19
+ import { MoltBridgeClient, type MoltBridgeConfig } from '../moltbridge/MoltBridgeClient.js';
20
+ import { CanonicalIdentityManager } from '../identity/IdentityManager.js';
21
+ export interface UnifiedTrustConfig {
22
+ stateDir: string;
23
+ moltbridge?: MoltBridgeConfig;
24
+ /** Passphrase for canonical identity encryption. Omit for dev/unencrypted. */
25
+ identityPassphrase?: string;
26
+ }
27
+ export interface UnifiedTrustSystem {
28
+ /** The existing trust manager (backward-compatible) */
29
+ trustManager: AgentTrustManager;
30
+ /** New authorization policy manager */
31
+ authPolicy: AuthorizationPolicyManager;
32
+ /** Hash-chain audit log */
33
+ auditLog: TrustAuditLog;
34
+ /** Ed25519-signed invitation manager */
35
+ invitations: SecureInvitationManager;
36
+ /** Three-tier discovery */
37
+ discovery: DiscoveryWaterfall;
38
+ /** MoltBridge client (null if disabled) */
39
+ moltbridge: MoltBridgeClient | null;
40
+ /** Canonical identity manager */
41
+ identity: CanonicalIdentityManager;
42
+ /** Evaluate combined trust + authorization for a permission check */
43
+ checkPermission: (fingerprint: string, resource: ResourceType, resourceId: string | undefined, action: ActionType) => UnifiedPermissionResult;
44
+ /** Frame an incoming agent message for prompt injection defense */
45
+ frameMessage: (content: string, senderFingerprint: string) => string;
46
+ /** Run discovery waterfall */
47
+ discover: (options: DiscoveryOptions) => Promise<DiscoveryResult>;
48
+ /** Audit a trust/authorization event */
49
+ audit: (action: AuditAction, subject: string, actor: string, details?: Record<string, unknown>) => void;
50
+ /** Clean shutdown */
51
+ shutdown: () => void;
52
+ }
53
+ export interface UnifiedPermissionResult {
54
+ allowed: boolean;
55
+ trustLevel: TrustLevel;
56
+ authorizationResult: PolicyEvaluation;
57
+ reason: string;
58
+ }
59
+ /**
60
+ * Create the unified trust system.
61
+ *
62
+ * Call this during server initialization, after bootstrapThreadline().
63
+ * It wraps the existing AgentTrustManager with the three-layer model.
64
+ */
65
+ export declare function createUnifiedTrustSystem(existingTrustManager: AgentTrustManager, config: UnifiedTrustConfig): UnifiedTrustSystem;
66
+ //# sourceMappingURL=UnifiedTrustWiring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnifiedTrustWiring.d.ts","sourceRoot":"","sources":["../../src/threadline/UnifiedTrustWiring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAE,0BAA0B,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACjI,OAAO,EAAkC,KAAK,UAAU,EAAmC,MAAM,qBAAqB,CAAC;AACvH,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,EAAE,uBAAuB,EAAwB,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAyB,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACjI,OAAO,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAS1E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,YAAY,EAAE,iBAAiB,CAAC;IAChC,uCAAuC;IACvC,UAAU,EAAE,0BAA0B,CAAC;IACvC,2BAA2B;IAC3B,QAAQ,EAAE,aAAa,CAAC;IACxB,wCAAwC;IACxC,WAAW,EAAE,uBAAuB,CAAC;IACrC,2BAA2B;IAC3B,SAAS,EAAE,kBAAkB,CAAC;IAC9B,2CAA2C;IAC3C,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,iCAAiC;IACjC,QAAQ,EAAE,wBAAwB,CAAC;IACnC,qEAAqE;IACrE,eAAe,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,UAAU,KAAK,uBAAuB,CAAC;IAC9I,mEAAmE;IACnE,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,KAAK,MAAM,CAAC;IACrE,8BAA8B;IAC9B,QAAQ,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IAClE,wCAAwC;IACxC,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACxG,qBAAqB;IACrB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,mBAAmB,EAAE,gBAAgB,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;CAChB;AAID;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,oBAAoB,EAAE,iBAAiB,EACvC,MAAM,EAAE,kBAAkB,GACzB,kBAAkB,CAiLpB"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * UnifiedTrustWiring — Connects the three-layer trust model into the existing Threadline infrastructure.
3
+ *
4
+ * This module is the integration glue between:
5
+ * - Build 1: Canonical identity (src/identity/)
6
+ * - Build 2: AuthorizationPolicy, TrustEvaluator, SecureInvitation, MoltBridgeClient,
7
+ * DiscoveryWaterfall, MessageSecurity, TrustAuditLog, SybilProtection
8
+ * - Existing: AgentTrustManager, InboundMessageGate, ThreadlineBootstrap
9
+ *
10
+ * Rather than modifying existing classes (risky for regressions), this creates
11
+ * a unified facade that composes all components.
12
+ */
13
+ import { AuthorizationPolicyManager } from './AuthorizationPolicy.js';
14
+ import { TrustAuditLog } from './TrustAuditLog.js';
15
+ import { frameIncomingMessage, detectPotentialInjection } from './MessageSecurity.js';
16
+ import { SecureInvitationManager } from './SecureInvitation.js';
17
+ import { DiscoveryWaterfall } from './DiscoveryWaterfall.js';
18
+ import { MoltBridgeClient } from '../moltbridge/MoltBridgeClient.js';
19
+ import { CanonicalIdentityManager } from '../identity/IdentityManager.js';
20
+ import { hasLegacyIdentity, hasCanonicalIdentity, migrateFromLegacy, } from '../identity/Migration.js';
21
+ // ── Factory ──────────────────────────────────────────────────────────
22
+ /**
23
+ * Create the unified trust system.
24
+ *
25
+ * Call this during server initialization, after bootstrapThreadline().
26
+ * It wraps the existing AgentTrustManager with the three-layer model.
27
+ */
28
+ export function createUnifiedTrustSystem(existingTrustManager, config) {
29
+ const { stateDir } = config;
30
+ // Initialize canonical identity (migrate from legacy if needed)
31
+ const identity = new CanonicalIdentityManager(stateDir);
32
+ if (!identity.exists()) {
33
+ if (hasLegacyIdentity(stateDir) && !hasCanonicalIdentity(stateDir)) {
34
+ const result = migrateFromLegacy(stateDir, {
35
+ passphrase: config.identityPassphrase,
36
+ skipRecovery: !config.identityPassphrase, // skip recovery in dev mode
37
+ });
38
+ // Note: result.recoveryPhrase should be surfaced to the user
39
+ // via the dashboard or attention queue. Not done here.
40
+ identity.load({ passphrase: config.identityPassphrase });
41
+ }
42
+ else {
43
+ identity.create({
44
+ passphrase: config.identityPassphrase,
45
+ skipRecovery: !config.identityPassphrase,
46
+ });
47
+ }
48
+ }
49
+ else {
50
+ identity.load({ passphrase: config.identityPassphrase });
51
+ }
52
+ // Create new components
53
+ const authPolicy = new AuthorizationPolicyManager(stateDir);
54
+ const auditLog = new TrustAuditLog(stateDir);
55
+ const invitations = new SecureInvitationManager(stateDir);
56
+ const discoveryWaterfall = new DiscoveryWaterfall();
57
+ // MoltBridge (optional)
58
+ let moltbridge = null;
59
+ if (config.moltbridge?.enabled) {
60
+ moltbridge = new MoltBridgeClient(config.moltbridge);
61
+ // Initialize SDK with identity keys for Ed25519 auth signing
62
+ const id = identity.get();
63
+ if (id) {
64
+ moltbridge.initializeWithIdentity(id);
65
+ // Register MoltBridge as discovery stage 3
66
+ const moltbridgeAdapter = {
67
+ source: 'moltbridge',
68
+ isAvailable: () => moltbridge !== null && moltbridge.initialized && !moltbridge.isCircuitBreakerOpen,
69
+ search: async (query, limit) => {
70
+ const result = await moltbridge.discover(query, limit);
71
+ return result.agents.map(a => ({
72
+ fingerprint: a.agentId,
73
+ displayName: a.agentName,
74
+ capabilities: a.capabilities,
75
+ source: 'moltbridge',
76
+ sourcePrecedence: 1,
77
+ iqsBand: undefined,
78
+ profileCard: {
79
+ narrativeSummary: a.agentName ? `${a.agentName} on MoltBridge` : undefined,
80
+ profileCompletenessScore: undefined,
81
+ profileUrl: `/agent/profile/${a.agentId}`,
82
+ },
83
+ }));
84
+ },
85
+ };
86
+ discoveryWaterfall.registerAdapter(moltbridgeAdapter);
87
+ }
88
+ }
89
+ // Wire trust change callback to audit log
90
+ // The existing trustManager's onTrustChange fires on every trust change.
91
+ // We intercept it to also write to the hash-chain audit log.
92
+ /**
93
+ * Combined permission check: trust baseline ∩ authorization grants.
94
+ *
95
+ * 1. Get trust level from existing AgentTrustManager
96
+ * 2. Check if trust level allows the operation baseline
97
+ * 3. Check authorization grants for explicit allow/deny
98
+ * 4. Combined result: both must allow
99
+ */
100
+ function checkPermission(fingerprint, resource, resourceId, action) {
101
+ // Trust baseline from existing manager
102
+ const trustLevel = existingTrustManager.getTrustLevelByFingerprint(fingerprint);
103
+ // checkPermission needs the agent name or fingerprint key — find the profile
104
+ const profile = existingTrustManager.getProfileByFingerprint(fingerprint);
105
+ const agentKey = profile?.agent ?? fingerprint;
106
+ const trustBaseline = existingTrustManager.checkPermission(agentKey, mapActionToOperation(action));
107
+ // Authorization policy check
108
+ const authResult = authPolicy.evaluate(fingerprint, resource, resourceId, action);
109
+ // Combined: trust baseline must allow AND (authorization must allow OR no grants exist)
110
+ // If no authorization grants exist, fall back to trust-only (backward compat)
111
+ const grantsExist = authPolicy.getGrantsForSubject(fingerprint).length > 0;
112
+ let allowed;
113
+ let reason;
114
+ if (!trustBaseline) {
115
+ allowed = false;
116
+ reason = `Trust baseline denied: trust level "${trustLevel}" does not permit "${action}"`;
117
+ }
118
+ else if (grantsExist && !authResult.allowed) {
119
+ allowed = false;
120
+ reason = `Authorization denied: ${authResult.reason}`;
121
+ }
122
+ else {
123
+ allowed = true;
124
+ reason = grantsExist
125
+ ? `Allowed: trust baseline (${trustLevel}) + authorization grant`
126
+ : `Allowed: trust baseline (${trustLevel}), no specific grants`;
127
+ }
128
+ return { allowed, trustLevel, authorizationResult: authResult, reason };
129
+ }
130
+ /**
131
+ * Frame an incoming message with security markers.
132
+ */
133
+ function frameMessage(content, senderFingerprint) {
134
+ const trustLevel = existingTrustManager.getTrustLevelByFingerprint(senderFingerprint);
135
+ // Detect potential injection (advisory logging)
136
+ const injectionCheck = detectPotentialInjection(content);
137
+ if (injectionCheck.suspicious) {
138
+ auditLog.append('injection-detected', senderFingerprint, 'system', {
139
+ patterns: injectionCheck.patterns,
140
+ });
141
+ }
142
+ return frameIncomingMessage(content, senderFingerprint, trustLevel);
143
+ }
144
+ /**
145
+ * Run discovery with registered adapters.
146
+ */
147
+ async function discover(options) {
148
+ return discoveryWaterfall.discover(options);
149
+ }
150
+ /**
151
+ * Write to the audit log.
152
+ */
153
+ function audit(action, subject, actor, details) {
154
+ auditLog.append(action, subject, actor, details);
155
+ }
156
+ /**
157
+ * Clean shutdown — flush all state to disk.
158
+ */
159
+ function shutdown() {
160
+ authPolicy.flush();
161
+ authPolicy.pruneExpired();
162
+ }
163
+ return {
164
+ trustManager: existingTrustManager,
165
+ authPolicy,
166
+ auditLog,
167
+ invitations,
168
+ discovery: discoveryWaterfall,
169
+ moltbridge,
170
+ identity,
171
+ checkPermission,
172
+ frameMessage,
173
+ discover,
174
+ audit,
175
+ shutdown,
176
+ };
177
+ }
178
+ // ── Helpers ──────────────────────────────────────────────────────────
179
+ /** Map ActionType to legacy operation string for backward compat */
180
+ function mapActionToOperation(action) {
181
+ const mapping = {
182
+ message: 'message',
183
+ request_task: 'task-request',
184
+ delegate: 'delegate',
185
+ read: 'data-share',
186
+ write: 'data-share',
187
+ execute: 'spawn',
188
+ probe: 'ping',
189
+ };
190
+ return mapping[action] ?? action;
191
+ }
192
+ //# sourceMappingURL=UnifiedTrustWiring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnifiedTrustWiring.js","sourceRoot":"","sources":["../../src/threadline/UnifiedTrustWiring.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,14 @@
1
1
  /**
2
2
  * IdentityManager — Manages Ed25519 identity keys for relay agents.
3
3
  *
4
- * Generates, stores, and loads identity keypairs from disk.
5
- * Part of Threadline Relay Phase 1.
4
+ * Delegates to the canonical identity ({stateDir}/identity.json) when available,
5
+ * falling back to the legacy Threadline identity ({stateDir}/threadline/identity.json).
6
+ *
7
+ * This ensures backward compatibility: existing agents keep working with their
8
+ * legacy identity, while new/migrated agents use the canonical location.
9
+ *
10
+ * The IdentityInfo interface is unchanged — consumers don't need to know
11
+ * which storage backend is in use.
6
12
  */
7
13
  import type { AgentFingerprint } from '../relay/types.js';
8
14
  export interface IdentityInfo {
@@ -14,12 +20,18 @@ export interface IdentityInfo {
14
20
  }
15
21
  export declare class IdentityManager {
16
22
  private readonly stateDir;
17
- private readonly keyFile;
23
+ private readonly legacyKeyFile;
24
+ private readonly canonicalKeyFile;
18
25
  private identity;
19
26
  constructor(stateDir: string);
20
27
  /**
21
28
  * Get or create the agent's identity.
22
- * Generates a new keypair on first use, loads from disk on subsequent uses.
29
+ *
30
+ * Priority:
31
+ * 1. Cached in-memory identity
32
+ * 2. Canonical identity ({stateDir}/identity.json)
33
+ * 3. Legacy identity ({stateDir}/threadline/identity.json)
34
+ * 4. Generate new (saves to legacy path for backward compat)
23
35
  */
24
36
  getOrCreate(): IdentityInfo;
25
37
  /**
@@ -27,14 +39,23 @@ export declare class IdentityManager {
27
39
  */
28
40
  get(): IdentityInfo | null;
29
41
  /**
30
- * Check if an identity exists.
42
+ * Check if an identity exists (canonical or legacy).
31
43
  */
32
44
  exists(): boolean;
33
45
  /**
34
46
  * Get the directory where keys are stored.
35
47
  */
36
48
  get keyDir(): string;
37
- private loadFromDisk;
49
+ /**
50
+ * Load from canonical identity.json (new format).
51
+ * Only loads unencrypted keys — encrypted keys require the CanonicalIdentityManager
52
+ * with a passphrase, which is handled at a higher level.
53
+ */
54
+ private loadFromCanonical;
55
+ /**
56
+ * Load from legacy threadline/identity.json (old format).
57
+ */
58
+ private loadFromLegacy;
38
59
  private saveToDisk;
39
60
  }
40
61
  //# sourceMappingURL=IdentityManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IdentityManager.d.ts","sourceRoot":"","sources":["../../../src/threadline/client/IdentityManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAA6B;gBAEjC,QAAQ,EAAE,MAAM;IAK5B;;;OAGG;IACH,WAAW,IAAI,YAAY;IAyB3B;;OAEG;IACH,GAAG,IAAI,YAAY,GAAG,IAAI;IAS1B;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAID,OAAO,CAAC,YAAY;IAmBpB,OAAO,CAAC,UAAU;CAiBnB"}
1
+ {"version":3,"file":"IdentityManager.d.ts","sourceRoot":"","sources":["../../../src/threadline/client/IdentityManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAA6B;gBAEjC,QAAQ,EAAE,MAAM;IAM5B;;;;;;;;OAQG;IACH,WAAW,IAAI,YAAY;IAyB3B;;OAEG;IACH,GAAG,IAAI,YAAY,GAAG,IAAI;IAS1B;;OAEG;IACH,MAAM,IAAI,OAAO;IAMjB;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAID;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,UAAU;CAiBnB"}
@@ -1,8 +1,14 @@
1
1
  /**
2
2
  * IdentityManager — Manages Ed25519 identity keys for relay agents.
3
3
  *
4
- * Generates, stores, and loads identity keypairs from disk.
5
- * Part of Threadline Relay Phase 1.
4
+ * Delegates to the canonical identity ({stateDir}/identity.json) when available,
5
+ * falling back to the legacy Threadline identity ({stateDir}/threadline/identity.json).
6
+ *
7
+ * This ensures backward compatibility: existing agents keep working with their
8
+ * legacy identity, while new/migrated agents use the canonical location.
9
+ *
10
+ * The IdentityInfo interface is unchanged — consumers don't need to know
11
+ * which storage backend is in use.
6
12
  */
7
13
  import fs from 'node:fs';
8
14
  import path from 'node:path';
@@ -10,26 +16,33 @@ import { generateIdentityKeyPair } from '../ThreadlineCrypto.js';
10
16
  import { computeFingerprint, deriveX25519PublicKey } from './MessageEncryptor.js';
11
17
  export class IdentityManager {
12
18
  stateDir;
13
- keyFile;
19
+ legacyKeyFile;
20
+ canonicalKeyFile;
14
21
  identity = null;
15
22
  constructor(stateDir) {
16
23
  this.stateDir = stateDir;
17
- this.keyFile = path.join(stateDir, 'threadline', 'identity.json');
24
+ this.legacyKeyFile = path.join(stateDir, 'threadline', 'identity.json');
25
+ this.canonicalKeyFile = path.join(stateDir, 'identity.json');
18
26
  }
19
27
  /**
20
28
  * Get or create the agent's identity.
21
- * Generates a new keypair on first use, loads from disk on subsequent uses.
29
+ *
30
+ * Priority:
31
+ * 1. Cached in-memory identity
32
+ * 2. Canonical identity ({stateDir}/identity.json)
33
+ * 3. Legacy identity ({stateDir}/threadline/identity.json)
34
+ * 4. Generate new (saves to legacy path for backward compat)
22
35
  */
23
36
  getOrCreate() {
24
37
  if (this.identity)
25
38
  return this.identity;
26
- // Try loading from disk
27
- const loaded = this.loadFromDisk();
39
+ // Try canonical first, then legacy
40
+ const loaded = this.loadFromCanonical() ?? this.loadFromLegacy();
28
41
  if (loaded) {
29
42
  this.identity = loaded;
30
43
  return loaded;
31
44
  }
32
- // Generate new identity
45
+ // Generate new identity (legacy path for backward compat with standalone tooling)
33
46
  const keypair = generateIdentityKeyPair();
34
47
  const identity = {
35
48
  fingerprint: computeFingerprint(keypair.publicKey),
@@ -48,30 +61,63 @@ export class IdentityManager {
48
61
  get() {
49
62
  if (this.identity)
50
63
  return this.identity;
51
- const loaded = this.loadFromDisk();
64
+ const loaded = this.loadFromCanonical() ?? this.loadFromLegacy();
52
65
  if (loaded) {
53
66
  this.identity = loaded;
54
67
  }
55
68
  return this.identity;
56
69
  }
57
70
  /**
58
- * Check if an identity exists.
71
+ * Check if an identity exists (canonical or legacy).
59
72
  */
60
73
  exists() {
61
- return this.identity !== null || fs.existsSync(this.keyFile);
74
+ return this.identity !== null
75
+ || fs.existsSync(this.canonicalKeyFile)
76
+ || fs.existsSync(this.legacyKeyFile);
62
77
  }
63
78
  /**
64
79
  * Get the directory where keys are stored.
65
80
  */
66
81
  get keyDir() {
67
- return path.dirname(this.keyFile);
82
+ return path.dirname(this.legacyKeyFile);
68
83
  }
69
84
  // ── Private ─────────────────────────────────────────────────────
70
- loadFromDisk() {
85
+ /**
86
+ * Load from canonical identity.json (new format).
87
+ * Only loads unencrypted keys — encrypted keys require the CanonicalIdentityManager
88
+ * with a passphrase, which is handled at a higher level.
89
+ */
90
+ loadFromCanonical() {
91
+ try {
92
+ if (!fs.existsSync(this.canonicalKeyFile))
93
+ return null;
94
+ const raw = JSON.parse(fs.readFileSync(this.canonicalKeyFile, 'utf-8'));
95
+ // Only load if unencrypted — encrypted keys need CanonicalIdentityManager
96
+ if (raw.privateKeyEncryption && raw.privateKeyEncryption !== 'none') {
97
+ return null;
98
+ }
99
+ const privateKey = Buffer.from(raw.privateKey, 'base64');
100
+ const publicKey = Buffer.from(raw.publicKey, 'base64');
101
+ return {
102
+ fingerprint: computeFingerprint(publicKey),
103
+ publicKey,
104
+ privateKey,
105
+ x25519PublicKey: deriveX25519PublicKey(privateKey),
106
+ createdAt: raw.createdAt,
107
+ };
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }
113
+ /**
114
+ * Load from legacy threadline/identity.json (old format).
115
+ */
116
+ loadFromLegacy() {
71
117
  try {
72
- if (!fs.existsSync(this.keyFile))
118
+ if (!fs.existsSync(this.legacyKeyFile))
73
119
  return null;
74
- const raw = JSON.parse(fs.readFileSync(this.keyFile, 'utf-8'));
120
+ const raw = JSON.parse(fs.readFileSync(this.legacyKeyFile, 'utf-8'));
75
121
  const privateKey = Buffer.from(raw.privateKey, 'base64');
76
122
  return {
77
123
  fingerprint: raw.fingerprint,
@@ -88,7 +134,7 @@ export class IdentityManager {
88
134
  }
89
135
  }
90
136
  saveToDisk(identity) {
91
- const dir = path.dirname(this.keyFile);
137
+ const dir = path.dirname(this.legacyKeyFile);
92
138
  fs.mkdirSync(dir, { recursive: true });
93
139
  const data = JSON.stringify({
94
140
  fingerprint: identity.fingerprint,
@@ -98,9 +144,9 @@ export class IdentityManager {
98
144
  createdAt: identity.createdAt,
99
145
  }, null, 2);
100
146
  // Atomic write
101
- const tmpPath = `${this.keyFile}.${process.pid}.tmp`;
147
+ const tmpPath = `${this.legacyKeyFile}.${process.pid}.tmp`;
102
148
  fs.writeFileSync(tmpPath, data, { mode: 0o600 });
103
- fs.renameSync(tmpPath, this.keyFile);
149
+ fs.renameSync(tmpPath, this.legacyKeyFile);
104
150
  }
105
151
  }
106
152
  //# sourceMappingURL=IdentityManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IdentityManager.js","sourceRoot":"","sources":["../../../src/threadline/client/IdentityManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IdentityManager.js","sourceRoot":"","sources":["../../../src/threadline/client/IdentityManager.ts"],"names":[],"mappings":"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"}