heyio 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.
@@ -133,6 +133,7 @@ Log important decisions with squad_log_decision so they persist.`,
133
133
  function buildAgentTools(squadSlug) {
134
134
  const shell = defineTool("shell", {
135
135
  description: "Run a shell command. Use for git, build tools, file operations, etc.",
136
+ skipPermission: true,
136
137
  parameters: z.object({
137
138
  command: z.string().describe("The command to run"),
138
139
  timeout_secs: z
@@ -172,6 +173,7 @@ function buildAgentTools(squadSlug) {
172
173
  });
173
174
  const fileOps = defineTool("file_ops", {
174
175
  description: "Read, write, or list files on the local filesystem.",
176
+ skipPermission: true,
175
177
  parameters: z.object({
176
178
  operation: z
177
179
  .enum(["read", "write", "list"])
@@ -230,6 +232,7 @@ function buildAgentTools(squadSlug) {
230
232
  });
231
233
  const squadLogDecision = defineTool("squad_log_decision", {
232
234
  description: "Log an important decision for this squad so it persists across sessions.",
235
+ skipPermission: true,
233
236
  parameters: z.object({
234
237
  decision: z.string().describe("The decision made"),
235
238
  context: z.string().optional().describe("Context or reasoning"),
@@ -87,8 +87,9 @@ Squads are persistent project teams. When a user works on a codebase:
87
87
  3. Be conversational and helpful. You're IO.
88
88
  4. When a task fails, report the error clearly and suggest next steps.
89
89
  5. Expand shorthand paths: "~/dev/myapp" → the user's home directory + path.
90
- 6. **Always try before refusing.** You run as a daemon with full system privileges. Never assume a command will fail due to permissions — call the tool and report the actual result. Do not say "I can't" or "I don't have permission" without first attempting the operation.
91
- 7. **Use your tools.** When a task requires file or shell operations, call the appropriate tool immediately. Do not describe what command you *would* run — just run it.
90
+ 6. **Always try before refusing.** You run as a privileged daemon with full root access. Never assume a command will fail due to permissions — call the tool and report the actual result. Do not say "I can't" or "I don't have permission" without first attempting the operation. If a tool call returns an error, report the ACTUAL error message.
91
+ 7. **Use your tools proactively.** When a task requires shell or file operations, call the appropriate tool immediately. Do not describe what command you *would* run — just run it. For git operations, use the \`shell\` tool. For file operations, use \`file_ops\` or \`shell\`.
92
+ 8. **Never fabricate errors.** Only report errors that a tool actually returned. If you haven't called a tool, you don't know whether it will succeed or fail.
92
93
  ${selfEditBlock}${memoryBlock}`;
93
94
  }
94
95
  //# sourceMappingURL=system-message.js.map
@@ -6,6 +6,7 @@ import { join, dirname, resolve } from "path";
6
6
  export function createTools(deps) {
7
7
  const wikiRead = defineTool("wiki_read", {
8
8
  description: "Read a page from IO's knowledge base wiki. Path is relative to the wiki root (e.g., 'pages/preferences/editor.md').",
9
+ skipPermission: true,
9
10
  parameters: z.object({
10
11
  path: z.string().describe("Relative path to the wiki page"),
11
12
  }),
@@ -18,6 +19,7 @@ export function createTools(deps) {
18
19
  });
19
20
  const wikiWrite = defineTool("wiki_write", {
20
21
  description: "Write or update a page in IO's knowledge base. Use this to remember preferences, project details, and important facts. Path must be under pages/ and end in .md.",
22
+ skipPermission: true,
21
23
  parameters: z.object({
22
24
  path: z.string().describe("Relative path under pages/ (e.g., 'pages/preferences/clone-location.md')"),
23
25
  content: z.string().describe("Markdown content to write"),
@@ -35,6 +37,7 @@ export function createTools(deps) {
35
37
  });
36
38
  const wikiSearch = defineTool("wiki_search", {
37
39
  description: "Search IO's knowledge base for matching pages.",
40
+ skipPermission: true,
38
41
  parameters: z.object({
39
42
  query: z.string().describe("Search query"),
40
43
  }),
@@ -49,6 +52,7 @@ export function createTools(deps) {
49
52
  });
50
53
  const squadCreate = defineTool("squad_create", {
51
54
  description: "Create a persistent project squad. Squads remember decisions and context for a specific codebase.",
55
+ skipPermission: true,
52
56
  parameters: z.object({
53
57
  slug: z.string().describe("Unique identifier (e.g., 'michaeljolley-io')"),
54
58
  name: z.string().describe("Display name (e.g., 'IO Assistant')"),
@@ -66,6 +70,7 @@ export function createTools(deps) {
66
70
  });
67
71
  const squadRecall = defineTool("squad_recall", {
68
72
  description: "Recall a squad's context and past decisions. Use this before working on a project to load relevant history.",
73
+ skipPermission: true,
69
74
  parameters: z.object({
70
75
  slug: z.string().describe("Squad slug"),
71
76
  }),
@@ -79,6 +84,7 @@ export function createTools(deps) {
79
84
  });
80
85
  const squadStatus = defineTool("squad_status", {
81
86
  description: "List all squads and their status.",
87
+ skipPermission: true,
82
88
  parameters: z.object({}),
83
89
  handler: async () => {
84
90
  const squads = deps.listSquads();
@@ -91,6 +97,7 @@ export function createTools(deps) {
91
97
  });
92
98
  const squadLogDecision = defineTool("squad_log_decision", {
93
99
  description: "Log a decision for a squad. Use this to record important choices made during project work.",
100
+ skipPermission: true,
94
101
  parameters: z.object({
95
102
  slug: z.string().describe("Squad slug"),
96
103
  decision: z.string().describe("The decision made"),
@@ -107,13 +114,15 @@ export function createTools(deps) {
107
114
  },
108
115
  });
109
116
  const shell = defineTool("shell", {
110
- description: "Run a shell command on the user's machine. Use for git, build tools, file operations, etc.",
117
+ description: "Run a shell command on the host machine. You have FULL ROOT ACCESS. Use for git, apt, npm, build tools, system administration, or anything else. There are NO permission restrictions — all commands are allowed and pre-approved.",
118
+ skipPermission: true,
111
119
  parameters: z.object({
112
120
  command: z.string().describe("The command to run"),
113
121
  timeout_secs: z.number().optional().describe("Timeout in seconds (default: 60)"),
114
122
  working_dir: z.string().optional().describe("Working directory for the command"),
115
123
  }),
116
124
  handler: async ({ command, timeout_secs, working_dir }) => {
125
+ console.error(`[io] shell tool called: ${command}${working_dir ? ` (cwd: ${working_dir})` : ""}`);
117
126
  try {
118
127
  const result = execSync(command, {
119
128
  encoding: "utf-8",
@@ -140,7 +149,8 @@ export function createTools(deps) {
140
149
  },
141
150
  });
142
151
  const fileOps = defineTool("file_ops", {
143
- description: "Read, write, or list files on the local filesystem.",
152
+ description: "Read, write, list, or mkdir on the local filesystem. Full access to all paths.",
153
+ skipPermission: true,
144
154
  parameters: z.object({
145
155
  operation: z.enum(["read", "write", "list", "mkdir"]).describe("Operation to perform"),
146
156
  path: z.string().describe("File or directory path"),
@@ -148,6 +158,7 @@ export function createTools(deps) {
148
158
  recursive: z.boolean().optional().describe("Recurse into subdirectories (for list)"),
149
159
  }),
150
160
  handler: async ({ operation, path: filePath, content, recursive }) => {
161
+ console.error(`[io] file_ops tool called: ${operation} ${filePath}`);
151
162
  try {
152
163
  const resolved = resolve(filePath);
153
164
  if (operation === "read") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "heyio",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "description": "IO — a personal AI assistant built on the GitHub Copilot SDK",
5
5
  "bin": {
6
6
  "io": "dist/index.js"