@agentdock/wire 0.0.45 → 0.0.46

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 (94) hide show
  1. package/dist/agentCapabilities.d.ts.map +1 -0
  2. package/dist/agentCapabilities.js +195 -1
  3. package/dist/agentCapabilities.js.map +1 -0
  4. package/dist/agentCommonEnv.d.ts.map +1 -0
  5. package/dist/agentCommonEnv.js +20 -1
  6. package/dist/agentCommonEnv.js.map +1 -0
  7. package/dist/agentInstallGuide.d.ts.map +1 -0
  8. package/dist/agentInstallGuide.js +81 -1
  9. package/dist/agentInstallGuide.js.map +1 -0
  10. package/dist/checkpointSchemas.d.ts.map +1 -0
  11. package/dist/checkpointSchemas.js +46 -1
  12. package/dist/checkpointSchemas.js.map +1 -0
  13. package/dist/controlLevel.d.ts.map +1 -0
  14. package/dist/controlLevel.js +11 -1
  15. package/dist/controlLevel.js.map +1 -0
  16. package/dist/edition.d.ts.map +1 -0
  17. package/dist/edition.js +13 -1
  18. package/dist/edition.js.map +1 -0
  19. package/dist/envelope.d.ts.map +1 -0
  20. package/dist/envelope.js +78 -1
  21. package/dist/envelope.js.map +1 -0
  22. package/dist/errorMessage.d.ts.map +1 -0
  23. package/dist/errorMessage.js +6 -1
  24. package/dist/errorMessage.js.map +1 -0
  25. package/dist/events.d.ts.map +1 -0
  26. package/dist/events.js +97 -1
  27. package/dist/events.js.map +1 -0
  28. package/dist/features.d.ts.map +1 -0
  29. package/dist/features.js +112 -1
  30. package/dist/features.js.map +1 -0
  31. package/dist/feedback.d.ts.map +1 -0
  32. package/dist/feedback.js +26 -1
  33. package/dist/feedback.js.map +1 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +64 -1
  36. package/dist/index.js.map +1 -0
  37. package/dist/interactionEvents.d.ts.map +1 -0
  38. package/dist/interactionEvents.js +108 -1
  39. package/dist/interactionEvents.js.map +1 -0
  40. package/dist/legacyProtocol.d.ts.map +1 -0
  41. package/dist/legacyProtocol.js +30 -1
  42. package/dist/legacyProtocol.js.map +1 -0
  43. package/dist/license.d.ts.map +1 -0
  44. package/dist/license.js +17 -1
  45. package/dist/license.js.map +1 -0
  46. package/dist/machine.d.ts.map +1 -0
  47. package/dist/machine.js +56 -1
  48. package/dist/machine.js.map +1 -0
  49. package/dist/messageMeta.d.ts.map +1 -0
  50. package/dist/messageMeta.js +60 -1
  51. package/dist/messageMeta.js.map +1 -0
  52. package/dist/messages.d.ts.map +1 -0
  53. package/dist/messages.js +35 -1
  54. package/dist/messages.js.map +1 -0
  55. package/dist/ops.d.ts.map +1 -0
  56. package/dist/ops.js +74 -1
  57. package/dist/ops.js.map +1 -0
  58. package/dist/pairing.d.ts.map +1 -0
  59. package/dist/pairing.js +115 -1
  60. package/dist/pairing.js.map +1 -0
  61. package/dist/protocol.d.ts.map +1 -0
  62. package/dist/protocol.js +7 -1
  63. package/dist/protocol.js.map +1 -0
  64. package/dist/rpc.d.ts.map +1 -0
  65. package/dist/rpc.js +246 -1
  66. package/dist/rpc.js.map +1 -0
  67. package/dist/scheduledTasks.d.ts.map +1 -0
  68. package/dist/scheduledTasks.js +81 -1
  69. package/dist/scheduledTasks.js.map +1 -0
  70. package/dist/semver.d.ts.map +1 -0
  71. package/dist/semver.js +60 -1
  72. package/dist/semver.js.map +1 -0
  73. package/dist/sessionResult.d.ts.map +1 -0
  74. package/dist/sessionResult.js +23 -1
  75. package/dist/sessionResult.js.map +1 -0
  76. package/dist/socketEvents.d.ts.map +1 -0
  77. package/dist/socketEvents.js +44 -1
  78. package/dist/socketEvents.js.map +1 -0
  79. package/dist/spawnError.d.ts.map +1 -0
  80. package/dist/spawnError.js +31 -1
  81. package/dist/spawnError.js.map +1 -0
  82. package/dist/stats.d.ts.map +1 -0
  83. package/dist/stats.js +126 -1
  84. package/dist/stats.js.map +1 -0
  85. package/dist/sync.d.ts.map +1 -0
  86. package/dist/sync.js +78 -1
  87. package/dist/sync.js.map +1 -0
  88. package/dist/telemetry.d.ts.map +1 -0
  89. package/dist/telemetry.js +80 -1
  90. package/dist/telemetry.js.map +1 -0
  91. package/dist/utils.d.ts.map +1 -0
  92. package/dist/utils.js +2 -1
  93. package/dist/utils.js.map +1 -0
  94. package/package.json +1 -1
package/dist/machine.js CHANGED
@@ -1 +1,56 @@
1
- "use strict";import{z as o}from"zod";import{LabsSettingsSchema as e}from"./rpc.js";export const PlatformSchema=o.enum(["darwin","linux","win32"]),SessionStatusSchema=o.enum(["idle","thinking","tool_running","permission_required","disconnected"]),MachineSummarySchema=o.object({id:o.string(),hostname:o.string(),platform:PlatformSchema,arch:o.string().optional(),displayName:o.string().optional(),daemonVersion:o.string().optional(),active:o.boolean(),activeAt:o.number(),createdAt:o.number(),hasTerminal:o.boolean().optional(),activeSessions:o.number().optional(),totalSessions:o.number().optional(),availableAgents:o.array(o.string()).optional(),supportedMethods:o.array(o.string()).optional(),disconnectReason:o.enum(["normal","upgrade-required"]).optional(),upgradeStatus:o.enum(["idle","preflight","downloading","switching","failed"]).optional(),upgradeError:o.string().optional(),superseded:o.boolean().optional()}),MachineRegisterResultSchema=o.object({ok:o.boolean(),error:o.string().optional(),latestVersion:o.string().optional(),labsSettings:e.optional()}),SetDefaultMachineBodySchema=o.object({machineId:o.string().nullable()});
1
+ /**
2
+ * Machine and session status schemas for Dashboard & Machine Management.
3
+ *
4
+ * MachineSummary — device info returned by GET /v1/machines.
5
+ * SessionStatus — real-time session state indicator.
6
+ * Platform — OS platform enum matching Node's process.platform.
7
+ */
8
+ import { z } from 'zod';
9
+ import { LabsSettingsSchema } from './rpc.js';
10
+ export const PlatformSchema = z.enum(['darwin', 'linux', 'win32']);
11
+ export const SessionStatusSchema = z.enum([
12
+ 'idle',
13
+ 'thinking',
14
+ 'tool_running',
15
+ 'permission_required',
16
+ 'disconnected',
17
+ ]);
18
+ export const MachineSummarySchema = z.object({
19
+ id: z.string(),
20
+ hostname: z.string(),
21
+ platform: PlatformSchema,
22
+ arch: z.string().optional(),
23
+ displayName: z.string().optional(),
24
+ daemonVersion: z.string().optional(),
25
+ active: z.boolean(),
26
+ activeAt: z.number(),
27
+ createdAt: z.number(),
28
+ /** Whether this machine has an active terminal-server tunnel. */
29
+ hasTerminal: z.boolean().optional(),
30
+ /** Number of active sessions on this machine. */
31
+ activeSessions: z.number().optional(),
32
+ /** Total number of sessions on this machine. */
33
+ totalSessions: z.number().optional(),
34
+ /** Agent types available on this machine (persisted on each daemon connect). */
35
+ availableAgents: z.array(z.string()).optional(),
36
+ /** RPC methods this machine's daemon has registered (RFC-035). */
37
+ supportedMethods: z.array(z.string()).optional(),
38
+ /** Why the machine disconnected — 'upgrade-required' triggers UI upgrade prompts (RFC-037). */
39
+ disconnectReason: z.enum(['normal', 'upgrade-required']).optional(),
40
+ /** Current upgrade state reported by the daemon (RFC-042). */
41
+ upgradeStatus: z.enum(['idle', 'preflight', 'downloading', 'switching', 'failed']).optional(),
42
+ /** Error message when upgradeStatus is 'failed' (RFC-042). */
43
+ upgradeError: z.string().optional(),
44
+ /** True when this machine has been replaced by a new one (container rebuild). */
45
+ superseded: z.boolean().optional(),
46
+ });
47
+ export const MachineRegisterResultSchema = z.object({
48
+ ok: z.boolean(),
49
+ error: z.string().optional(),
50
+ latestVersion: z.string().optional(),
51
+ labsSettings: LabsSettingsSchema.optional(),
52
+ });
53
+ export const SetDefaultMachineBodySchema = z.object({
54
+ machineId: z.string().nullable(),
55
+ });
56
+ //# sourceMappingURL=machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machine.js","sourceRoot":"","sources":["../src/machine.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAGnE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC;IACxC,MAAM;IACN,UAAU;IACV,cAAc;IACd,qBAAqB;IACrB,cAAc;CACf,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,cAAc;IACxB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;IACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,iEAAiE;IACjE,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACnC,iDAAiD;IACjD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,gDAAgD;IAChD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,gFAAgF;IAChF,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC/C,kEAAkE;IAClE,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAChD,+FAA+F;IAC/F,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnE,8DAA8D;IAC9D,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC7F,8DAA8D;IAC9D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,iFAAiF;IACjF,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE;IACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpC,YAAY,EAAE,kBAAkB,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageMeta.d.ts","sourceRoot":"","sources":["../src/messageMeta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,+DAA+D;AAC/D,eAAO,MAAM,eAAe,iGAS1B,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,8EAA8E;AAC9E,eAAO,MAAM,WAAW,sFAA0B,CAAC;AAEnD,uEAAuE;AACvE,eAAO,MAAM,gBAAgB,oFAE5B,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,eAAe,qFAQlB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,iBAAiB;;;;;;;;;;IAU5B,0DAA0D;;IAE1D,yCAAyC;;IAEzC,uCAAuC;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKvC,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D;oEACoE;AACpE,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAStE,CAAC"}
@@ -1 +1,60 @@
1
- "use strict";import{z as e}from"zod";import{PermissionModeSchema as l}from"./interactionEvents.js";export const AgentTypeSchema=e.enum(["claude","copilot","codex","gemini","opencode","hermes","openclaw","custom"]),AGENT_TYPES=AgentTypeSchema.options,SPAWNABLE_AGENTS=AGENT_TYPES.filter(o=>o!=="custom"),CLI_AGENT_TYPES=["claude","copilot","opencode","codex","gemini","hermes","openclaw"],MessageMetaSchema=e.object({sentFrom:e.string().optional(),permissionMode:l.optional(),model:e.string().nullable().optional(),fallbackModel:e.string().nullable().optional(),customSystemPrompt:e.string().nullable().optional(),appendSystemPrompt:e.string().nullable().optional(),allowedTools:e.array(e.string()).nullable().optional(),disallowedTools:e.array(e.string()).nullable().optional(),displayText:e.string().optional(),agentType:AgentTypeSchema.nullable().optional(),startedAt:e.number().nullable().optional(),sessionStatus:e.enum(["running","idle","completed","failed","cancelled"]).nullable().optional()}),AGENT_SUPPORTS_IMAGES={claude:!0,copilot:!0,codex:!1,gemini:!0,opencode:!0,hermes:!1,openclaw:!1,custom:!0};
1
+ import { z } from 'zod';
2
+ import { PermissionModeSchema } from './interactionEvents.js';
3
+ /** Supported agent types for avatar and UI differentiation. */
4
+ export const AgentTypeSchema = z.enum([
5
+ 'claude',
6
+ 'copilot',
7
+ 'codex',
8
+ 'gemini',
9
+ 'opencode',
10
+ 'hermes',
11
+ 'openclaw',
12
+ 'custom',
13
+ ]);
14
+ /** All agent type values derived from the schema (single source of truth). */
15
+ export const AGENT_TYPES = AgentTypeSchema.options;
16
+ /** Agent types that can be spawned as sessions (excludes 'custom'). */
17
+ export const SPAWNABLE_AGENTS = AGENT_TYPES.filter((a) => a !== 'custom');
18
+ /** CLI identifiers accepted by spawn-session RPC. */
19
+ export const CLI_AGENT_TYPES = [
20
+ 'claude',
21
+ 'copilot',
22
+ 'opencode',
23
+ 'codex',
24
+ 'gemini',
25
+ 'hermes',
26
+ 'openclaw',
27
+ ];
28
+ export const MessageMetaSchema = z.object({
29
+ sentFrom: z.string().optional(),
30
+ permissionMode: PermissionModeSchema.optional(),
31
+ model: z.string().nullable().optional(),
32
+ fallbackModel: z.string().nullable().optional(),
33
+ customSystemPrompt: z.string().nullable().optional(),
34
+ appendSystemPrompt: z.string().nullable().optional(),
35
+ allowedTools: z.array(z.string()).nullable().optional(),
36
+ disallowedTools: z.array(z.string()).nullable().optional(),
37
+ displayText: z.string().optional(),
38
+ /** Agent type for UI differentiation (avatar, colors). */
39
+ agentType: AgentTypeSchema.nullable().optional(),
40
+ /** Session start timestamp (Unix ms). */
41
+ startedAt: z.number().nullable().optional(),
42
+ /** Session status for info display. */
43
+ sessionStatus: z
44
+ .enum(['running', 'idle', 'completed', 'failed', 'cancelled'])
45
+ .nullable()
46
+ .optional(),
47
+ });
48
+ /** Hardcoded per-agent image support. UX-driven: hides image button immediately on agent selection.
49
+ * Updated when agents add ACP promptCapabilities.image support. */
50
+ export const AGENT_SUPPORTS_IMAGES = {
51
+ claude: true,
52
+ copilot: true,
53
+ codex: false, // Only supports URL/localPath, not base64
54
+ gemini: true,
55
+ opencode: true,
56
+ hermes: false, // ACP: promptCapabilities.image = false
57
+ openclaw: false, // ACP: promptCapabilities.image = false
58
+ custom: true, // Unknown, assume yes
59
+ };
60
+ //# sourceMappingURL=messageMeta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageMeta.js","sourceRoot":"","sources":["../src/messageMeta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,+DAA+D;AAC/D,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC;IACpC,QAAQ;IACR,SAAS;IACT,OAAO;IACP,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,UAAU;IACV,QAAQ;CACT,CAAC,CAAC;AAIH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC;AAEnD,uEAAuE;AACvE,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC,MAAM,CAChD,CAAC,CAAC,EAAqC,EAAE,CAAC,CAAC,KAAK,QAAQ,CACzD,CAAC;AAEF,qDAAqD;AACrD,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ;IACR,SAAS;IACT,UAAU;IACV,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,UAAU;CACF,CAAC;AAGX,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,cAAc,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACvC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC/C,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACpD,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACpD,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACvD,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC1D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,0DAA0D;IAC1D,SAAS,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAChD,yCAAyC;IACzC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,uCAAuC;IACvC,aAAa,EAAE,CAAC;SACb,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;SAC7D,QAAQ,EAAE;SACV,QAAQ,EAAE;CACd,CAAC,CAAC;AAIH;oEACoE;AACpE,MAAM,CAAC,MAAM,qBAAqB,GAAyC;IACzE,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,KAAK,EAAE,0CAA0C;IACxD,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,KAAK,EAAE,wCAAwC;IACvD,QAAQ,EAAE,KAAK,EAAE,wCAAwC;IACzD,MAAM,EAAE,IAAI,EAAE,sBAAsB;CACrC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
package/dist/messages.js CHANGED
@@ -1 +1,35 @@
1
- "use strict";import{z as e}from"zod";import{SessionEnvelopeSchema as t}from"./envelope.js";import{MessageMetaSchema as o}from"./messageMeta.js";import{UserMessageSchema as s,AgentMessageSchema as n}from"./legacyProtocol.js";export const SessionMessageContentSchema=e.object({c:e.string(),t:e.enum(["encrypted","plaintext"])}),SessionMessageSchema=e.object({id:e.string(),seq:e.number(),localId:e.string().nullish(),content:SessionMessageContentSchema,createdAt:e.number(),updatedAt:e.number()}),SessionProtocolMessageSchema=e.object({role:e.literal("session"),content:t,meta:o.optional()}),MessageContentSchema=e.discriminatedUnion("role",[s,n,SessionProtocolMessageSchema]);
1
+ /**
2
+ * Message schemas — aligned with Happy messages.ts.
3
+ *
4
+ * SessionMessage: encrypted content container.
5
+ * Timestamps are Unix numbers (milliseconds).
6
+ */
7
+ import { z } from 'zod';
8
+ import { SessionEnvelopeSchema } from './envelope.js';
9
+ import { MessageMetaSchema } from './messageMeta.js';
10
+ import { UserMessageSchema, AgentMessageSchema } from './legacyProtocol.js';
11
+ export const SessionMessageContentSchema = z.object({
12
+ c: z.string(),
13
+ t: z.enum(['encrypted', 'plaintext']),
14
+ });
15
+ export const SessionMessageSchema = z.object({
16
+ id: z.string(),
17
+ seq: z.number(),
18
+ localId: z.string().nullish(),
19
+ content: SessionMessageContentSchema,
20
+ createdAt: z.number(),
21
+ updatedAt: z.number(),
22
+ });
23
+ // ── SessionProtocolMessage (bridges envelope into message content) ──
24
+ export const SessionProtocolMessageSchema = z.object({
25
+ role: z.literal('session'),
26
+ content: SessionEnvelopeSchema,
27
+ meta: MessageMetaSchema.optional(),
28
+ });
29
+ // ── MessageContent (union of all message content types) ─────────────
30
+ export const MessageContentSchema = z.discriminatedUnion('role', [
31
+ UserMessageSchema,
32
+ AgentMessageSchema,
33
+ SessionProtocolMessageSchema,
34
+ ]);
35
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE5E,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;IACb,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;CACtC,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;IACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE;IAC7B,OAAO,EAAE,2BAA2B;IACpC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAIH,uEAAuE;AAEvE,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC1B,OAAO,EAAE,qBAAqB;IAC9B,IAAI,EAAE,iBAAiB,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAGH,uEAAuE;AAEvE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC/D,iBAAiB;IACjB,kBAAkB;IAClB,4BAA4B;CAC7B,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../src/ops.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,eAAO,MAAM,eAAe,aAGS,CAAC;AACtC,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,eAAO,MAAM,gBAAgB,6CAA2C,CAAC;AACzE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,wDAAwD;AACxD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;EAK9B,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,8DAA8D;AAC9D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAGD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;EAM1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAGxD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;EAQzB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAGtD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;EAI7B,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D,gDAAgD;AAChD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;EAOzB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,gEAAgE;AAChE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,oDAAoD;AACpD,eAAO,MAAM,4BAA4B;;;;;;;;;EAGvC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,sDAAsD;AACtD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;EAI3C,CAAC;AACH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gCAAgC,CAAC,CAAC;AAE1F,uEAAuE;AACvE,eAAO,MAAM,2BAA2B;;;;;;;;;EAGtC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC"}
package/dist/ops.js CHANGED
@@ -1 +1,74 @@
1
- "use strict";import{z as e}from"zod";export const OpsMethodSchema=e.string().min(1).regex(/^[a-z]+\.[a-z][a-z0-9-]*$/),OpsRpcTypeSchema=e.enum(["request","response","event"]),OpsRpcMessageSchema=e.object({id:e.string().min(1),type:OpsRpcTypeSchema,method:OpsMethodSchema,payload:e.unknown()}),FileEntrySchema=e.object({name:e.string(),type:e.enum(["file","directory"]),size:e.number().int().nonnegative(),modifiedAt:e.string(),mimeType:e.string().optional()}),FileStatSchema=e.object({name:e.string(),path:e.string(),type:e.enum(["file","directory"]),size:e.number().int().nonnegative(),modifiedAt:e.string(),createdAt:e.string(),mimeType:e.string().optional()}),StorageUsageSchema=e.object({used:e.number().int().nonnegative(),limit:e.number().int().nonnegative(),fileCount:e.number().int().nonnegative()}),SyncUserSchema=e.object({username:e.string().min(1),displayName:e.string(),machineId:e.string().nullable(),containerStatus:e.string(),healthStatus:e.string().nullable(),enabled:e.boolean()}),SyncFullPayloadSchema=e.object({users:e.array(SyncUserSchema)}),SyncUserCreatedPayloadSchema=e.object({username:e.string().min(1),displayName:e.string()}),SyncContainerStatusPayloadSchema=e.object({username:e.string().min(1),containerStatus:e.string(),healthStatus:e.string().nullable().optional()}),SyncUserPairedPayloadSchema=e.object({username:e.string().min(1),machineId:e.string().min(1)});
1
+ import { z } from 'zod';
2
+ /**
3
+ * Ops RPC method naming convention: namespace.action
4
+ * - file.* — RFC-033 file management
5
+ * - sync.* — RFC-034 data sync (Ops Agent → Server)
6
+ * - config.* — RFC-034 policy push (Server → Ops Agent)
7
+ */
8
+ export const OpsMethodSchema = z
9
+ .string()
10
+ .min(1)
11
+ .regex(/^[a-z]+\.[a-z][a-z0-9-]*$/);
12
+ export const OpsRpcTypeSchema = z.enum(['request', 'response', 'event']);
13
+ /** Unified RPC message over the ops-upstream tunnel. */
14
+ export const OpsRpcMessageSchema = z.object({
15
+ id: z.string().min(1),
16
+ type: OpsRpcTypeSchema,
17
+ method: OpsMethodSchema,
18
+ payload: z.unknown(),
19
+ });
20
+ // FileEntry — directory listing item
21
+ export const FileEntrySchema = z.object({
22
+ name: z.string(),
23
+ type: z.enum(['file', 'directory']),
24
+ size: z.number().int().nonnegative(),
25
+ modifiedAt: z.string(),
26
+ mimeType: z.string().optional(),
27
+ });
28
+ // FileStat — detailed metadata
29
+ export const FileStatSchema = z.object({
30
+ name: z.string(),
31
+ path: z.string(),
32
+ type: z.enum(['file', 'directory']),
33
+ size: z.number().int().nonnegative(),
34
+ modifiedAt: z.string(),
35
+ createdAt: z.string(),
36
+ mimeType: z.string().optional(),
37
+ });
38
+ // StorageUsage — quota info
39
+ export const StorageUsageSchema = z.object({
40
+ used: z.number().int().nonnegative(),
41
+ limit: z.number().int().nonnegative(),
42
+ fileCount: z.number().int().nonnegative(),
43
+ });
44
+ // ─── Sync payloads (RFC-034 P1) ─────────────────────────
45
+ /** A single user record in a full sync push. */
46
+ export const SyncUserSchema = z.object({
47
+ username: z.string().min(1),
48
+ displayName: z.string(),
49
+ machineId: z.string().nullable(),
50
+ containerStatus: z.string(),
51
+ healthStatus: z.string().nullable(),
52
+ enabled: z.boolean(),
53
+ });
54
+ /** sync.full — all users pushed on tunnel connect/reconnect. */
55
+ export const SyncFullPayloadSchema = z.object({
56
+ users: z.array(SyncUserSchema),
57
+ });
58
+ /** sync.user-created — single user just created. */
59
+ export const SyncUserCreatedPayloadSchema = z.object({
60
+ username: z.string().min(1),
61
+ displayName: z.string(),
62
+ });
63
+ /** sync.container-status — container state change. */
64
+ export const SyncContainerStatusPayloadSchema = z.object({
65
+ username: z.string().min(1),
66
+ containerStatus: z.string(),
67
+ healthStatus: z.string().nullable().optional(),
68
+ });
69
+ /** sync.user-paired — daemon pairing detected, machineId available. */
70
+ export const SyncUserPairedPayloadSchema = z.object({
71
+ username: z.string().min(1),
72
+ machineId: z.string().min(1),
73
+ });
74
+ //# sourceMappingURL=ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ops.js","sourceRoot":"","sources":["../src/ops.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing.d.ts","sourceRoot":"","sources":["../src/pairing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,6BAA6B;AAC7B,eAAO,MAAM,YAAY,6DAA2D,CAAC;AA8BrF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;EAK/B,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;EAGhC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;EAGhC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;EAG/B,CAAC;AAgCH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAK9B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
package/dist/pairing.js CHANGED
@@ -1 +1,115 @@
1
- "use strict";import{z as e}from"zod";const o=e.string().regex(/^\d{6}$/,"PIN must be exactly 6 digits");export const PairingState=e.enum(["pending","exchange","authorized","expired"]);function s(i,c){if(!/^[A-Za-z0-9+/\-_]+=*$/.test(i))return!1;const n=i.replace(/-/g,"+").replace(/_/g,"/"),a=n.padEnd(n.length+(4-n.length%4)%4,"="),r=(a.match(/=+$/)??[""])[0].length;return a.length/4*3-r===c}const t=e.string().min(1).refine(i=>s(i,32),{message:"publicKey must be a base64-encoded 32-byte Curve25519 key"});export const PairingRequestSchema=e.object({publicKey:t,pin:o.optional(),label:e.string().max(100).optional(),type:e.enum(["join","invite"]).optional()}),PairingResponseSchema=e.object({publicKey:t,encryptedPayload:e.string().min(1)}),PairingExchangeSchema=e.object({daemonPublicKey:t,devicePublicKey:t}),PairingDeliverSchema=e.object({publicKey:t,encryptedPayload:e.string().min(1)});const g=e.object({state:e.literal("pending"),publicKey:e.string().min(1)}),l=e.object({state:e.literal("exchange"),publicKey:e.string().min(1),devicePublicKey:e.string().min(1)}),p=e.object({state:e.literal("authorized"),publicKey:e.string().min(1),encryptedPayload:e.string().min(1),token:e.string().min(1)}),d=e.object({state:e.literal("expired"),publicKey:e.string().min(1)});export const PairingStatusSchema=e.discriminatedUnion("state",[g,l,p,d]);
1
+ /**
2
+ * Pairing protocol schemas.
3
+ *
4
+ * Defines the wire format for device pairing:
5
+ * - PairingRequest: CLI sends publicKey + optional PIN to server
6
+ * - PairingResponse: Web sends encrypted payload back via server
7
+ * - PairingStatus: Polling response — discriminated union on state
8
+ *
9
+ * Security: Uses NaCl Box (Curve25519 + XSalsa20-Poly1305) for key exchange.
10
+ * PIN code provides iOS PWA fallback where QR scanning is unreliable.
11
+ */
12
+ import { z } from 'zod';
13
+ /** 6-digit numeric PIN for iOS PWA fallback. */
14
+ const PinSchema = z.string().regex(/^\d{6}$/, 'PIN must be exactly 6 digits');
15
+ /** Pairing state machine. */
16
+ export const PairingState = z.enum(['pending', 'exchange', 'authorized', 'expired']);
17
+ /**
18
+ * Validates that a string is a base64/base64url-encoded 32-byte Curve25519 public key.
19
+ * Accepts both standard base64 (with padding) and base64url (without padding).
20
+ */
21
+ /**
22
+ * Check if a base64/base64url string decodes to exactly `expectedBytes` bytes.
23
+ * Uses string-length math: 4 base64 chars = 3 bytes.
24
+ * No runtime decoding needed — just validate charset + length.
25
+ */
26
+ function isBase64OfLength(val, expectedBytes) {
27
+ // Must be non-empty and only valid base64/base64url characters
28
+ if (!/^[A-Za-z0-9+/\-_]+=*$/.test(val))
29
+ return false;
30
+ // Normalize base64url → standard base64
31
+ const b64 = val.replace(/-/g, '+').replace(/_/g, '/');
32
+ const padded = b64.padEnd(b64.length + ((4 - (b64.length % 4)) % 4), '=');
33
+ // Count padding
34
+ const paddingCount = (padded.match(/=+$/) ?? [''])[0].length;
35
+ const totalBytes = (padded.length / 4) * 3 - paddingCount;
36
+ return totalBytes === expectedBytes;
37
+ }
38
+ const Curve25519PublicKeySchema = z
39
+ .string()
40
+ .min(1)
41
+ .refine((val) => isBase64OfLength(val, 32), {
42
+ message: 'publicKey must be a base64-encoded 32-byte Curve25519 key',
43
+ });
44
+ /**
45
+ * CLI → Server: initiate a pairing request.
46
+ *
47
+ * publicKey: base64-encoded Curve25519 public key (32 bytes)
48
+ * pin: optional 6-digit PIN for manual entry (iOS PWA fallback)
49
+ * label: optional human-readable device label
50
+ */
51
+ export const PairingRequestSchema = z.object({
52
+ publicKey: Curve25519PublicKeySchema,
53
+ pin: PinSchema.optional(),
54
+ label: z.string().max(100).optional(),
55
+ type: z.enum(['join', 'invite']).optional(),
56
+ });
57
+ /**
58
+ * Web → Server: approve pairing with encrypted key material.
59
+ *
60
+ * publicKey: identifies which pairing request to respond to (32-byte Curve25519 key)
61
+ * encryptedPayload: NaCl Box encrypted data (base64) containing the DEK
62
+ */
63
+ export const PairingResponseSchema = z.object({
64
+ publicKey: Curve25519PublicKeySchema,
65
+ encryptedPayload: z.string().min(1),
66
+ });
67
+ /**
68
+ * New device → Server: submit device's temporary Curve25519 public key.
69
+ * Used in invite flow when a new device joins an existing account.
70
+ */
71
+ export const PairingExchangeSchema = z.object({
72
+ daemonPublicKey: Curve25519PublicKeySchema,
73
+ devicePublicKey: Curve25519PublicKeySchema,
74
+ });
75
+ /**
76
+ * Daemon → Server: deliver encrypted master secret to new device.
77
+ * Requires Bearer auth. Encrypted via NaCl Box using device's public key.
78
+ */
79
+ export const PairingDeliverSchema = z.object({
80
+ publicKey: Curve25519PublicKeySchema,
81
+ encryptedPayload: z.string().min(1),
82
+ });
83
+ /**
84
+ * Server → CLI: current pairing status (polled).
85
+ * Discriminated union on `state`:
86
+ * - pending: waiting for web approval
87
+ * - authorized: web approved, encryptedPayload + token required
88
+ * - expired: request timed out
89
+ */
90
+ const PairingStatusPending = z.object({
91
+ state: z.literal('pending'),
92
+ publicKey: z.string().min(1),
93
+ });
94
+ const PairingStatusExchange = z.object({
95
+ state: z.literal('exchange'),
96
+ publicKey: z.string().min(1),
97
+ devicePublicKey: z.string().min(1),
98
+ });
99
+ const PairingStatusAuthorized = z.object({
100
+ state: z.literal('authorized'),
101
+ publicKey: z.string().min(1),
102
+ encryptedPayload: z.string().min(1),
103
+ token: z.string().min(1),
104
+ });
105
+ const PairingStatusExpired = z.object({
106
+ state: z.literal('expired'),
107
+ publicKey: z.string().min(1),
108
+ });
109
+ export const PairingStatusSchema = z.discriminatedUnion('state', [
110
+ PairingStatusPending,
111
+ PairingStatusExchange,
112
+ PairingStatusAuthorized,
113
+ PairingStatusExpired,
114
+ ]);
115
+ //# sourceMappingURL=pairing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing.js","sourceRoot":"","sources":["../src/pairing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,IAAI,CAAC"}
package/dist/protocol.js CHANGED
@@ -1 +1,7 @@
1
- "use strict";export const PROTOCOL_VERSION=1;
1
+ /**
2
+ * Wire protocol version.
3
+ * Increment ONLY on breaking schema changes (new enum values, renamed events, required fields).
4
+ * See RFC-021 for the full versioning strategy.
5
+ */
6
+ export const PROTOCOL_VERSION = 1;
7
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"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"}