killeros 1.5.0 → 1.5.1

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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,18 @@ All notable changes to KillerOS are documented here.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [1.5.1] - 2026-08-03
8
+
9
+ ### Changed
10
+
11
+ - Added a fixed pragmatic response style, low GPT-5 Responses API verbosity, and concise reasoning summaries without changing reasoning effort.
12
+
13
+ ### Fixed
14
+
15
+ - Replaced the `subagent` tool's top-level union with a provider-compatible object schema, fixing request rejection by Console Go and other providers that require function schemas with `type: "object"`.
16
+ - Kept strict action-specific subagent validation at runtime, including single, parallel, chain, steering, interruption, collection, and closure requests.
17
+ - Scoped native concise settings to supported Responses APIs while leaving completion and unrelated provider payloads unchanged.
18
+
7
19
  ## [1.5.0] - 2026-08-03
8
20
 
9
21
  ### Changed
package/README.md CHANGED
@@ -33,7 +33,7 @@ pi install git:github.com/KyrosHendrix/pi-KillerOS
33
33
  Pin an install to a release:
34
34
 
35
35
  ```bash
36
- pi install git:github.com/KyrosHendrix/pi-KillerOS@v1.5.0
36
+ pi install git:github.com/KyrosHendrix/pi-KillerOS@v1.5.1
37
37
  ```
38
38
 
39
39
  Add `-l` to either command for a project-only install. Restart Pi after installing.
@@ -10,8 +10,32 @@ export const CONCISE_SYSTEM_PROMPT = `
10
10
  6. Do not invent time estimates, completion claims, or facts.
11
11
  7. Preserve exact code, commands, paths, quoted text, warnings, and user-requested formats.
12
12
  8. Omit recap sections and generic closing pleasantries.
13
+ 9. Use a pragmatic style: direct, plain, and focused on the task.
13
14
  `.trim();
14
15
 
16
+ function isRecord(value: unknown): value is Record<string, unknown> {
17
+ return typeof value === "object" && value !== null && !Array.isArray(value);
18
+ }
19
+
20
+ function applyConciseModelSettings(payload: unknown, api: unknown, modelId: unknown): unknown {
21
+ if (!isRecord(payload) || !Array.isArray(payload.input)) return payload;
22
+
23
+ const supportsSummary = api === "openai-codex-responses" || api === "openai-responses" || api === "azure-openai-responses";
24
+ const supportsVerbosity = api === "openai-codex-responses"
25
+ || api === "openai-responses" && typeof modelId === "string" && /^gpt-5(?:[.-]|$)/u.test(modelId);
26
+ let updated = payload;
27
+ if (supportsVerbosity) {
28
+ updated = {
29
+ ...updated,
30
+ text: { ...(isRecord(payload.text) ? payload.text : {}), verbosity: "low" },
31
+ };
32
+ }
33
+ if (supportsSummary && isRecord(payload.reasoning)) {
34
+ updated = { ...updated, reasoning: { ...payload.reasoning, summary: "concise" } };
35
+ }
36
+ return updated;
37
+ }
38
+
15
39
  export function isConcisedEnabled(): boolean {
16
40
  return true;
17
41
  }
@@ -20,4 +44,5 @@ export function registerConcisePrompt(pi: ExtensionAPI): void {
20
44
  pi.on("before_agent_start", (event) => ({
21
45
  systemPrompt: `${event.systemPrompt}\n\n${CONCISE_SYSTEM_PROMPT}`,
22
46
  }));
47
+ pi.on("before_provider_request", (event, ctx) => applyConciseModelSettings(event.payload, ctx.model?.api, ctx.model?.id));
23
48
  }
@@ -959,45 +959,24 @@ function createSubagentParams(limits: Pick<SubagentLimits, "maxTasks" | "maxRead
959
959
  agent: Type.String({ minLength: 1, maxLength: 64, description: "Agent role name" }),
960
960
  task: Type.String({ minLength: 1, maxLength: limits.taskCharacters, description: "Task with optional {previous} handoff placeholder" }),
961
961
  }, { additionalProperties: false });
962
- const action = Type.Optional(Type.Literal(SUBAGENT_ACTION.spawn, { default: SUBAGENT_ACTION.spawn, description: "Spawn child threads" }));
963
- const spawnOptions = {
962
+ const threadId = Type.String({ minLength: 1, maxLength: 128, description: "Stable child thread ID" });
963
+ return Type.Object({
964
+ action: Type.Optional(StringEnum(SUBAGENT_ACTIONS, { default: SUBAGENT_ACTION.spawn, description: "Spawn, list, inspect, steer, interrupt, collect, or close" })),
965
+ threadId: Type.Optional(threadId),
966
+ message: Type.Optional(Type.String({ minLength: 1, maxLength: 4_000, description: "Steering message; valid only with action steer" })),
967
+ all: Type.Optional(Type.Literal(true, { description: "Interrupt every active child thread" })),
968
+ agent: Type.Optional(Type.String({ minLength: 1, maxLength: 64, description: "Agent role for single mode" })),
969
+ task: Type.Optional(Type.String({ minLength: 1, maxLength: limits.taskCharacters, description: "Task for single mode" })),
970
+ tasks: Type.Optional(Type.Array(taskSchema, { minItems: 1, maxItems: limits.maxTasks, description: `Parallel role tasks: read-only batches run concurrently up to ${limits.maxReadConcurrency}; batches with writers use one shared slot by default. Set writerConcurrency to opt into a larger shared pool; concurrent writers share the parent worktree, so callers must prove path ownership` })),
971
+ writerConcurrency: Type.Optional(Type.Integer({ minimum: 1, maximum: limits.maxTasks, description: `Optional shared-pool cap for parallel tasks that include writers. Defaults to 1 when writers are selected; values above 1 opt into concurrent shared-worktree writes. Concurrent writers must prove path ownership` })),
972
+ chain: Type.Optional(Type.Array(chainTaskSchema, { minItems: 1, maxItems: limits.maxTasks, description: "Sequential role tasks; {previous} inserts the prior result" })),
964
973
  model: Type.Optional(Type.String({ minLength: 1, maxLength: 256, description: "Model for every task as provider/model; inherit uses each role setting or the active parent" })),
965
974
  thinking: Type.Optional(Type.String({ minLength: 1, maxLength: 16, description: "Thinking effort for every task: off, minimal, low, medium, high, xhigh, max, or inherit" })),
966
975
  agentScope: Type.Optional(StringEnum(["user", "project", "both"] as const, {
967
976
  default: "user",
968
977
  description: "Role sources: user includes bundled and personal; project includes bundled and trusted project; both includes all",
969
978
  })),
970
- };
971
- const threadId = Type.String({ minLength: 1, maxLength: 128, description: "Stable child thread ID" });
972
- const exportProperties = {
973
- action: Type.String({ description: "Spawn, list, inspect, steer, interrupt, collect, or close" }),
974
- threadId: Type.String({ description: "Child thread ID for a lifecycle action" }),
975
- message: Type.String({ description: "Steering message; valid only with action steer" }),
976
- all: Type.Boolean({ description: "Interrupt every active child thread" }),
977
- agent: Type.String({ description: "Agent role for a single spawn" }),
978
- task: Type.String({ description: "Task for a single spawn" }),
979
- tasks: Type.Array(Type.Any(), { description: "Parallel role tasks" }),
980
- writerConcurrency: Type.Integer({ description: "Shared-pool cap for parallel writer tasks" }),
981
- chain: Type.Array(Type.Any(), { description: "Sequential role tasks" }),
982
- model: Type.String({ description: "Model for every spawned task" }),
983
- thinking: Type.String({ description: "Thinking effort for every spawned task" }),
984
- agentScope: Type.String({ description: "Role sources for a spawn" }),
985
- };
986
- const schema = Type.Union([
987
- Type.Object({ action, agent: Type.String({ minLength: 1, maxLength: 64, description: "Agent role for single mode" }), task: Type.String({ minLength: 1, maxLength: limits.taskCharacters, description: "Task for single mode" }), ...spawnOptions }, { additionalProperties: false }),
988
- Type.Object({ action, tasks: Type.Array(taskSchema, { minItems: 1, maxItems: limits.maxTasks, description: `Parallel role tasks: read-only batches run concurrently up to ${limits.maxReadConcurrency}; batches with writers use one shared slot by default. Set writerConcurrency to opt into a larger shared pool; concurrent writers share the parent worktree, so callers must prove path ownership` }), writerConcurrency: Type.Optional(Type.Integer({ minimum: 1, maximum: limits.maxTasks, description: `Optional shared-pool cap for parallel tasks that include writers. Defaults to 1 when writers are selected; values above 1 opt into concurrent shared-worktree writes. Concurrent writers must prove path ownership` })), ...spawnOptions }, { additionalProperties: false }),
989
- Type.Object({ action, chain: Type.Array(chainTaskSchema, { minItems: 1, maxItems: limits.maxTasks, description: "Sequential role tasks; {previous} inserts the prior result" }), ...spawnOptions }, { additionalProperties: false }),
990
- Type.Object({ action: Type.Literal(SUBAGENT_ACTION.list) }, { additionalProperties: false }),
991
- Type.Object({ action: Type.Literal(SUBAGENT_ACTION.inspect), threadId }, { additionalProperties: false }),
992
- Type.Object({ action: Type.Literal(SUBAGENT_ACTION.steer), threadId, message: Type.String({ minLength: 1, maxLength: 4_000, description: "Bounded steering message" }) }, { additionalProperties: false }),
993
- Type.Object({ action: Type.Literal(SUBAGENT_ACTION.interrupt), threadId }, { additionalProperties: false }),
994
- Type.Object({ action: Type.Literal(SUBAGENT_ACTION.interrupt), all: Type.Literal(true, { description: "Interrupt every active child thread" }) }, { additionalProperties: false }),
995
- Type.Object({ action: Type.Literal(SUBAGENT_ACTION.collect), threadId }, { additionalProperties: false }),
996
- Type.Object({ action: Type.Literal(SUBAGENT_ACTION.close), threadId }, { additionalProperties: false }),
997
- ]);
998
- // Pi's HTML export reads properties; providers receive only the action-specific union.
999
- Object.defineProperty(schema, "properties", { value: exportProperties });
1000
- return schema;
979
+ }, { additionalProperties: false });
1001
980
  }
1002
981
 
1003
982
  type ToolUpdate = (partial: { content: Array<{ type: "text"; text: string }>; details: SubagentDetails }) => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "killeros",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "description": "A production-hardened TUI and workflow extension for the Pi coding agent.",
5
5
  "type": "module",
6
6
  "keywords": [