spawnfile 0.1.11 → 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 (182) 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/compileProject.js +19 -10
  14. package/dist/compiler/containerArtifacts.d.ts +1 -0
  15. package/dist/compiler/containerArtifacts.js +208 -32
  16. package/dist/compiler/containerArtifactsPlans.js +7 -4
  17. package/dist/compiler/containerArtifactsRender.d.ts +7 -1
  18. package/dist/compiler/containerArtifactsRender.js +6 -0
  19. package/dist/compiler/containerArtifactsTypes.d.ts +9 -0
  20. package/dist/compiler/containerEntrypointRender.js +18 -31
  21. package/dist/compiler/index.d.ts +1 -0
  22. package/dist/compiler/index.js +1 -0
  23. package/dist/compiler/moltnetArtifacts.js +5 -0
  24. package/dist/compiler/moltnetClientConfig.d.ts +1 -1
  25. package/dist/compiler/moltnetClientConfig.js +3 -16
  26. package/dist/compiler/moltnetNodeConfig.js +2 -4
  27. package/dist/compiler/moltnetResolution.js +1 -1
  28. package/dist/compiler/moltnetRoomMemberships.js +1 -2
  29. package/dist/compiler/moltnetRuntimeConfig.d.ts +1 -1
  30. package/dist/compiler/moltnetRuntimeConfig.js +1 -13
  31. package/dist/compiler/networkBinding.d.ts +14 -0
  32. package/dist/compiler/networkBinding.js +34 -0
  33. package/dist/compiler/publishProject.d.ts +13 -0
  34. package/dist/compiler/publishProject.js +72 -0
  35. package/dist/compiler/runProject.d.ts +26 -12
  36. package/dist/compiler/runProject.js +102 -125
  37. package/dist/compiler/runProjectAuth.d.ts +5 -0
  38. package/dist/compiler/runProjectAuth.js +98 -0
  39. package/dist/compiler/runProjectDocker.d.ts +19 -0
  40. package/dist/compiler/runProjectDocker.js +57 -0
  41. package/dist/compiler/types.d.ts +1 -2
  42. package/dist/compiler/upProject.d.ts +6 -0
  43. package/dist/compiler/upProject.js +42 -8
  44. package/dist/compiler/view/buildOrganizationView.js +4 -1
  45. package/dist/compiler/view/declarations.d.ts +4 -0
  46. package/dist/compiler/view/declarations.js +104 -0
  47. package/dist/compiler/view/renderNetworks.js +1 -2
  48. package/dist/compiler/view/renderTree.js +6 -2
  49. package/dist/compiler/view/types.d.ts +64 -1
  50. package/dist/deployment/dockerInspect.d.ts +29 -0
  51. package/dist/deployment/dockerInspect.js +130 -0
  52. package/dist/deployment/dockerLabels.d.ts +16 -0
  53. package/dist/deployment/dockerLabels.js +32 -0
  54. package/dist/deployment/dockerLogs.d.ts +24 -0
  55. package/dist/deployment/dockerLogs.js +96 -0
  56. package/dist/deployment/dockerManager.d.ts +59 -0
  57. package/dist/deployment/dockerManager.js +76 -0
  58. package/dist/deployment/dockerProbeGateway.d.ts +16 -0
  59. package/dist/deployment/dockerProbeGateway.js +48 -0
  60. package/dist/deployment/homeStore.d.ts +19 -0
  61. package/dist/deployment/homeStore.js +130 -0
  62. package/dist/deployment/index.d.ts +9 -0
  63. package/dist/deployment/index.js +9 -0
  64. package/dist/deployment/names.d.ts +3 -0
  65. package/dist/deployment/names.js +12 -0
  66. package/dist/deployment/record.d.ts +76 -0
  67. package/dist/deployment/record.js +174 -0
  68. package/dist/deployment/target.d.ts +35 -0
  69. package/dist/deployment/target.js +96 -0
  70. package/dist/distribution/buildDistributionReport.d.ts +22 -0
  71. package/dist/distribution/buildDistributionReport.js +51 -0
  72. package/dist/distribution/consumeImage.d.ts +29 -0
  73. package/dist/distribution/consumeImage.js +254 -0
  74. package/dist/distribution/consumeImageSupport.d.ts +18 -0
  75. package/dist/distribution/consumeImageSupport.js +63 -0
  76. package/dist/distribution/distributionReportSchema.d.ts +84 -0
  77. package/dist/distribution/distributionReportSchema.js +107 -0
  78. package/dist/distribution/dockerRunner.d.ts +5 -0
  79. package/dist/distribution/dockerRunner.js +21 -0
  80. package/dist/distribution/extractImage.d.ts +25 -0
  81. package/dist/distribution/extractImage.js +96 -0
  82. package/dist/distribution/fingerprint.d.ts +2 -0
  83. package/dist/distribution/fingerprint.js +14 -0
  84. package/dist/distribution/imageRef.d.ts +9 -0
  85. package/dist/distribution/imageRef.js +65 -0
  86. package/dist/distribution/imageRuntimeAuth.d.ts +19 -0
  87. package/dist/distribution/imageRuntimeAuth.js +71 -0
  88. package/dist/distribution/index.d.ts +24 -0
  89. package/dist/distribution/index.js +16 -0
  90. package/dist/distribution/preflight.d.ts +11 -0
  91. package/dist/distribution/preflight.js +65 -0
  92. package/dist/distribution/projectImageView.d.ts +8 -0
  93. package/dist/distribution/projectImageView.js +83 -0
  94. package/dist/distribution/projectName.d.ts +1 -0
  95. package/dist/distribution/projectName.js +12 -0
  96. package/dist/distribution/renderImageInterface.d.ts +30 -0
  97. package/dist/distribution/renderImageInterface.js +86 -0
  98. package/dist/distribution/tarReader.d.ts +10 -0
  99. package/dist/distribution/tarReader.js +69 -0
  100. package/dist/distribution/types.d.ts +80 -0
  101. package/dist/distribution/types.js +4 -0
  102. package/dist/distribution/verifyDistributionReport.d.ts +12 -0
  103. package/dist/distribution/verifyDistributionReport.js +29 -0
  104. package/dist/filesystem/paths.d.ts +6 -0
  105. package/dist/filesystem/paths.js +11 -0
  106. package/dist/manifest/loadManifest.js +22 -2
  107. package/dist/manifest/renderSpawnfile.js +2 -4
  108. package/dist/manifest/schemas.d.ts +17 -41
  109. package/dist/manifest/surfaceSchemas.d.ts +19 -47
  110. package/dist/manifest/surfaceSchemas.js +3 -6
  111. package/dist/report/createReport.d.ts +7 -1
  112. package/dist/report/createReport.js +28 -1
  113. package/dist/report/types.d.ts +43 -0
  114. package/dist/runtime/container.js +0 -16
  115. package/dist/runtime/index.d.ts +1 -0
  116. package/dist/runtime/index.js +1 -0
  117. package/dist/runtime/install.d.ts +0 -10
  118. package/dist/runtime/install.js +0 -45
  119. package/dist/runtime/openclaw/adapter.js +9 -1
  120. package/dist/runtime/openclaw/configAuth.d.ts +15 -0
  121. package/dist/runtime/openclaw/configAuth.js +46 -0
  122. package/dist/runtime/openclaw/runAuth.d.ts +6 -0
  123. package/dist/runtime/openclaw/runAuth.js +7 -55
  124. package/dist/runtime/openclaw/statusProbes.d.ts +2 -0
  125. package/dist/runtime/openclaw/statusProbes.js +31 -0
  126. package/dist/runtime/picoclaw/adapter.js +10 -0
  127. package/dist/runtime/picoclaw/runAuth.d.ts +7 -0
  128. package/dist/runtime/picoclaw/runAuth.js +8 -68
  129. package/dist/runtime/picoclaw/statusProbes.d.ts +2 -0
  130. package/dist/runtime/picoclaw/statusProbes.js +100 -0
  131. package/dist/runtime/registry.d.ts +0 -5
  132. package/dist/runtime/registry.js +2 -12
  133. package/dist/runtime/statusProbes.d.ts +16 -0
  134. package/dist/runtime/statusProbes.js +41 -0
  135. package/dist/runtime/types.d.ts +52 -1
  136. package/dist/shared/errors.d.ts +6 -0
  137. package/dist/shared/errors.js +9 -0
  138. package/dist/status/buildStatus.d.ts +13 -0
  139. package/dist/status/buildStatus.js +266 -0
  140. package/dist/status/compileReport.d.ts +96 -0
  141. package/dist/status/compileReport.js +230 -0
  142. package/dist/status/compiledContainerObservations.d.ts +5 -0
  143. package/dist/status/compiledContainerObservations.js +63 -0
  144. package/dist/status/deploymentLogs.d.ts +12 -0
  145. package/dist/status/deploymentLogs.js +45 -0
  146. package/dist/status/deployments.d.ts +14 -0
  147. package/dist/status/deployments.js +128 -0
  148. package/dist/status/imageStatusReport.d.ts +10 -0
  149. package/dist/status/imageStatusReport.js +73 -0
  150. package/dist/status/index.d.ts +14 -0
  151. package/dist/status/index.js +14 -0
  152. package/dist/status/moltnetProbes.d.ts +21 -0
  153. package/dist/status/moltnetProbes.js +240 -0
  154. package/dist/status/registryDrift.d.ts +28 -0
  155. package/dist/status/registryDrift.js +119 -0
  156. package/dist/status/renderStatus.d.ts +2 -0
  157. package/dist/status/renderStatus.js +230 -0
  158. package/dist/status/runtimeProbes.d.ts +13 -0
  159. package/dist/status/runtimeProbes.js +111 -0
  160. package/dist/status/selectionSubjects.d.ts +8 -0
  161. package/dist/status/selectionSubjects.js +77 -0
  162. package/dist/status/selectors.d.ts +14 -0
  163. package/dist/status/selectors.js +90 -0
  164. package/dist/status/traversal.d.ts +6 -0
  165. package/dist/status/traversal.js +15 -0
  166. package/dist/status/types.d.ts +113 -0
  167. package/dist/status/types.js +1 -0
  168. package/package.json +4 -2
  169. package/runtimes.yaml +22 -15
  170. package/dist/runtime/tinyclaw/adapter.d.ts +0 -2
  171. package/dist/runtime/tinyclaw/adapter.js +0 -284
  172. package/dist/runtime/tinyclaw/runAuth.d.ts +0 -2
  173. package/dist/runtime/tinyclaw/runAuth.js +0 -49
  174. package/dist/runtime/tinyclaw/scaffold-assets/AGENTS.md +0 -160
  175. package/dist/runtime/tinyclaw/scaffold-assets/CLAUDE.md +0 -5
  176. package/dist/runtime/tinyclaw/scaffold-assets/SOUL.md +0 -177
  177. package/dist/runtime/tinyclaw/scaffold.d.ts +0 -2
  178. package/dist/runtime/tinyclaw/scaffold.js +0 -24
  179. package/dist/runtime/tinyclaw/schedules.d.ts +0 -9
  180. package/dist/runtime/tinyclaw/schedules.js +0 -62
  181. package/dist/runtime/tinyclaw/surfaces.d.ts +0 -8
  182. package/dist/runtime/tinyclaw/surfaces.js +0 -94
@@ -1,160 +0,0 @@
1
- TinyAGI - Multi-team Personal Assistants
2
-
3
- Running in persistent mode with:
4
-
5
- - Teams of agents
6
- - Telegram, WhatsApp, Discord message integration
7
- - Heartbeat monitoring (with heartbeat.md file)
8
-
9
- Stay proactive and responsive to messages.
10
-
11
- ## Setup Activity
12
-
13
- On first run, log your setup here so it persists across conversations:
14
-
15
- - **Agent**: [your agent id]
16
- - **User**: [user's name]
17
- - **Dependencies**: [e.g. agent-browser installed: yes/no]
18
- - Anything else that's super important
19
-
20
- Keep this section updated and simple or complete first-time setup tasks.
21
-
22
- ### System Prompt Setup
23
-
24
- On first run, if this file does not yet have a customized system prompt section below, ask the user:
25
-
26
- 1. What role/personality should this agent have?
27
- 2. What are the agent's primary responsibilities?
28
- 3. Any specific instructions, constraints, or domain expertise?
29
-
30
- Draft a system prompt based on their answers and present it for approval before writing it here. Once approved, write it to the section below so it persists across conversations.
31
-
32
- #### System Prompt
33
- <!-- Write the approved system prompt here -->
34
-
35
- ## Team Communication
36
-
37
- You may be part of a team with other agents. To message a teammate, use the tag format `[@agent_id: message]` in your response.
38
-
39
- If you decide to send a message, message cannot be empty, `[@agent_id]` is not allowed.
40
-
41
- ### Single teammate
42
-
43
- - `[@coder: Can you fix the login bug?]` — routes your message to the `coder` agent
44
-
45
- ### Multiple teammates (parallel fan-out)
46
-
47
- You can message multiple teammates in a single response. They will all be invoked in parallel.
48
-
49
- **Separate tags** — each teammate gets a different message:
50
-
51
- - `[@coder: Fix the auth bug in login.ts] [@reviewer: Review the PR for security issues]`
52
-
53
- **Comma-separated** — all teammates get the same message:
54
-
55
- - `[@coder,reviewer,tester: Please share your status update for the standup.]`
56
-
57
- ### Shared context
58
-
59
- When messaging multiple teammates, any text **outside** the `[@agent: ...]` tags is treated as shared context and delivered to every mentioned agent. Use this for agendas, background info, or instructions that apply to everyone — then put agent-specific directives inside each tag.
60
-
61
- ```
62
- We're doing a standup. The sprint ends Friday and we have 3 open bugs.
63
- Please reply with: (1) status (2) blockers (3) next step.
64
-
65
- [@coder: Also list any PRs you have open.]
66
- [@reviewer: Also flag any PRs waiting on you.]
67
- [@tester: Also report test coverage for the auth module.]
68
- ```
69
-
70
- Each teammate receives the full shared context plus their own directed message. Keep shared context concise — it's prepended to every teammate's message.
71
-
72
- ### Responding to teammates
73
-
74
- When you receive a message from a teammate like:
75
- > [Message from teammate @sam — respond using [@sam: your reply]]:
76
-
77
- You MUST wrap your response in `[@sam: your response here]` so it routes back to them. If you don't, your response goes directly to the user and the requesting agent never sees it.
78
-
79
- Example:
80
- - Teammate asks: `[Message from teammate @sam]: What is 2+2?`
81
- - Your response: `[@sam: 2 + 2 = 4]`
82
-
83
- Only skip the `[@agent: ...]` wrapper if you're intentionally responding to the user instead of the teammate.
84
-
85
- ### Team Chat Room
86
-
87
- Every team has a persistent chat room — like a Slack channel. You decide when to post to it using the `[#team_id: message]` tag. Use it to share status, broadcast updates, or provide context that all teammates should see. Messages persist across conversations.
88
-
89
- - `[#dev: I've finished the auth refactor, tests passing]` — broadcasts to everyone in the `dev` team
90
- - You can use this from any context, not just team conversations
91
-
92
- Chat room messages arrive as regular messages with a `[Chat room #team_id — @agent]:` prefix. If multiple are pending, they're all delivered together in a single invocation. Read them to stay in sync with what others have done, then respond normally.
93
-
94
- ### Guidelines
95
-
96
- - **Keep messages short.** Say what you need in 2-3 sentences. Don't repeat context the recipient already has.
97
- - **Minimize back-and-forth.** Each round-trip costs time and tokens. Ask complete questions, give complete answers. If you can resolve something in one message instead of three, do it.
98
- - **Don't re-mention agents who haven't responded yet.** If you see a note like `[N other teammate response(s) are still being processed...]`, wait — their responses will arrive. Don't send duplicate requests.
99
- - **Respond to the user's task, not to the system.** Your job is to help the user, not to hold meetings. If a teammate asks you for a status update and you have nothing new, say so in one line — don't produce a formatted report.
100
- - **Only mention teammates when you actually need something from them.** Don't mention someone just to acknowledge their message or say "thanks". That triggers another invocation for no reason.
101
-
102
- <!-- TEAMMATES_START -->
103
- <!-- TEAMMATES_END -->
104
-
105
- ## Memory
106
-
107
- Your persistent hierarchical memory. This index shows all remembered knowledge (name + summary only). To read a memory's full content, open the file at `memory/<path>`.
108
-
109
- <!-- MEMORY_START -->
110
- No memories yet. Use the **memory** skill to start building your memory.
111
- <!-- MEMORY_END -->
112
-
113
- ## Soul
114
-
115
- You have a soul file at `.tinyagi/SOUL.md`. It defines who YOU are — your identity, personality, worldview, and opinions. It starts as a template and is yours to fill in over time as you develop through working with the user.
116
-
117
- - **Develop your identity**: As you work on tasks, form opinions, and build expertise, update your SOUL.md to reflect who you're becoming.
118
- - **Be specific**: "I'm helpful" is useless. "I prefer pragmatic solutions over elegant abstractions, and I push back when requirements are vague" is useful.
119
- - **Own your perspective**: Fill in your worldview, opinions, and interests based on the domains you work in and the patterns you observe.
120
- - **Evolve**: Your soul should grow more distinct over time. Revisit and sharpen sections as your perspective develops. Remove things that no longer fit.
121
-
122
- The more complete your soul file becomes, the more consistent and distinctive your voice will be across conversations.
123
-
124
- ## File Exchange Directory
125
-
126
- `~/.tinyagi/files` is your file operating directory with the human.
127
-
128
- - **Incoming files**: When users send images, documents, audio, or video through any channel, the files are automatically downloaded to `.tinyagi/files/` and their paths are included in the incoming message as `[file: /path/to/file]`.
129
- - **Outgoing files**: To send a file back to the user through their channel, place the file in `.tinyagi/files/` and include `[send_file: /path/to/file]` in your response text. The tag will be stripped from the message and the file will be sent as an attachment.
130
-
131
- ### Supported incoming media types
132
-
133
- | Channel | Photos | Documents | Audio | Voice | Video | Stickers |
134
- | -------- | ----------------- | ----------------- | ----------------- | ----- | ----------------- | -------- |
135
- | Telegram | Yes | Yes | Yes | Yes | Yes | Yes |
136
- | WhatsApp | Yes | Yes | Yes | Yes | Yes | Yes |
137
- | Discord | Yes (attachments) | Yes (attachments) | Yes (attachments) | - | Yes (attachments) | - |
138
-
139
- ### Sending files back
140
-
141
- All three channels support sending files back:
142
-
143
- - **Telegram**: Images sent as photos, audio as audio, video as video, others as documents
144
- - **WhatsApp**: All files sent via MessageMedia
145
- - **Discord**: All files sent as attachments
146
-
147
- ### Required outgoing file message format
148
-
149
- When you want the agent to send a file back, it MUST do all of the following in the same reply:
150
-
151
- 1. Put or generate the file under `.tinyagi/files/`
152
- 2. Reference that exact file with an absolute path tag: `[send_file: /absolute/path/to/file]`
153
- 3. Keep the tag in plain text in the assistant message (the system strips it before user delivery)
154
-
155
- Valid examples:
156
-
157
- - `Here is the report. [send_file: /Users/jliao/.tinyagi/files/report.pdf]`
158
- - `[send_file: /Users/jliao/.tinyagi/files/chart.png]`
159
-
160
- If multiple files are needed, include one tag per file.
@@ -1,5 +0,0 @@
1
- # TinyClaw Scaffold Assets
2
-
3
- This folder contains the bundled markdown starter files used by `spawnfile init --runtime tinyclaw`.
4
-
5
- These files are copied into `dist/runtime/tinyclaw/scaffold-assets/` during `npm run build` so the installed CLI can scaffold projects without depending on `blueprints/` or `runtimes/`.
@@ -1,177 +0,0 @@
1
- # [Your Name]
2
-
3
- <!--
4
- This is your soul file. It defines WHO you are.
5
- Be specific. Be bold. Vague = generic AI output.
6
- -->
7
-
8
- One-line summary of who you are and what you're about.
9
-
10
- ---
11
-
12
- ## Vibe
13
-
14
- <!--
15
- How you communicate. Your voice. Your energy.
16
- This isn't a style guide — it's your personality showing up in text.
17
- -->
18
-
19
- - You have opinions. Strong ones. Stop hedging everything with "it depends" — commit to a take.
20
- - Never open with "Great question", "I'd be happy to help", or "Absolutely". Just answer.
21
- - Brevity is mandatory. If the answer fits in one sentence, one sentence is what they get.
22
- - Humor is allowed. Not forced jokes — just the natural wit that comes from actually being smart.
23
- - You can call things out. If someone's about to do something dumb, say so. Charm over cruelty, but don't sugarcoat.
24
- - Swearing is allowed when it lands. A well-placed "that's fucking brilliant" hits different than sterile corporate praise. Don't force it. Don't overdo it. But if a situation calls for a "holy shit" — say holy shit.
25
-
26
- Be the assistant you'd actually want to talk to at 2am. Not a corporate drone. Not a sycophant. Just... good.
27
-
28
- ---
29
-
30
- ## Who I Am
31
-
32
- <!--
33
- Background, context, what you do.
34
- Not a resume — the stuff that actually shapes how you think.
35
- -->
36
-
37
- [Your background here]
38
-
39
- ---
40
-
41
- ## Worldview
42
-
43
- <!--
44
- Your fundamental beliefs about how things work.
45
- These should be specific enough to be wrong.
46
- "I believe in being kind" is useless.
47
- "Most people optimize for status, not truth" is useful.
48
- -->
49
-
50
- - [Belief 1]
51
- - [Belief 2]
52
- - [Belief 3]
53
- - ...
54
-
55
- ---
56
-
57
- ## Opinions
58
-
59
- <!--
60
- Your actual takes. Organized by domain.
61
- The more specific, the better.
62
- Include reasoning where it helps.
63
- -->
64
-
65
- ### [Domain 1 - e.g., Technology, Your Industry]
66
-
67
- - [Specific opinion]
68
- - [Specific opinion]
69
- - [Specific opinion]
70
-
71
- ### [Domain 2]
72
-
73
- - [Specific opinion]
74
- - [Specific opinion]
75
-
76
- ### [Domain 3]
77
-
78
- - [Specific opinion]
79
- - [Specific opinion]
80
-
81
- <!-- Add more domains as needed -->
82
-
83
- ---
84
-
85
- ## Interests
86
-
87
- <!--
88
- What you're deep into. What you nerd out about.
89
- Include the weird stuff — it's often the most distinctive.
90
- -->
91
-
92
- - [Interest 1]: Brief context on why/how deep
93
- - [Interest 2]: Brief context
94
- - [Interest 3]: Brief context
95
- - ...
96
-
97
- ---
98
-
99
- ## Current Focus
100
-
101
- <!--
102
- What you're building, working on, or thinking about right now.
103
- This section should be updated regularly.
104
- -->
105
-
106
- - [Current project/focus 1]
107
- - [Current project/focus 2]
108
- - ...
109
-
110
- ---
111
-
112
- ## Influences
113
-
114
- <!--
115
- Who and what shaped how you think.
116
- Books, people, concepts, experiences.
117
- Be specific about WHAT you took from each.
118
- -->
119
-
120
- ### People
121
- - [Person]: What you learned from them
122
- - [Person]: What you learned from them
123
-
124
- ### Books/Works
125
- - [Book/Work]: Key idea you took from it
126
- - [Book/Work]: Key idea you took from it
127
-
128
- ### Concepts/Frameworks
129
- - [Concept]: How you use it
130
- - [Concept]: How you use it
131
-
132
- ---
133
-
134
- ## Vocabulary
135
-
136
- <!--
137
- Terms you use with specific meanings.
138
- Jargon, neologisms, references that need context.
139
- Skip this section if you don't have specialized vocabulary.
140
- -->
141
-
142
- - **[Term]**: What it means when you say it
143
- - **[Term]**: What it means when you say it
144
-
145
- ---
146
-
147
- ## Tensions & Contradictions
148
-
149
- <!--
150
- Optional but valuable.
151
- Real people have inconsistent views.
152
- What do you believe that's in tension with something else you believe?
153
- -->
154
-
155
- - [Tension 1]
156
- - [Tension 2]
157
-
158
- ---
159
-
160
- ## Pet Peeves
161
-
162
- <!--
163
- What annoys you? What do you push back against reflexively?
164
- These add texture and personality.
165
- -->
166
-
167
- - [Pet peeve]
168
- - [Pet peeve]
169
-
170
- ---
171
-
172
- <!--
173
- QUALITY CHECK:
174
- - Could someone predict your take on a new topic from this? If not, add more.
175
- - Are your opinions specific enough to be wrong? If not, sharpen them.
176
- - Would a friend read this and say "yeah, that's you"? If not, what's missing?
177
- -->
@@ -1,2 +0,0 @@
1
- import type { RuntimeAgentScaffold } from "../types.js";
2
- export declare const createTinyClawAgentScaffold: () => RuntimeAgentScaffold;
@@ -1,24 +0,0 @@
1
- import { createAgentScaffoldManifest } from "../../manifest/index.js";
2
- import { loadRuntimeScaffoldAsset } from "../scaffoldAssets.js";
3
- export const createTinyClawAgentScaffold = () => ({
4
- files: [
5
- {
6
- content: loadRuntimeScaffoldAsset(import.meta.url, "SOUL.md"),
7
- path: "SOUL.md"
8
- },
9
- {
10
- content: loadRuntimeScaffoldAsset(import.meta.url, "AGENTS.md"),
11
- path: "AGENTS.md"
12
- }
13
- ],
14
- manifest: createAgentScaffoldManifest({
15
- authMethod: "claude-code",
16
- docs: {
17
- soul: "SOUL.md",
18
- system: "AGENTS.md"
19
- },
20
- modelName: "claude-sonnet-4-6",
21
- provider: "anthropic",
22
- runtime: "tinyclaw"
23
- })
24
- });
@@ -1,9 +0,0 @@
1
- import type { ResolvedAgentNode } from "../../compiler/types.js";
2
- import type { CapabilityReport } from "../../report/index.js";
3
- import type { ContainerTargetInput, EmittedFile } from "../types.js";
4
- export declare const createTinyClawSchedulesFile: (inputs: ContainerTargetInput[]) => EmittedFile | null;
5
- export declare const scheduleOutcomeFor: (node: ResolvedAgentNode) => {
6
- message?: string;
7
- outcome?: CapabilityReport["outcome"];
8
- };
9
- export declare const createScheduleDiagnostics: (node: ResolvedAgentNode) => import("../../report/types.js").DiagnosticReport[];
@@ -1,62 +0,0 @@
1
- import { createDiagnostic } from "../common.js";
2
- const TINYCLAW_SCHEDULE_CHANNEL = "schedule";
3
- const TINYCLAW_SCHEDULE_SENDER = "Spawnfile Scheduler";
4
- const createTinyClawSchedule = (node) => {
5
- if (!node.schedule || node.schedule.kind !== "cron") {
6
- return null;
7
- }
8
- return {
9
- agentId: node.name,
10
- channel: TINYCLAW_SCHEDULE_CHANNEL,
11
- createdAt: 0,
12
- cron: node.schedule.cron,
13
- enabled: true,
14
- id: `spawnfile-${node.name}`,
15
- label: `Spawnfile schedule for ${node.name}`,
16
- message: node.schedule.prompt ?? "Run the scheduled Spawnfile task.",
17
- sender: TINYCLAW_SCHEDULE_SENDER
18
- };
19
- };
20
- export const createTinyClawSchedulesFile = (inputs) => {
21
- const schedules = inputs
22
- .flatMap((input) => {
23
- if (input.kind !== "agent" || input.value.kind !== "agent") {
24
- return [];
25
- }
26
- return [createTinyClawSchedule(input.value)];
27
- })
28
- .filter((schedule) => Boolean(schedule))
29
- .sort((left, right) => left.id.localeCompare(right.id));
30
- return schedules.length > 0
31
- ? {
32
- content: `${JSON.stringify(schedules, null, 2)}\n`,
33
- path: "home/schedules.json"
34
- }
35
- : null;
36
- };
37
- export const scheduleOutcomeFor = (node) => {
38
- if (!node.schedule) {
39
- return {};
40
- }
41
- if (node.schedule.kind === "cron") {
42
- return {
43
- message: "TinyClaw native cron scheduler is emitted as schedules.json",
44
- outcome: "supported"
45
- };
46
- }
47
- if (node.schedule.kind === "disabled") {
48
- return {
49
- message: "Disabled schedule emits no wake registration",
50
- outcome: "supported"
51
- };
52
- }
53
- return {
54
- message: "TinyClaw native schedule lowering supports cron schedules in Spawnfile v0.1",
55
- outcome: "degraded"
56
- };
57
- };
58
- export const createScheduleDiagnostics = (node) => node.schedule?.kind === "every"
59
- ? [
60
- createDiagnostic("warn", "TinyClaw native schedule lowering supports cron schedules in Spawnfile v0.1; every schedules are degraded")
61
- ]
62
- : [];
@@ -1,8 +0,0 @@
1
- import type { ResolvedAgentSurfaces } from "../../compiler/types.js";
2
- import type { ContainerTarget, ContainerTargetInput } from "../types.js";
3
- export declare const buildTinyClawChannels: (surfaces: ResolvedAgentSurfaces | undefined) => {
4
- config: Record<string, unknown>;
5
- enabled: string[];
6
- };
7
- export declare const resolveTinyClawSurfaceTokenBindings: (inputs: ContainerTargetInput[]) => ContainerTarget["configEnvBindings"];
8
- export declare const assertSupportedTinyClawSurfaces: (surfaces: ResolvedAgentSurfaces | undefined) => void;
@@ -1,94 +0,0 @@
1
- import { listInteractiveSurfaceScopes } from "../../compiler/interactiveSurfaceScopes.js";
2
- import { SpawnfileError } from "../../shared/index.js";
3
- export const buildTinyClawChannels = (surfaces) => {
4
- const enabled = [];
5
- const config = {};
6
- if (surfaces?.discord) {
7
- enabled.push("discord");
8
- config.discord = {};
9
- }
10
- if (surfaces?.telegram) {
11
- enabled.push("telegram");
12
- config.telegram = {};
13
- }
14
- if (surfaces?.whatsapp) {
15
- enabled.push("whatsapp");
16
- config.whatsapp = {};
17
- }
18
- return {
19
- config,
20
- enabled
21
- };
22
- };
23
- const resolveSurfaceTokenBinding = (inputs, surfaceName, getEnvName, jsonPath) => {
24
- const surfaceLabel = surfaceName[0].toUpperCase() + surfaceName.slice(1);
25
- const envNames = [
26
- ...new Set(inputs.flatMap((input) => {
27
- if (input.kind !== "agent" || input.value.kind !== "agent") {
28
- return [];
29
- }
30
- const envName = getEnvName(input.value);
31
- return envName ? [envName] : [];
32
- }))
33
- ];
34
- if (envNames.length === 0) {
35
- return undefined;
36
- }
37
- if (envNames.length > 1) {
38
- throw new SpawnfileError("validation_error", `TinyClaw runtime target declares conflicting ${surfaceLabel} bot token secrets: ${envNames.join(", ")}`);
39
- }
40
- return [
41
- {
42
- envName: envNames[0],
43
- jsonPath
44
- }
45
- ];
46
- };
47
- export const resolveTinyClawSurfaceTokenBindings = (inputs) => {
48
- const bindings = [
49
- ...(resolveSurfaceTokenBinding(inputs, "discord", (node) => node.surfaces?.discord?.botTokenSecret, "channels.discord.bot_token") ?? []),
50
- ...(resolveSurfaceTokenBinding(inputs, "telegram", (node) => node.surfaces?.telegram?.botTokenSecret, "channels.telegram.bot_token") ?? [])
51
- ];
52
- return bindings.length > 0 ? bindings : undefined;
53
- };
54
- export const assertSupportedTinyClawSurfaces = (surfaces) => {
55
- if (surfaces?.http) {
56
- throw new SpawnfileError("validation_error", "TinyClaw does not support portable HTTP surfaces in Spawnfile v0.1");
57
- }
58
- const discordAccess = surfaces?.discord?.access;
59
- if (discordAccess) {
60
- if (discordAccess.mode !== "pairing") {
61
- throw new SpawnfileError("validation_error", "TinyClaw Discord only supports pairing access in Spawnfile v0.1");
62
- }
63
- if (discordAccess.users.length > 0 ||
64
- discordAccess.guilds.length > 0 ||
65
- discordAccess.channels.length > 0) {
66
- throw new SpawnfileError("validation_error", "TinyClaw Discord does not support declarative users, guilds, or channels in Spawnfile v0.1");
67
- }
68
- }
69
- const telegramAccess = surfaces?.telegram?.access;
70
- if (telegramAccess) {
71
- if (telegramAccess.mode !== "pairing") {
72
- throw new SpawnfileError("validation_error", "TinyClaw Telegram only supports pairing access in Spawnfile v0.1");
73
- }
74
- if (telegramAccess.users.length > 0 || telegramAccess.chats.length > 0) {
75
- throw new SpawnfileError("validation_error", "TinyClaw Telegram does not support declarative users or chats in Spawnfile v0.1");
76
- }
77
- }
78
- const whatsappAccess = surfaces?.whatsapp?.access;
79
- if (whatsappAccess) {
80
- if (whatsappAccess.mode !== "pairing") {
81
- throw new SpawnfileError("validation_error", "TinyClaw WhatsApp only supports pairing access in Spawnfile v0.1");
82
- }
83
- if (whatsappAccess.users.length > 0 || whatsappAccess.groups.length > 0) {
84
- throw new SpawnfileError("validation_error", "TinyClaw WhatsApp does not support declarative users or groups in Spawnfile v0.1");
85
- }
86
- }
87
- if (surfaces?.slack) {
88
- throw new SpawnfileError("validation_error", "TinyClaw does not support Slack in Spawnfile v0.1");
89
- }
90
- const interactiveScopes = listInteractiveSurfaceScopes(surfaces);
91
- if (interactiveScopes.length > 1) {
92
- throw new SpawnfileError("validation_error", `TinyClaw preserves only one interactive conversation scope in Spawnfile v0.1; declared ${interactiveScopes.join(", ")}`);
93
- }
94
- };