spawnfile 0.1.10 → 0.1.12

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 (198) hide show
  1. package/README.md +13 -2
  2. package/dist/cli/lifecycleCommands.js +101 -1
  3. package/dist/cli/modelCommands.js +3 -0
  4. package/dist/cli/resolveCommandInput.d.ts +19 -0
  5. package/dist/cli/resolveCommandInput.js +25 -0
  6. package/dist/cli/runCli.d.ts +4 -1
  7. package/dist/cli/runCli.js +37 -13
  8. package/dist/cli/runtimeCommands.js +1 -0
  9. package/dist/cli/statusCommand.d.ts +42 -0
  10. package/dist/cli/statusCommand.js +394 -0
  11. package/dist/cli/surfaceCommands.js +4 -0
  12. package/dist/compiler/agentSurfaces.js +2 -4
  13. package/dist/compiler/buildCompilePlanTeams.js +3 -1
  14. package/dist/compiler/compileProject.js +19 -10
  15. package/dist/compiler/compileProjectSupport.d.ts +1 -0
  16. package/dist/compiler/compileProjectSupport.js +1 -1
  17. package/dist/compiler/containerArtifacts.d.ts +1 -0
  18. package/dist/compiler/containerArtifacts.js +208 -32
  19. package/dist/compiler/containerArtifactsPlans.js +7 -4
  20. package/dist/compiler/containerArtifactsRender.d.ts +7 -1
  21. package/dist/compiler/containerArtifactsRender.js +6 -0
  22. package/dist/compiler/containerArtifactsTypes.d.ts +9 -0
  23. package/dist/compiler/containerEntrypointRender.js +18 -31
  24. package/dist/compiler/index.d.ts +1 -0
  25. package/dist/compiler/index.js +1 -0
  26. package/dist/compiler/moltnetArtifacts.d.ts +2 -0
  27. package/dist/compiler/moltnetArtifacts.js +58 -99
  28. package/dist/compiler/moltnetClientConfig.d.ts +2 -2
  29. package/dist/compiler/moltnetClientConfig.js +16 -23
  30. package/dist/compiler/moltnetConfigLowering.d.ts +3 -0
  31. package/dist/compiler/moltnetConfigLowering.js +13 -2
  32. package/dist/compiler/moltnetNodeConfig.d.ts +27 -0
  33. package/dist/compiler/moltnetNodeConfig.js +68 -0
  34. package/dist/compiler/moltnetResolution.js +1 -1
  35. package/dist/compiler/moltnetRoomMemberships.js +1 -2
  36. package/dist/compiler/moltnetRoomPolicyCompatibility.d.ts +4 -0
  37. package/dist/compiler/moltnetRoomPolicyCompatibility.js +28 -0
  38. package/dist/compiler/moltnetRuntimeConfig.d.ts +1 -1
  39. package/dist/compiler/moltnetRuntimeConfig.js +1 -13
  40. package/dist/compiler/networkBinding.d.ts +14 -0
  41. package/dist/compiler/networkBinding.js +34 -0
  42. package/dist/compiler/publishProject.d.ts +13 -0
  43. package/dist/compiler/publishProject.js +72 -0
  44. package/dist/compiler/runProject.d.ts +26 -12
  45. package/dist/compiler/runProject.js +102 -125
  46. package/dist/compiler/runProjectAuth.d.ts +5 -0
  47. package/dist/compiler/runProjectAuth.js +98 -0
  48. package/dist/compiler/runProjectDocker.d.ts +19 -0
  49. package/dist/compiler/runProjectDocker.js +57 -0
  50. package/dist/compiler/types.d.ts +3 -2
  51. package/dist/compiler/upProject.d.ts +6 -0
  52. package/dist/compiler/upProject.js +42 -8
  53. package/dist/compiler/view/buildOrganizationView.js +27 -3
  54. package/dist/compiler/view/declarations.d.ts +4 -0
  55. package/dist/compiler/view/declarations.js +104 -0
  56. package/dist/compiler/view/renderNetworks.js +12 -3
  57. package/dist/compiler/view/renderTree.js +16 -3
  58. package/dist/compiler/view/types.d.ts +77 -1
  59. package/dist/deployment/dockerInspect.d.ts +29 -0
  60. package/dist/deployment/dockerInspect.js +130 -0
  61. package/dist/deployment/dockerLabels.d.ts +16 -0
  62. package/dist/deployment/dockerLabels.js +32 -0
  63. package/dist/deployment/dockerLogs.d.ts +24 -0
  64. package/dist/deployment/dockerLogs.js +96 -0
  65. package/dist/deployment/dockerManager.d.ts +59 -0
  66. package/dist/deployment/dockerManager.js +76 -0
  67. package/dist/deployment/dockerProbeGateway.d.ts +16 -0
  68. package/dist/deployment/dockerProbeGateway.js +48 -0
  69. package/dist/deployment/homeStore.d.ts +19 -0
  70. package/dist/deployment/homeStore.js +130 -0
  71. package/dist/deployment/index.d.ts +9 -0
  72. package/dist/deployment/index.js +9 -0
  73. package/dist/deployment/names.d.ts +3 -0
  74. package/dist/deployment/names.js +12 -0
  75. package/dist/deployment/record.d.ts +76 -0
  76. package/dist/deployment/record.js +174 -0
  77. package/dist/deployment/target.d.ts +35 -0
  78. package/dist/deployment/target.js +96 -0
  79. package/dist/distribution/buildDistributionReport.d.ts +22 -0
  80. package/dist/distribution/buildDistributionReport.js +51 -0
  81. package/dist/distribution/consumeImage.d.ts +29 -0
  82. package/dist/distribution/consumeImage.js +254 -0
  83. package/dist/distribution/consumeImageSupport.d.ts +18 -0
  84. package/dist/distribution/consumeImageSupport.js +63 -0
  85. package/dist/distribution/distributionReportSchema.d.ts +84 -0
  86. package/dist/distribution/distributionReportSchema.js +107 -0
  87. package/dist/distribution/dockerRunner.d.ts +5 -0
  88. package/dist/distribution/dockerRunner.js +21 -0
  89. package/dist/distribution/extractImage.d.ts +25 -0
  90. package/dist/distribution/extractImage.js +96 -0
  91. package/dist/distribution/fingerprint.d.ts +2 -0
  92. package/dist/distribution/fingerprint.js +14 -0
  93. package/dist/distribution/imageRef.d.ts +9 -0
  94. package/dist/distribution/imageRef.js +65 -0
  95. package/dist/distribution/imageRuntimeAuth.d.ts +19 -0
  96. package/dist/distribution/imageRuntimeAuth.js +71 -0
  97. package/dist/distribution/index.d.ts +24 -0
  98. package/dist/distribution/index.js +16 -0
  99. package/dist/distribution/preflight.d.ts +11 -0
  100. package/dist/distribution/preflight.js +65 -0
  101. package/dist/distribution/projectImageView.d.ts +8 -0
  102. package/dist/distribution/projectImageView.js +83 -0
  103. package/dist/distribution/projectName.d.ts +1 -0
  104. package/dist/distribution/projectName.js +12 -0
  105. package/dist/distribution/renderImageInterface.d.ts +30 -0
  106. package/dist/distribution/renderImageInterface.js +86 -0
  107. package/dist/distribution/tarReader.d.ts +10 -0
  108. package/dist/distribution/tarReader.js +69 -0
  109. package/dist/distribution/types.d.ts +80 -0
  110. package/dist/distribution/types.js +4 -0
  111. package/dist/distribution/verifyDistributionReport.d.ts +12 -0
  112. package/dist/distribution/verifyDistributionReport.js +29 -0
  113. package/dist/filesystem/paths.d.ts +6 -0
  114. package/dist/filesystem/paths.js +11 -0
  115. package/dist/manifest/loadManifest.js +22 -2
  116. package/dist/manifest/renderSpawnfile.js +2 -4
  117. package/dist/manifest/renderSpawnfileNetworks.js +5 -0
  118. package/dist/manifest/schemas.d.ts +71 -41
  119. package/dist/manifest/surfaceSchemas.d.ts +19 -47
  120. package/dist/manifest/surfaceSchemas.js +3 -6
  121. package/dist/manifest/teamNetworkAccessSchemas.d.ts +15 -0
  122. package/dist/manifest/teamNetworkAccessSchemas.js +8 -0
  123. package/dist/manifest/teamNetworkConsoleSchemas.d.ts +7 -0
  124. package/dist/manifest/teamNetworkConsoleSchemas.js +19 -0
  125. package/dist/manifest/teamNetworkSchemas.d.ts +60 -0
  126. package/dist/manifest/teamNetworkSchemas.js +20 -7
  127. package/dist/report/createReport.d.ts +7 -1
  128. package/dist/report/createReport.js +28 -1
  129. package/dist/report/types.d.ts +43 -0
  130. package/dist/runtime/container.js +0 -16
  131. package/dist/runtime/index.d.ts +1 -0
  132. package/dist/runtime/index.js +1 -0
  133. package/dist/runtime/install.d.ts +0 -10
  134. package/dist/runtime/install.js +0 -45
  135. package/dist/runtime/openclaw/adapter.js +9 -1
  136. package/dist/runtime/openclaw/configAuth.d.ts +15 -0
  137. package/dist/runtime/openclaw/configAuth.js +46 -0
  138. package/dist/runtime/openclaw/runAuth.d.ts +6 -0
  139. package/dist/runtime/openclaw/runAuth.js +7 -55
  140. package/dist/runtime/openclaw/statusProbes.d.ts +2 -0
  141. package/dist/runtime/openclaw/statusProbes.js +31 -0
  142. package/dist/runtime/picoclaw/adapter.js +10 -0
  143. package/dist/runtime/picoclaw/runAuth.d.ts +7 -0
  144. package/dist/runtime/picoclaw/runAuth.js +8 -68
  145. package/dist/runtime/picoclaw/statusProbes.d.ts +2 -0
  146. package/dist/runtime/picoclaw/statusProbes.js +100 -0
  147. package/dist/runtime/registry.d.ts +0 -5
  148. package/dist/runtime/registry.js +2 -12
  149. package/dist/runtime/statusProbes.d.ts +16 -0
  150. package/dist/runtime/statusProbes.js +41 -0
  151. package/dist/runtime/types.d.ts +52 -1
  152. package/dist/shared/errors.d.ts +6 -0
  153. package/dist/shared/errors.js +9 -0
  154. package/dist/status/buildStatus.d.ts +13 -0
  155. package/dist/status/buildStatus.js +266 -0
  156. package/dist/status/compileReport.d.ts +96 -0
  157. package/dist/status/compileReport.js +230 -0
  158. package/dist/status/compiledContainerObservations.d.ts +5 -0
  159. package/dist/status/compiledContainerObservations.js +63 -0
  160. package/dist/status/deploymentLogs.d.ts +12 -0
  161. package/dist/status/deploymentLogs.js +45 -0
  162. package/dist/status/deployments.d.ts +14 -0
  163. package/dist/status/deployments.js +128 -0
  164. package/dist/status/imageStatusReport.d.ts +10 -0
  165. package/dist/status/imageStatusReport.js +73 -0
  166. package/dist/status/index.d.ts +14 -0
  167. package/dist/status/index.js +14 -0
  168. package/dist/status/moltnetProbes.d.ts +21 -0
  169. package/dist/status/moltnetProbes.js +240 -0
  170. package/dist/status/registryDrift.d.ts +28 -0
  171. package/dist/status/registryDrift.js +119 -0
  172. package/dist/status/renderStatus.d.ts +2 -0
  173. package/dist/status/renderStatus.js +230 -0
  174. package/dist/status/runtimeProbes.d.ts +13 -0
  175. package/dist/status/runtimeProbes.js +111 -0
  176. package/dist/status/selectionSubjects.d.ts +8 -0
  177. package/dist/status/selectionSubjects.js +77 -0
  178. package/dist/status/selectors.d.ts +14 -0
  179. package/dist/status/selectors.js +90 -0
  180. package/dist/status/traversal.d.ts +6 -0
  181. package/dist/status/traversal.js +15 -0
  182. package/dist/status/types.d.ts +113 -0
  183. package/dist/status/types.js +1 -0
  184. package/package.json +4 -2
  185. package/runtimes.yaml +22 -15
  186. package/dist/runtime/tinyclaw/adapter.d.ts +0 -2
  187. package/dist/runtime/tinyclaw/adapter.js +0 -284
  188. package/dist/runtime/tinyclaw/runAuth.d.ts +0 -2
  189. package/dist/runtime/tinyclaw/runAuth.js +0 -49
  190. package/dist/runtime/tinyclaw/scaffold-assets/AGENTS.md +0 -160
  191. package/dist/runtime/tinyclaw/scaffold-assets/CLAUDE.md +0 -5
  192. package/dist/runtime/tinyclaw/scaffold-assets/SOUL.md +0 -177
  193. package/dist/runtime/tinyclaw/scaffold.d.ts +0 -2
  194. package/dist/runtime/tinyclaw/scaffold.js +0 -24
  195. package/dist/runtime/tinyclaw/schedules.d.ts +0 -9
  196. package/dist/runtime/tinyclaw/schedules.js +0 -62
  197. package/dist/runtime/tinyclaw/surfaces.d.ts +0 -8
  198. package/dist/runtime/tinyclaw/surfaces.js +0 -94
@@ -1,37 +1,71 @@
1
+ import path from "node:path";
1
2
  import { removeDirectory } from "../filesystem/index.js";
3
+ import { writeDockerDeploymentRecordForRun } from "../deployment/index.js";
2
4
  import { buildProject } from "./buildProject.js";
3
- import { createDockerRunInvocation, runDockerContainer } from "./runProject.js";
5
+ import { createDockerRunInvocation, resolveDetachedDeploymentOptions, runDockerContainer } from "./runProject.js";
4
6
  import { requireAuthProfile } from "../auth/index.js";
7
+ import { DEFAULT_OUTPUT_DIRECTORY } from "../shared/index.js";
5
8
  export const upProject = async (inputPath, options = {}) => {
9
+ const resolvedOptions = await resolveDetachedDeploymentOptions(path.resolve(options.outputDirectory ?? DEFAULT_OUTPUT_DIRECTORY), {
10
+ authProfile: options.authProfile,
11
+ containerName: options.containerName,
12
+ deploymentName: options.deploymentName,
13
+ detach: options.detach,
14
+ dockerCommand: options.dockerCommand,
15
+ dockerContext: options.dockerContext,
16
+ dockerHost: options.dockerHost,
17
+ envFilePath: options.envFilePath,
18
+ imageTag: options.imageTag,
19
+ targetExecFile: options.targetExecFile
20
+ });
6
21
  const buildResult = await buildProject(inputPath, {
7
22
  buildRunner: options.buildRunner,
8
23
  clean: options.clean,
9
24
  dockerCommand: options.dockerCommand,
10
- imageTag: options.imageTag,
25
+ imageTag: resolvedOptions.imageTag,
11
26
  outputDirectory: options.outputDirectory
12
27
  });
13
- const authProfile = options.authProfile
14
- ? await requireAuthProfile(options.authProfile)
28
+ const authProfile = resolvedOptions.authProfile
29
+ ? await requireAuthProfile(resolvedOptions.authProfile)
15
30
  : null;
16
- const invocation = await createDockerRunInvocation(buildResult, buildResult.imageTag, {
31
+ const imageTag = resolvedOptions.imageTag ?? buildResult.imageTag;
32
+ const invocation = await createDockerRunInvocation(buildResult, imageTag, {
17
33
  authProfile,
18
- containerName: options.containerName,
34
+ containerName: resolvedOptions.containerName,
19
35
  detach: options.detach,
36
+ deploymentName: resolvedOptions.deploymentName,
20
37
  dockerCommand: options.dockerCommand,
21
- envFilePath: options.envFilePath
38
+ dockerContext: resolvedOptions.dockerContext,
39
+ dockerHost: resolvedOptions.dockerHost,
40
+ envFilePath: resolvedOptions.envFilePath
22
41
  });
42
+ let runMetadata;
23
43
  try {
24
- await (options.runRunner ?? runDockerContainer)(invocation);
44
+ runMetadata = await (options.runRunner ?? runDockerContainer)(invocation);
25
45
  }
26
46
  finally {
27
47
  if (!invocation.detach) {
28
48
  await removeDirectory(invocation.supportDirectory);
29
49
  }
30
50
  }
51
+ const deploymentRecordPath = invocation.detach && invocation.deploymentName
52
+ ? await writeDockerDeploymentRecordForRun({
53
+ authProfileName: authProfile?.name ?? null,
54
+ envFilePath: resolvedOptions.envFilePath,
55
+ imageTag,
56
+ invocation,
57
+ outputDirectory: buildResult.outputDirectory,
58
+ report: buildResult.report,
59
+ runMetadata: runMetadata ?? undefined,
60
+ targetExecFile: options.targetExecFile
61
+ })
62
+ : null;
31
63
  return {
32
64
  ...buildResult,
33
65
  authProfileName: authProfile?.name ?? null,
34
66
  containerName: invocation.containerName,
67
+ deploymentRecordPath,
68
+ imageTag,
35
69
  supportDirectory: invocation.supportDirectory
36
70
  };
37
71
  };
@@ -2,6 +2,7 @@ import path from "node:path";
2
2
  import { SpawnfileError } from "../../shared/index.js";
3
3
  import { buildCompilePlan } from "../buildCompilePlan.js";
4
4
  import { resolveMoltnetRoomMemberships } from "../moltnetRoomMemberships.js";
5
+ import { buildDeclaredNodeView, buildRuntimeViews } from "./declarations.js";
5
6
  const createNameCounts = (plan) => {
6
7
  const counts = new Map();
7
8
  for (const node of plan.nodes) {
@@ -30,7 +31,11 @@ const buildTreeNetworkSummaries = (node) => {
30
31
  return [];
31
32
  }
32
33
  return (node.value.networks ?? []).map((network) => ({
34
+ agentRegistration: network.server?.auth.agent_registration,
33
35
  authMode: network.server?.auth.mode,
36
+ consoleAnalytics: network.server?.mode === "managed"
37
+ ? network.server.console?.analytics?.provider
38
+ : undefined,
34
39
  debugEvents: network.server?.mode === "managed" ? network.server.debug_events : undefined,
35
40
  directMessages: network.server?.mode === "managed" ? network.server.direct_messages : undefined,
36
41
  expose: network.server?.mode === "managed" ? network.server.human_ingress : undefined,
@@ -38,11 +43,14 @@ const buildTreeNetworkSummaries = (node) => {
38
43
  id: network.id,
39
44
  name: network.name,
40
45
  provider: network.provider,
46
+ publicRead: network.server?.auth.public_read,
41
47
  serverMode: network.server?.mode,
42
48
  url: network.server?.url,
43
49
  rooms: network.rooms.map((room) => ({
44
50
  declaredMembers: [...room.members],
45
- id: room.id
51
+ id: room.id,
52
+ ...(room.visibility ? { visibility: room.visibility } : {}),
53
+ ...(room.write_policy ? { writePolicy: room.write_policy } : {})
46
54
  }))
47
55
  }));
48
56
  };
@@ -75,7 +83,9 @@ const buildTreeNode = (node, nodeById, edgesBySource, nameCounts, ancestors = []
75
83
  kind: node.kind,
76
84
  name: node.value.name,
77
85
  networks: buildTreeNetworkSummaries(node),
86
+ declared: buildDeclaredNodeView(node),
78
87
  runtimeName: node.runtimeName,
88
+ slug: node.slug,
79
89
  source: node.value.source
80
90
  };
81
91
  };
@@ -107,7 +117,11 @@ const toNetworkMemberView = (membership) => ({
107
117
  });
108
118
  const createNetworkKey = (provider, networkId) => `${provider}::${networkId}`;
109
119
  const buildNetworkDeclaration = (teamNode, network, roomMemberships) => ({
120
+ agentRegistration: network.server?.auth.agent_registration,
110
121
  authMode: network.server?.auth.mode,
122
+ consoleAnalytics: network.server?.mode === "managed"
123
+ ? network.server.console?.analytics?.provider
124
+ : undefined,
111
125
  debugEvents: network.server?.mode === "managed" ? network.server.debug_events : undefined,
112
126
  declaringTeamName: teamNode.name,
113
127
  declaringTeamSource: teamNode.source,
@@ -115,6 +129,7 @@ const buildNetworkDeclaration = (teamNode, network, roomMemberships) => ({
115
129
  expose: network.server?.mode === "managed" ? network.server.human_ingress : undefined,
116
130
  httpEnabled: network.server?.mode === "managed" ? network.server.human_ingress === true : false,
117
131
  name: network.name,
132
+ publicRead: network.server?.auth.public_read,
118
133
  serverMode: network.server?.mode,
119
134
  url: network.server?.url,
120
135
  rooms: network.rooms.map((room) => {
@@ -126,7 +141,9 @@ const buildNetworkDeclaration = (teamNode, network, roomMemberships) => ({
126
141
  return {
127
142
  declaredMembers: [...room.members],
128
143
  id: room.id,
129
- members: sortNetworkMembers(room.members, members)
144
+ members: sortNetworkMembers(room.members, members),
145
+ ...(room.visibility ? { visibility: room.visibility } : {}),
146
+ ...(room.write_policy ? { writePolicy: room.write_policy } : {})
130
147
  };
131
148
  })
132
149
  });
@@ -151,7 +168,9 @@ const buildNetworks = (plan) => {
151
168
  declaringTeamName: declaration.declaringTeamName,
152
169
  declaringTeamSource: declaration.declaringTeamSource,
153
170
  declarations: [declaration],
171
+ agentRegistration: declaration.agentRegistration,
154
172
  authMode: declaration.authMode,
173
+ consoleAnalytics: declaration.consoleAnalytics,
155
174
  debugEvents: declaration.debugEvents,
156
175
  directMessages: declaration.directMessages,
157
176
  expose: declaration.expose,
@@ -159,6 +178,7 @@ const buildNetworks = (plan) => {
159
178
  id: network.id,
160
179
  name: declaration.name,
161
180
  provider: network.provider,
181
+ publicRead: declaration.publicRead,
162
182
  serverMode: declaration.serverMode,
163
183
  url: declaration.url,
164
184
  rooms: declaration.rooms
@@ -171,11 +191,15 @@ const buildNetworks = (plan) => {
171
191
  if (firstDeclaration) {
172
192
  network.declaringTeamName = firstDeclaration.declaringTeamName;
173
193
  network.declaringTeamSource = firstDeclaration.declaringTeamSource;
194
+ network.agentRegistration = firstDeclaration.agentRegistration;
174
195
  network.authMode = firstDeclaration.authMode;
196
+ network.consoleAnalytics = firstDeclaration.consoleAnalytics;
197
+ network.debugEvents = firstDeclaration.debugEvents;
175
198
  network.directMessages = firstDeclaration.directMessages;
176
199
  network.expose = firstDeclaration.expose;
177
200
  network.httpEnabled = firstDeclaration.httpEnabled;
178
201
  network.name = firstDeclaration.name;
202
+ network.publicRead = firstDeclaration.publicRead;
179
203
  network.serverMode = firstDeclaration.serverMode;
180
204
  network.url = firstDeclaration.url;
181
205
  network.rooms = firstDeclaration.rooms;
@@ -198,6 +222,6 @@ export const buildOrganizationView = async (inputPath) => {
198
222
  networks: buildNetworks(plan),
199
223
  projectRoot: path.dirname(plan.root),
200
224
  root,
201
- runtimes: []
225
+ runtimes: buildRuntimeViews(plan)
202
226
  };
203
227
  };
@@ -0,0 +1,4 @@
1
+ import type { CompilePlan, CompilePlanNode } from "../types.js";
2
+ import type { OrganizationRuntimeView, OrganizationViewDeclaredSummary } from "./types.js";
3
+ export declare const buildDeclaredNodeView: (node: CompilePlanNode) => OrganizationViewDeclaredSummary;
4
+ export declare const buildRuntimeViews: (plan: CompilePlan) => OrganizationRuntimeView[];
@@ -0,0 +1,104 @@
1
+ import { resolveEffectiveModelTarget } from "../modelEnv.js";
2
+ import { listInteractiveSurfaceScopes } from "../interactiveSurfaceScopes.js";
3
+ const summarizeModel = (node) => {
4
+ if (node.value.kind !== "agent" || !node.value.execution?.model?.primary) {
5
+ return null;
6
+ }
7
+ const target = resolveEffectiveModelTarget(node.value.execution.model.primary, node.value.execution);
8
+ return {
9
+ authMethod: target.auth.method,
10
+ name: target.name,
11
+ provider: target.provider
12
+ };
13
+ };
14
+ const summarizeSchedule = (node) => {
15
+ if (node.value.kind !== "agent" || !node.value.schedule) {
16
+ return null;
17
+ }
18
+ const schedule = node.value.schedule;
19
+ if (schedule.kind === "cron") {
20
+ return {
21
+ expression: schedule.cron,
22
+ kind: schedule.kind,
23
+ ...(schedule.timezone ? { timezone: schedule.timezone } : {})
24
+ };
25
+ }
26
+ if (schedule.kind === "every") {
27
+ return {
28
+ expression: schedule.every,
29
+ kind: schedule.kind,
30
+ ...(schedule.timezone ? { timezone: schedule.timezone } : {})
31
+ };
32
+ }
33
+ return { kind: schedule.kind };
34
+ };
35
+ const surfaceSummaryFor = (name, surfaces) => {
36
+ if (!surfaces[name]) {
37
+ return null;
38
+ }
39
+ const scopes = name === "moltnet"
40
+ ? listInteractiveSurfaceScopes(surfaces).filter((scope) => scope.startsWith("moltnet:"))
41
+ : listInteractiveSurfaceScopes(surfaces).filter((scope) => scope === name);
42
+ return {
43
+ name,
44
+ scopes: scopes.length > 0 ? scopes : [name]
45
+ };
46
+ };
47
+ const summarizeSurfaces = (node) => {
48
+ const surfaces = node.value.kind === "agent" ? node.value.surfaces : undefined;
49
+ if (!surfaces) {
50
+ return [];
51
+ }
52
+ return ["discord", "http", "moltnet", "slack", "telegram", "webhook", "whatsapp"]
53
+ .map((name) => surfaceSummaryFor(name, surfaces))
54
+ .filter((surface) => surface !== null);
55
+ };
56
+ const summarizePackages = (node) => {
57
+ const packages = node.value.kind === "agent"
58
+ ? node.value.packages ?? []
59
+ : node.value.shared.packages ?? [];
60
+ return packages.map((pkg) => ({
61
+ id: pkg.id,
62
+ manager: pkg.manager,
63
+ name: pkg.name,
64
+ ...(pkg.scope ? { scope: pkg.scope } : {}),
65
+ ...(pkg.version ? { version: pkg.version } : {})
66
+ }));
67
+ };
68
+ const summarizeResources = (node) => (node.value.workspaceResources ?? []).map((resource) => ({
69
+ id: resource.id,
70
+ kind: resource.kind,
71
+ mode: resource.mode,
72
+ mount: resource.mount,
73
+ sharing: resource.sharing
74
+ }));
75
+ export const buildDeclaredNodeView = (node) => {
76
+ const skills = node.value.kind === "agent" ? node.value.skills : node.value.shared.skills;
77
+ const mcpServers = node.value.kind === "agent"
78
+ ? node.value.mcpServers
79
+ : node.value.shared.mcpServers;
80
+ return {
81
+ docs: node.value.docs.map((doc) => ({ role: doc.role, source: doc.sourcePath })),
82
+ mcpServers: mcpServers.map((server) => ({
83
+ name: server.name,
84
+ transport: server.transport
85
+ })),
86
+ model: summarizeModel(node),
87
+ packages: summarizePackages(node),
88
+ policy: {
89
+ mode: node.value.policyMode,
90
+ onDegrade: node.value.policyOnDegrade
91
+ },
92
+ resources: summarizeResources(node),
93
+ schedule: summarizeSchedule(node),
94
+ skills: skills.map((skill) => ({
95
+ name: skill.name,
96
+ ref: skill.ref,
97
+ requiresMcp: [...skill.requiresMcp]
98
+ })),
99
+ surfaces: summarizeSurfaces(node)
100
+ };
101
+ };
102
+ export const buildRuntimeViews = (plan) => Object.entries(plan.runtimes)
103
+ .map(([name, runtime]) => ({ name, nodeIds: [...runtime.nodeIds].sort() }))
104
+ .sort((left, right) => left.name.localeCompare(right.name));
@@ -8,8 +8,7 @@ const formatPolicy = (member) => {
8
8
  return [];
9
9
  }
10
10
  return [
11
- member.policy.read ? `read=${member.policy.read}` : undefined,
12
- member.policy.reply ? `reply=${member.policy.reply}` : undefined
11
+ member.policy.wake ? `wake=${member.policy.wake}` : undefined
13
12
  ].filter((entry) => entry !== undefined);
14
13
  };
15
14
  const formatMember = (member, options, projectRoot) => {
@@ -41,6 +40,8 @@ const formatNetwork = (network, options) => {
41
40
  const getDeclarations = (network) => network.declarations ?? [
42
41
  {
43
42
  authMode: network.authMode,
43
+ agentRegistration: network.agentRegistration,
44
+ consoleAnalytics: network.consoleAnalytics,
44
45
  declaringTeamName: network.declaringTeamName,
45
46
  declaringTeamSource: network.declaringTeamSource,
46
47
  debugEvents: network.debugEvents,
@@ -48,6 +49,7 @@ const getDeclarations = (network) => network.declarations ?? [
48
49
  expose: network.expose,
49
50
  httpEnabled: network.httpEnabled,
50
51
  name: network.name,
52
+ publicRead: network.publicRead,
51
53
  rooms: network.rooms,
52
54
  serverMode: network.serverMode,
53
55
  url: network.url
@@ -58,6 +60,9 @@ const formatDeclaration = (network, declaration, options, projectRoot) => {
58
60
  declaration.serverMode ? `server=${declaration.serverMode}` : undefined,
59
61
  declaration.url ? `url=${declaration.url}` : undefined,
60
62
  declaration.authMode ? `auth=${declaration.authMode}` : undefined,
63
+ declaration.publicRead !== undefined ? `public_read=${declaration.publicRead}` : undefined,
64
+ declaration.agentRegistration ? `registration=${declaration.agentRegistration}` : undefined,
65
+ declaration.consoleAnalytics ? `analytics=${declaration.consoleAnalytics}` : undefined,
61
66
  declaration.directMessages === false ? "dms=disabled" : undefined,
62
67
  declaration.debugEvents === true ? "debug_events" : undefined,
63
68
  declaration.expose === true || declaration.httpEnabled ? "human_ingress" : undefined
@@ -88,7 +93,11 @@ export const renderOrganizationNetworks = (view, options = {}) => {
88
93
  const legacyDeclared = options.declared && !view.projectRoot
89
94
  ? ` room ${room.id} declared [${room.declaredMembers.join(", ")}]`
90
95
  : "";
91
- lines.push(`${declarationPrefix}${roomLast ? glyphs.last : glyphs.branch}#${room.id}${legacyDeclared}`);
96
+ const roomMetadata = [
97
+ room.visibility ? `visibility=${room.visibility}` : undefined,
98
+ room.writePolicy ? `write=${room.writePolicy}` : undefined
99
+ ].filter((entry) => entry !== undefined);
100
+ lines.push(`${declarationPrefix}${roomLast ? glyphs.last : glyphs.branch}#${room.id}${roomMetadata.length > 0 ? ` ${roomMetadata.join(" ")}` : ""}${legacyDeclared}`);
92
101
  if (options.declared) {
93
102
  const declaredMembers = room.declaredMembers.length > 0
94
103
  ? room.declaredMembers.join(", ")
@@ -1,5 +1,9 @@
1
1
  import { formatSourceMeta } from "./sourcePaths.js";
2
2
  const color = (value, code, options) => options.color ? `\u001b[${code}m${value}\u001b[0m` : value;
3
+ const formatAnnotations = (subjectKey, options) => {
4
+ const annotations = options.annotationFor?.(subjectKey) ?? [];
5
+ return annotations.length > 0 ? ` ${annotations.join(" ")}` : "";
6
+ };
3
7
  const formatNode = (node, options, projectRoot) => {
4
8
  const kind = color(node.kind, node.kind === "team" ? "36" : "32", options);
5
9
  const metadata = node.kind === "team"
@@ -17,7 +21,7 @@ const formatNode = (node, options, projectRoot) => {
17
21
  const details = metadata.filter((entry) => entry !== undefined);
18
22
  const source = options.paths ? formatSourceMeta("source", node.source, projectRoot) : "";
19
23
  const separator = details[0]?.startsWith("[") ? " " : " ";
20
- return `${kind} ${node.displayName}${details.length > 0 ? `${separator}${details.join(" ")}` : ""}${source}`;
24
+ return `${kind} ${node.displayName}${details.length > 0 ? `${separator}${details.join(" ")}` : ""}${source}${formatAnnotations(node.id, options)}`;
21
25
  };
22
26
  const formatEdgeLabel = (edge) => edge.relation === "subagent"
23
27
  ? `subagent ${edge.label}`
@@ -28,14 +32,23 @@ const formatNetworkSummary = (network, options) => {
28
32
  network.serverMode ? `server=${network.serverMode}` : undefined,
29
33
  network.url ? `url=${network.url}` : undefined,
30
34
  network.authMode ? `auth=${network.authMode}` : undefined,
35
+ network.publicRead !== undefined ? `public_read=${network.publicRead}` : undefined,
36
+ network.agentRegistration ? `registration=${network.agentRegistration}` : undefined,
37
+ network.consoleAnalytics ? `analytics=${network.consoleAnalytics}` : undefined,
31
38
  network.directMessages === false ? "dms=disabled" : undefined,
32
39
  network.debugEvents === true ? "debug_events" : undefined,
33
40
  network.expose === true || network.httpEnabled ? "human_ingress" : undefined
34
41
  ].filter((entry) => entry !== undefined);
35
42
  const rooms = network.rooms
36
- .map((room) => `${room.id} [${room.declaredMembers.join(", ")}]`)
43
+ .map((room) => {
44
+ const roomMetadata = [
45
+ room.visibility ? `visibility=${room.visibility}` : undefined,
46
+ room.writePolicy ? `write=${room.writePolicy}` : undefined
47
+ ].filter((entry) => entry !== undefined);
48
+ return `${room.id}${roomMetadata.length > 0 ? ` ${roomMetadata.join(" ")}` : ""} [${room.declaredMembers.join(", ")}]`;
49
+ })
37
50
  .join("; ");
38
- return `network ${id} "${network.name}"${metadata.length > 0 ? ` ${metadata.join(" ")}` : ""}: ${rooms}`;
51
+ return `network ${id} "${network.name}"${metadata.length > 0 ? ` ${metadata.join(" ")}` : ""}: ${rooms}${formatAnnotations(`network:${network.id}`, options)}`;
39
52
  };
40
53
  const renderChildren = (node, options, projectRoot, prefix = "") => {
41
54
  const glyphs = options.ascii
@@ -1,6 +1,63 @@
1
1
  import type { ResolvedMoltnetRoomPolicy } from "../types.js";
2
+ export interface OrganizationViewDocSummary {
3
+ role: string;
4
+ source: string;
5
+ }
6
+ export interface OrganizationViewSkillSummary {
7
+ name: string;
8
+ ref: string;
9
+ requiresMcp: string[];
10
+ }
11
+ export interface OrganizationViewResourceSummary {
12
+ id: string;
13
+ kind: "git" | "volume";
14
+ mode: "mutable" | "readonly";
15
+ mount: string;
16
+ sharing: "per_agent" | "team";
17
+ }
18
+ export interface OrganizationViewPackageSummary {
19
+ id: string;
20
+ manager: string;
21
+ name: string;
22
+ scope?: string;
23
+ version?: string;
24
+ }
25
+ export interface OrganizationViewMcpSummary {
26
+ name: string;
27
+ transport: "sse" | "stdio" | "streamable_http";
28
+ }
29
+ export interface OrganizationViewModelSummary {
30
+ authMethod: string;
31
+ name: string;
32
+ provider: string;
33
+ }
34
+ export interface OrganizationViewScheduleSummary {
35
+ expression?: string;
36
+ kind: "cron" | "disabled" | "every";
37
+ timezone?: string;
38
+ }
39
+ export interface OrganizationViewSurfaceSummary {
40
+ name: string;
41
+ scopes: string[];
42
+ }
43
+ export interface OrganizationViewPolicySummary {
44
+ mode: string | null;
45
+ onDegrade: string | null;
46
+ }
47
+ export interface OrganizationViewDeclaredSummary {
48
+ docs: OrganizationViewDocSummary[];
49
+ mcpServers: OrganizationViewMcpSummary[];
50
+ model: OrganizationViewModelSummary | null;
51
+ packages: OrganizationViewPackageSummary[];
52
+ policy: OrganizationViewPolicySummary;
53
+ resources: OrganizationViewResourceSummary[];
54
+ schedule: OrganizationViewScheduleSummary | null;
55
+ skills: OrganizationViewSkillSummary[];
56
+ surfaces: OrganizationViewSurfaceSummary[];
57
+ }
2
58
  export interface OrganizationViewTreeNode {
3
59
  children: OrganizationViewTreeEdge[];
60
+ declared?: OrganizationViewDeclaredSummary;
4
61
  displayName: string;
5
62
  external?: string[];
6
63
  id: string;
@@ -10,14 +67,19 @@ export interface OrganizationViewTreeNode {
10
67
  name: string;
11
68
  networks?: OrganizationTreeNetworkSummary[];
12
69
  runtimeName: string | null;
70
+ slug?: string;
13
71
  source: string;
14
72
  }
15
73
  export interface OrganizationTreeNetworkRoomSummary {
16
74
  declaredMembers: string[];
17
75
  id: string;
76
+ visibility?: "public" | "private";
77
+ writePolicy?: "members" | "operators" | "registered_agents";
18
78
  }
19
79
  export interface OrganizationTreeNetworkSummary {
80
+ agentRegistration?: "disabled" | "open" | "token";
20
81
  authMode?: "bearer" | "none" | "open";
82
+ consoleAnalytics?: string;
21
83
  debugEvents?: boolean;
22
84
  directMessages?: boolean;
23
85
  expose?: boolean;
@@ -25,6 +87,7 @@ export interface OrganizationTreeNetworkSummary {
25
87
  id: string;
26
88
  name: string;
27
89
  provider: "moltnet";
90
+ publicRead?: boolean;
28
91
  serverMode?: "external" | "managed";
29
92
  url?: string;
30
93
  rooms: OrganizationTreeNetworkRoomSummary[];
@@ -48,7 +111,9 @@ export interface OrganizationNetworkMemberView {
48
111
  representativePath?: string[];
49
112
  }
50
113
  export interface OrganizationNetworkDeclarationView {
114
+ agentRegistration?: "disabled" | "open" | "token";
51
115
  authMode?: "bearer" | "none" | "open";
116
+ consoleAnalytics?: string;
52
117
  debugEvents?: boolean;
53
118
  declaringTeamName: string;
54
119
  declaringTeamSource: string;
@@ -56,6 +121,7 @@ export interface OrganizationNetworkDeclarationView {
56
121
  expose?: boolean;
57
122
  httpEnabled?: boolean;
58
123
  name: string;
124
+ publicRead?: boolean;
59
125
  rooms: OrganizationNetworkRoomView[];
60
126
  serverMode?: "external" | "managed";
61
127
  url?: string;
@@ -64,9 +130,13 @@ export interface OrganizationNetworkRoomView {
64
130
  declaredMembers: string[];
65
131
  id: string;
66
132
  members: OrganizationNetworkMemberView[];
133
+ visibility?: "public" | "private";
134
+ writePolicy?: "members" | "operators" | "registered_agents";
67
135
  }
68
136
  export interface OrganizationNetworkView {
137
+ agentRegistration?: "disabled" | "open" | "token";
69
138
  authMode?: "bearer" | "none" | "open";
139
+ consoleAnalytics?: string;
70
140
  debugEvents?: boolean;
71
141
  declaringTeamName: string;
72
142
  declaringTeamSource: string;
@@ -76,11 +146,16 @@ export interface OrganizationNetworkView {
76
146
  id: string;
77
147
  name: string;
78
148
  provider: "moltnet";
149
+ publicRead?: boolean;
79
150
  rooms: OrganizationNetworkRoomView[];
80
151
  serverMode?: "external" | "managed";
81
152
  url?: string;
82
153
  declarations?: OrganizationNetworkDeclarationView[];
83
154
  }
155
+ export interface OrganizationRuntimeView {
156
+ name: string;
157
+ nodeIds: string[];
158
+ }
84
159
  export interface OrganizationView {
85
160
  contexts: [];
86
161
  diagnostics: [];
@@ -88,9 +163,10 @@ export interface OrganizationView {
88
163
  networks: OrganizationNetworkView[];
89
164
  projectRoot?: string;
90
165
  root: OrganizationViewTreeNode;
91
- runtimes: [];
166
+ runtimes: OrganizationRuntimeView[];
92
167
  }
93
168
  export interface RenderOrganizationViewOptions {
169
+ annotationFor?: (subjectKey: string) => string[];
94
170
  ascii?: boolean;
95
171
  color?: boolean;
96
172
  declared?: boolean;
@@ -0,0 +1,29 @@
1
+ import type { DeploymentRecord } from "./record.js";
2
+ export type DockerInspectExecFile = (file: string, args: string[], options: {
3
+ timeout: number;
4
+ }) => Promise<{
5
+ stderr: string;
6
+ stdout: string;
7
+ }>;
8
+ export interface DockerUnitInspection {
9
+ containerId: string | null;
10
+ drift: string[];
11
+ exists: boolean | null;
12
+ exitCode: number | null;
13
+ finishedAt: string | null;
14
+ imageId: string | null;
15
+ message: string;
16
+ restartCount: number | null;
17
+ running: boolean | null;
18
+ severity: "error" | "ok" | "unknown" | "warn";
19
+ startedAt: string | null;
20
+ status: string | null;
21
+ unitId: string;
22
+ }
23
+ export type DockerInspectionResult = Map<string, DockerUnitInspection>;
24
+ export interface DockerInspectOptions {
25
+ dockerCommand?: string;
26
+ execFile?: DockerInspectExecFile;
27
+ timeoutMs?: number;
28
+ }
29
+ export declare const inspectDockerDeployment: (record: DeploymentRecord, options?: DockerInspectOptions) => Promise<DockerInspectionResult>;