tau-coding-agent 0.1.5 → 0.2.0

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 (86) hide show
  1. package/README.md +15 -12
  2. package/extensions/answer.ts +129 -73
  3. package/extensions/branch-term/README.md +7 -0
  4. package/extensions/{branch-term.ts → branch-term/index.ts} +113 -104
  5. package/extensions/btw.ts +90 -4
  6. package/extensions/caffeinate/README.md +5 -0
  7. package/extensions/caffeinate/index.ts +144 -0
  8. package/extensions/fast.ts +292 -0
  9. package/extensions/ghostty.ts +214 -211
  10. package/extensions/git-diff-stats.ts +124 -84
  11. package/extensions/git-pr-status.ts +274 -208
  12. package/extensions/insights.ts +138 -183
  13. package/extensions/loop.ts +150 -135
  14. package/extensions/memory.ts +172 -97
  15. package/extensions/notify.ts +14 -26
  16. package/extensions/openai-verbosity.ts +108 -42
  17. package/extensions/review/fix.ts +15 -6
  18. package/extensions/review/git.ts +93 -103
  19. package/extensions/review/index.ts +60 -62
  20. package/extensions/review/interrupt.ts +117 -0
  21. package/extensions/review/message-queue.ts +45 -12
  22. package/extensions/review/models.ts +79 -3
  23. package/extensions/review/prompts.ts +43 -40
  24. package/extensions/review/review.ts +161 -166
  25. package/extensions/review/runner.ts +139 -147
  26. package/extensions/review/runtime.ts +173 -120
  27. package/extensions/review/submit-review-tool.ts +1 -5
  28. package/extensions/review/submit-triage-tool.ts +1 -0
  29. package/extensions/review/triage.ts +41 -44
  30. package/extensions/sandbox/bash.ts +775 -0
  31. package/extensions/sandbox/command.ts +605 -0
  32. package/extensions/sandbox/config.ts +764 -0
  33. package/extensions/sandbox/index.ts +138 -2850
  34. package/extensions/sandbox/macos-sandbox-shell.mjs +202 -0
  35. package/extensions/sandbox/permissions/dialog.ts +118 -0
  36. package/extensions/sandbox/permissions/filesystem.ts +559 -0
  37. package/extensions/sandbox/permissions/mach-lookup.ts +186 -0
  38. package/extensions/sandbox/permissions/network.ts +164 -0
  39. package/extensions/sandbox/permissions/unsandboxed.ts +270 -0
  40. package/extensions/sandbox/runtime.ts +616 -0
  41. package/extensions/stash.ts +28 -15
  42. package/extensions/subagent/README.md +73 -0
  43. package/extensions/subagent/index.ts +822 -0
  44. package/extensions/subagent/interrupt.ts +117 -0
  45. package/extensions/subagent/permissions.ts +101 -0
  46. package/extensions/subagent/rpc.ts +177 -0
  47. package/extensions/tool-display-mode.ts +267 -64
  48. package/extensions/usage/anthropic.ts +5 -6
  49. package/extensions/usage/github-copilot.ts +30 -9
  50. package/extensions/usage/index.ts +250 -357
  51. package/extensions/usage/openai-codex.ts +2 -2
  52. package/extensions/usage/openrouter.ts +10 -2
  53. package/extensions/websearch/README.md +12 -47
  54. package/extensions/websearch/config.ts +5 -2
  55. package/extensions/websearch/index.ts +94 -109
  56. package/extensions/websearch/output.ts +51 -0
  57. package/extensions/websearch/providers/anthropic.pi.ts +27 -44
  58. package/extensions/websearch/providers/gemini.browser.ts +68 -77
  59. package/extensions/websearch/providers/gemini.pi.ts +17 -17
  60. package/extensions/websearch/providers/openai-codex.pi.ts +145 -7
  61. package/extensions/websearch/providers/pi-model.shared.ts +44 -32
  62. package/extensions/websearch/providers/shared.ts +87 -2
  63. package/extensions/websearch/types.ts +0 -3
  64. package/extensions/worktree.ts +132 -172
  65. package/package.json +10 -5
  66. package/skills/browser-tools/SKILL.md +29 -234
  67. package/skills/browser-tools/references/cookies.md +36 -0
  68. package/skills/browser-tools/references/interaction.md +90 -0
  69. package/skills/browser-tools/references/logging.md +34 -0
  70. package/skills/git-clean-history/SKILL.md +6 -6
  71. package/skills/git-commit/SKILL.md +5 -3
  72. package/skills/github-pull-request/SKILL.md +60 -0
  73. package/skills/github-pull-request/references/create.md +40 -0
  74. package/skills/github-pull-request/references/stewardship.md +60 -0
  75. package/skills/oracle/SKILL.md +4 -4
  76. package/skills/oracle/scripts/oracle +64 -51
  77. package/skills/sentry/SKILL.md +15 -185
  78. package/skills/sentry/references/events.md +79 -0
  79. package/skills/sentry/references/issues.md +62 -0
  80. package/skills/sentry/references/logs.md +46 -0
  81. package/skills/update-changelog/SKILL.md +27 -121
  82. package/skills/web-design/SKILL.md +16 -105
  83. package/themes/tau-dark.json +4 -0
  84. package/extensions/openai-fast.ts +0 -229
  85. package/extensions/websearch/providers/openai-codex.browser.ts +0 -77
  86. package/extensions/websearch/providers/openai-codex.shared.ts +0 -123
@@ -1,123 +0,0 @@
1
- import type { WebsearchSource } from "../types.js";
2
- import { dedupeSources, extractMarkdownSources } from "../normalize.js";
3
- import { buildWebsearchPrompt, WEBSEARCH_SYSTEM_PROMPT } from "./search-prompt.shared.js";
4
- import { readEventStream, withTimeout } from "./shared.js";
5
-
6
- export function decodeJwtAccountId(jwt: string | undefined): string | undefined {
7
- if (!jwt || typeof jwt !== "string") return undefined;
8
-
9
- try {
10
- const parts = jwt.split(".");
11
- if (parts.length !== 3) return undefined;
12
- const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString("utf8")) as Record<
13
- string,
14
- unknown
15
- >;
16
- const auth = payload["https://api.openai.com/auth"];
17
- return auth && typeof auth === "object"
18
- ? ((auth as Record<string, unknown>).chatgpt_account_id as string | undefined)
19
- : undefined;
20
- } catch {
21
- return undefined;
22
- }
23
- }
24
-
25
- export function resolveCodexUrl(baseUrl = "https://chatgpt.com/backend-api"): string {
26
- const normalized = String(baseUrl || "https://chatgpt.com/backend-api").replace(/\/+$/, "");
27
- if (normalized.endsWith("/codex/responses")) return normalized;
28
- if (normalized.endsWith("/codex")) return `${normalized}/responses`;
29
- return `${normalized}/codex/responses`;
30
- }
31
-
32
- export async function runOpenAICodexSearch(options: {
33
- apiKey: string;
34
- model: string;
35
- query: string;
36
- baseUrl?: string;
37
- accountId?: string;
38
- headers?: Record<string, string>;
39
- signal?: AbortSignal;
40
- }): Promise<{ answer: string; sources: WebsearchSource[] }> {
41
- const response = await fetch(resolveCodexUrl(options.baseUrl), {
42
- method: "POST",
43
- headers: {
44
- ...options.headers,
45
- authorization: `Bearer ${options.apiKey}`,
46
- ...(options.accountId ? { "chatgpt-account-id": options.accountId } : {}),
47
- "content-type": "application/json",
48
- accept: "text/event-stream",
49
- "OpenAI-Beta": "responses=experimental",
50
- originator: "pi-websearch",
51
- },
52
- body: JSON.stringify({
53
- model: options.model,
54
- store: false,
55
- stream: true,
56
- instructions: WEBSEARCH_SYSTEM_PROMPT,
57
- input: [{ role: "user", content: buildWebsearchPrompt(options.query) }],
58
- tools: [{ type: "web_search" }],
59
- tool_choice: "auto",
60
- }),
61
- signal: withTimeout(options.signal, 120_000),
62
- });
63
-
64
- let answer = "";
65
- let fallbackAnswer = "";
66
-
67
- await readEventStream(response, ({ data }) => {
68
- if (!data.trim()) return;
69
-
70
- try {
71
- const event = JSON.parse(data) as Record<string, unknown>;
72
-
73
- if (event.type === "response.output_text.delta" && typeof event.delta === "string") {
74
- answer += event.delta;
75
- }
76
-
77
- if (event.type === "response.output_item.done") {
78
- const item = event.item as Record<string, unknown> | undefined;
79
- const content = Array.isArray(item?.content) ? item.content : [];
80
- const fullText = content
81
- .filter(
82
- (part) =>
83
- part &&
84
- typeof part === "object" &&
85
- (part as Record<string, unknown>).type === "output_text",
86
- )
87
- .map((part) => (part as Record<string, unknown>).text)
88
- .filter((text): text is string => typeof text === "string")
89
- .join("\n");
90
- if (fullText) fallbackAnswer = fullText;
91
- }
92
-
93
- if (event.type === "response.failed" || event.type === "error") {
94
- const failedResponse = event.response;
95
- const eventMessage = typeof event.message === "string" ? event.message : undefined;
96
- if (failedResponse && typeof failedResponse === "object") {
97
- const error = (failedResponse as Record<string, unknown>).error;
98
- if (
99
- error &&
100
- typeof error === "object" &&
101
- typeof (error as Record<string, unknown>).message === "string"
102
- ) {
103
- throw new Error((error as Record<string, unknown>).message as string);
104
- }
105
- }
106
- throw new Error(eventMessage ?? "OpenAI Codex search failed.");
107
- }
108
- } catch (error) {
109
- if (error instanceof SyntaxError) return;
110
- throw error;
111
- }
112
- });
113
-
114
- const finalAnswer = (answer || fallbackAnswer).trim();
115
- if (!finalAnswer) {
116
- throw new Error("OpenAI Codex returned an empty response.");
117
- }
118
-
119
- return {
120
- answer: finalAnswer,
121
- sources: dedupeSources(extractMarkdownSources(finalAnswer)),
122
- };
123
- }