@swifty.js/swifty 0.0.16 → 0.0.18
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/README.md +13 -10
- package/dist/{agent-3T6JNTAT.js → agent-QD6EMP2B.js} +1 -1
- package/dist/anthropic-XJ5BOCJA.js +4 -0
- package/dist/{checker-NVYS3GH6.js → checker-GWE2YS7P.js} +1 -1
- package/dist/{chunk-7IRGXEBO.js → chunk-3USGFIWF.js} +1 -1
- package/dist/chunk-4WQF4JIN.js +4 -0
- package/dist/{chunk-HXLSOWKW.js → chunk-ASZMSWK5.js} +9 -9
- package/dist/{chunk-FZUA4PEF.js → chunk-DTIGEOLN.js} +85 -85
- package/dist/{chunk-RKJQNZWW.js → chunk-GM65WMIB.js} +1 -1
- package/dist/chunk-KSCFIYHH.js +4 -0
- package/dist/{chunk-YOZTZPFE.js → chunk-P276SKAC.js} +1 -1
- package/dist/{chunk-LC766IV2.js → chunk-SUWMNSWK.js} +14 -14
- package/dist/{chunk-RTOI4JAC.js → chunk-ZM2V2A7B.js} +1 -1
- package/dist/glob.wasm +0 -0
- package/dist/main.js +226 -225
- package/dist/{openai-VS2R4V7J.js → openai-LZ7SDDQU.js} +1 -1
- package/dist/{server-2FJMXEAV.js → server-OMMZPDFT.js} +2 -2
- package/dist/{tool-filter-334HOWZK.js → tool-filter-3JS7ZXAD.js} +1 -1
- package/package.json +3 -3
- package/dist/anthropic-3NHEY4SF.js +0 -4
- package/dist/chunk-4XCKINK4.js +0 -4
- package/dist/chunk-A3NIT2ZF.js +0 -4
package/README.md
CHANGED
|
@@ -70,11 +70,11 @@ pnpm dev
|
|
|
70
70
|
|
|
71
71
|
Swifty reads YAML configuration files from multiple locations, merged in order:
|
|
72
72
|
|
|
73
|
-
1. ~/.swifty/config.
|
|
74
|
-
2. .swifty/config.
|
|
75
|
-
3. .swifty/config.local.
|
|
73
|
+
1. ~/.swifty/config.yaml
|
|
74
|
+
2. .swifty/config.yaml (project root)
|
|
75
|
+
3. .swifty/config.local.yaml (project root, gitignored)
|
|
76
76
|
|
|
77
|
-
At least one provider must be configured. Example config.
|
|
77
|
+
At least one provider must be configured. Example config.yaml:
|
|
78
78
|
|
|
79
79
|
```yaml
|
|
80
80
|
providers:
|
|
@@ -178,9 +178,12 @@ Inside the TUI, these commands are available:
|
|
|
178
178
|
|
|
179
179
|
### Keyboard Shortcuts
|
|
180
180
|
|
|
181
|
-
| Key | Action
|
|
182
|
-
| --------- |
|
|
183
|
-
| Ctrl+C |
|
|
184
|
-
| Ctrl+O | Toggle full vs. truncated tool output
|
|
185
|
-
| Ctrl+T | Toggle Teams dialog overlay
|
|
186
|
-
|
|
|
181
|
+
| Key | Action |
|
|
182
|
+
| --------- | ----------------------------------------------------------------------------------- |
|
|
183
|
+
| Ctrl+C | Clear input or interrupt streaming (first press), exit app (second press within 2s) |
|
|
184
|
+
| Ctrl+O | Toggle full vs. truncated tool output |
|
|
185
|
+
| Ctrl+T | Toggle Teams dialog overlay |
|
|
186
|
+
| Ctrl+V | Paste a clipboard image (Alt+V on Windows) |
|
|
187
|
+
| Shift+Tab | Cycle permission modes |
|
|
188
|
+
|
|
189
|
+
Pasting an image saves it as a PNG under `.swifty/file-history/<session-id>/` and inserts a workDir-relative `@` reference into the prompt; on submit it expands into an inline image block like any other `@image` mention. Linux requires `wl-clipboard` (Wayland) or `xclip` (X11).
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __swiftyCreateRequire } from "node:module";
|
|
3
3
|
const require = __swiftyCreateRequire(import.meta.url);
|
|
4
|
-
import{h as a}from"./chunk-
|
|
4
|
+
import{h as a}from"./chunk-SUWMNSWK.js";import"./chunk-ASZMSWK5.js";import"./chunk-FZPTNGTU.js";import"./chunk-ZM2V2A7B.js";import"./chunk-X3UA5OZL.js";export{a as Agent};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __swiftyCreateRequire } from "node:module";
|
|
3
|
+
const require = __swiftyCreateRequire(import.meta.url);
|
|
4
|
+
import{a as $}from"./chunk-3USGFIWF.js";import{g as P}from"./chunk-H7VXSMJR.js";import{k as C}from"./chunk-ASZMSWK5.js";import{e as H,g as Y,h as R}from"./chunk-KSCFIYHH.js";import{b as N,c as K,d as M,e as W,f as F,g as G}from"./chunk-FZPTNGTU.js";import"./chunk-P276SKAC.js";import"./chunk-7MHXMDYC.js";import{C as w,I as O,J as v,K as j,L as B,M as I,N as _,O as U,g as L}from"./chunk-ZM2V2A7B.js";import"./chunk-E55KH72M.js";import"./chunk-X3UA5OZL.js";function D(o){for(let t=o.length-1;t>=0;t--){let e=o[t];if(e.defer_loading!==!0){e.cache_control={type:"ephemeral"};return}}}function J(o){return o.some(t=>t.defer_loading)}var x=O({module:"llm"});var z=3e3,V=w.object({max_input_tokens:w.coerce.number()});async function pt(o){if(o.protocol!=="anthropic")return 0;let t=R(o),n=`${o.base_url.replace(/\/+$/,"")}/v1/models/${encodeURIComponent(o.model)}`,s=new AbortController,r=setTimeout(()=>{s.abort()},z);try{let c=await fetch(n,{method:"GET",headers:{"anthropic-version":"2023-06-01",...t?{"x-api-key":t}:{}},signal:s.signal});if(!c.ok)return 0;let h=await c.json(),{success:g,error:f,data:d}=await L(V,h);if(!g)return x.warn({message:f.message},"model context window schema validation failed"),0;let k=d.max_input_tokens;return Math.max(k,0)}catch(c){return x.error({err:c},"failed to fetch model context window"),0}finally{clearTimeout(r)}}function Q(){return!0}function S(o){return typeof o=="string"?[{type:"text",text:o}]:o}function X(o){let t=[];for(let e of o)if(e.role==="assistant"){let n=[];if(e.thinkingBlocks)for(let r of e.thinkingBlocks)n.push({type:"thinking",thinking:r.thinking,signature:r.signature});let s=typeof e.content=="string"?e.content:j(e.content);if(s&&n.push({type:"text",text:s}),e.toolUses)for(let r of e.toolUses)n.push({type:"tool_use",id:r.toolUseId,name:r.toolName,input:r.arguments});n.length===0&&n.push({type:"text",text:""}),t.push({role:"assistant",content:n})}else if(e.toolResults&&e.toolResults.length>0){let n=[];for(let s of e.toolResults)n.push({type:"tool_result",tool_use_id:s.toolUseId,is_error:s.isError,content:s.content});t.push({role:"user",content:n})}else{if(t.length===0){t.push({role:"user",content:S(e.content)});continue}let n=!1,s=t[t.length-1],r=s.content;s.role==="user"&&(typeof r=="string"||Array.isArray(r)&&r.length>0&&(r[0].type==="text"||r[0].type==="image"))&&(n=!0),n?(typeof r=="string"&&(r=s.content=r.trim().length>0?[{type:"text",text:r}]:[]),r.push(...S(e.content))):t.push({role:"user",content:S(e.content)})}return t}var q=class{client;model;thinking;systemPrompt;maxOutputTokens;contextWindow;constructor(t,e){let n=R(t);if(!n)throw new M("Anthropic API key not found, set ANTHROPIC_API_KEY in .swifty/config.y(a)ml, or via ANTHROPIC_API_KEY env variable.");this.client=new P({apiKey:n,baseURL:t.base_url}),this.model=t.model,this.thinking=t.thinking??!0,this.systemPrompt=e,this.maxOutputTokens=Y(t),this.contextWindow=H(t)}setSystemPrompt(t){this.systemPrompt=t}setMaxOutputTokens(t){this.maxOutputTokens=t}async*stream(t,e,n){let s=X(N(t.getMessages())),r=J(e),c=e.map(l=>{let p=l.input_schema,u={name:l.name,description:l.description,input_schema:{type:"object",properties:p.properties,required:p.required??[]}};return l.defer_loading===!0&&(u.defer_loading=!0),u});D(c),Z(s);let h={model:this.model,max_tokens:this.maxOutputTokens,stream:!0,system:[{type:"text",text:this.systemPrompt,cache_control:{type:"ephemeral"}}],messages:s,...c.length>0?{tools:c}:{}};this.thinking?Q()&&(h.thinking={type:"enabled",budget_tokens:C(this.contextWindow,this.maxOutputTokens)}):h.thinking={type:"enabled",budget_tokens:C(this.contextWindow,this.maxOutputTokens)};let g=0,f=0,d=0,k=0,E="end_turn",T="",b="",A=!1;try{let l=this.client.messages.stream(h,{...n?{signal:n}:{},...r?{headers:{"anthropic-beta":$}}:{}}),p="",u="",m="";for await(let i of l)switch(i.type){case"content_block_start":{let a=i.content_block;a.type==="thinking"?(A=!0,T="",b=""):a.type==="tool_use"&&(u=a.id,p=a.name,m="",yield{type:"tool_call_start",toolName:p,toolId:u});break}case"content_block_delta":{let a=i.delta;a.type==="thinking_delta"?(T+=a.thinking,yield{type:"thinking_delta",text:a.thinking}):a.type==="signature_delta"?b=a.signature:a.type==="text_delta"?yield{type:"text_delta",text:a.text}:a.type==="input_json_delta"&&(m+=a.partial_json,yield{type:"tool_call_delta",text:a.partial_json});break}case"content_block_stop":{if(A&&(yield{type:"thinking_complete",thinking:T,signature:b},A=!1),p){let a={};if(m)try{let y=JSON.parse(m);a=B(y)?I(y):{[v]:m}}catch(y){x.error({err:y},"llm operation failed"),a={[v]:m}}yield{type:"tool_call_complete",toolId:u,toolName:p,arguments:a},p="",u="",m=""}break}case"message_delta":{i.delta.stop_reason&&(E=i.delta.stop_reason),i.usage.output_tokens&&(f=i.usage.output_tokens,i.usage.input_tokens&&(g=i.usage.input_tokens),i.usage.cache_read_input_tokens&&(d=i.usage.cache_read_input_tokens),i.usage.cache_creation_input_tokens&&(k=i.usage.cache_creation_input_tokens));break}case"message_start":{g=i.message.usage.input_tokens,f=i.message.usage.output_tokens,d=i.message.usage.cache_read_input_tokens??0,k=i.message.usage.cache_creation_input_tokens??0;break}}yield{type:"stream_end",stopReason:E,usage:{inputTokens:g,outputTokens:f,cacheReadInputTokens:d,cacheCreationInputTokens:k}}}catch(l){throw x.error({err:l},"llm operation failed"),tt(l)}}};function Z(o){for(let t=o.length-1;t>=0;t--){if(o[t].role!=="user")continue;let e=o[t].content;if(typeof e=="string"&&e.length===0||Array.isArray(e)&&e.length===0)return;typeof e=="string"&&(e=o[t].content=[{type:"text",text:e}]);let n=e[e.length-1];for(let s=e.length-1;s>=0;s--)if(e[s].type!=="image"){n=e[s];break}Reflect.set(n,"cache_control",{type:"ephemeral"})}}function tt(o){if(o instanceof P.APIError){if(o.status===413||/prompts?\s+too\s+long/i.test(o.message))return new G(`Prompt too long: ${o.message}`);if(o.status===401)return new M(`Invalid API key: ${o.message}`);if(o.status===429){let t=I(o.headers)["retry-after"],e="Rate Limited";if(t){let n=Number.parseInt(_(t));Number.isNaN(n)&&(e+=", please wait."),e+=`, retry after ${_(n)}s.`}else e+=", please wait.";return new W(e,t?_(t):void 0)}return new K(`Anthropic API error (${_(o.status)}): ${o.message}`)}return new F(`Network error: ${U(o)}`)}export{q as AnthropicClient,X as buildAnthropicMessages,pt as fetchModelContextWindow,Z as markLastUserTailForCache,D as markToolsForCache,J as needsToolSearchBeta};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __swiftyCreateRequire } from "node:module";
|
|
3
3
|
const require = __swiftyCreateRequire(import.meta.url);
|
|
4
|
-
import{a,b,c,d,e}from"./chunk-
|
|
4
|
+
import{a,b,c,d,e}from"./chunk-GM65WMIB.js";import"./chunk-P276SKAC.js";import"./chunk-7MHXMDYC.js";import"./chunk-ZM2V2A7B.js";import"./chunk-E55KH72M.js";import"./chunk-X3UA5OZL.js";export{b as PathSandbox,e as PermissionChecker,d as RuleEngine,c as evaluateRules,a as extractContent};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __swiftyCreateRequire } from "node:module";
|
|
3
3
|
const require = __swiftyCreateRequire(import.meta.url);
|
|
4
|
-
import{a as i,d as s}from"./chunk-
|
|
4
|
+
import{a as i,d as s}from"./chunk-P276SKAC.js";var a=10,p=2.5,E="advanced-tool-use-2025-11-20",f=new Set(["api.anthropic.com"]),d="SWIFTY_MCP_LOADING";function u(o){if(!o)return!0;try{return f.has(new URL(o).hostname.toLowerCase())}catch{return!1}}function l(o){return Math.floor(o/p)}function m(o,t,e,n=a){let r=(process.env[d]??"").trim().toLowerCase();if(r==="eager"||r==="native"||r==="dispatch")return r;if(e<=0)return"eager";let c=t*n/100;return l(e)<c?"eager":u(o)?"native":"dispatch"}function g(o){let t=0;for(let e of o.listTools())if(e.name.startsWith(i))try{t+=JSON.stringify(e.schema()).length}catch{t+=e.name.length+(e.description?.length??0)}return t}function T(o,t){o.mcpLoadingMode=t;let e=t==="eager";for(let n of o.listTools())s(n)&&typeof n.setDeferLoading=="function"&&n.setDeferLoading(!e);o.exposeToolSearch=!e,o.exposeMcpCall=t==="dispatch"}function M(o,t,e){let n=m(t,e,g(o));return T(o,n),n}export{E as a,M as b};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createRequire as __swiftyCreateRequire } from "node:module";
|
|
3
|
+
const require = __swiftyCreateRequire(import.meta.url);
|
|
4
|
+
import{a as T,b as f}from"./chunk-E55KH72M.js";var c=class{tools=new Map;discovered=new Set;mcpLoadingMode="eager";exposeToolSearch=!1;exposeMcpCall=!1;register(e){this.tools.set(e.name,e)}get(e){return this.tools.get(e)}listTools(){return[...this.tools.values()]}getAllSchemas(e="anthropic"){let o=e==="openai"||e==="openai-compat",t=this.mcpLoadingMode==="native"&&!o,n=[];for(let s of this.tools.values()){if(s.name===T&&!this.exposeToolSearch||s.name===f&&!this.exposeMcpCall)continue;let i=!!s.deferred&&!this.discovered.has(s.name);if(i&&!t)continue;let r=s.schema();o?n.push({strict:!1,type:"function",name:r.name,description:r.description,parameters:r.input_schema,function:{name:r.name,description:r.description,parameters:r.input_schema}}):n.push(i?{...r,type:"custom",defer_loading:!0}:{...r,type:"custom"})}return n}getDeferredToolNames(){let e=[];for(let o of this.tools.values())o.deferred&&!this.discovered.has(o.name)&&e.push(o.name);return e.sort()}getDeferredTools(){return[...this.tools.values()].filter(e=>e.deferred&&!this.discovered.has(e.name))}searchDeferred(e,o=5){let t=e.toLowerCase(),n=[];for(let s of this.tools.values())if(!(!s.deferred||this.discovered.has(s.name))&&(s.name.toLowerCase().includes(t)||s.description.toLowerCase().includes(t))&&(n.push(s),n.length>=o))break;return n}findDeferredByNames(e){let o=new Map;for(let[t,n]of this.tools)o.set(t.toLowerCase(),n);return e.map(t=>o.get(t.toLowerCase())).filter(t=>t?.deferred??!1)}markDiscovered(e){this.discovered.add(e)}isDiscovered(e){return this.discovered.has(e)}};var h=new Set(["ExitPlanMode","Agent","AskUserQuestion","TaskStop"]),M=new Set(["TeamCreate","TeamDelete"]),m=new Set(["ExitPlanMode","Agent","AskUserQuestion","TaskStop"]),u=new Set(["ReadFile","Grep","Glob","Bash","EditFile","WriteFile","LoadSkill","SyntheticOutput","ToolSearch","EnterWorktree","ExitWorktree","McpCall"]);function g(a){return a.startsWith("mcp__")}function k(a,e,o,t,n=!1){let s=new Set(o??[]),i=new Set(e??[]),r=i.size>0&&!(i.size===1&&i.has("*")),p=new c;for(let d of a.listTools()){let l=d.name;if(g(l)){p.register(d);continue}h.has(l)||n&&m.has(l)||t&&!u.has(l)||s.has(l)||r&&!i.has(l)||p.register(d)}return p}var A="agent:builtin:fork";function E(a){let e=new c;for(let o of a.listTools())if(o.name==="Agent"&&"querySource"in o){let t=Object.create(Object.getPrototypeOf(o),Object.getOwnPropertyDescriptors(o));t.querySource=A,e.register(t)}else e.register(o);return e}export{c as a,h as b,M as c,m as d,u as e,k as f,A as g,E as h};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __swiftyCreateRequire } from "node:module";
|
|
3
3
|
const require = __swiftyCreateRequire(import.meta.url);
|
|
4
|
-
import{D as i,I as v,K as
|
|
4
|
+
import{D as i,I as v,K as p,O as _,S as U,e as M,f as x}from"./chunk-ZM2V2A7B.js";var T=class{history=[];longTermMemoryInjected=!1;baselineTokens=0;_anchorCount=0;addUserMessage(e){this.history.push({role:"user",content:e})}addAssistantMessage(e){this.history.push({role:"assistant",content:e})}addToolUseMessage(e,o,s,n){this.history.push({role:"assistant",content:e,toolUses:[{toolUseId:o,toolName:s,arguments:n}]})}addAssistantMessageWithTools(e,o){this.history.push({role:"assistant",content:e,toolUses:o})}addAssistantFull(e,o,s){this.history.push({role:"assistant",content:e,thinkingBlocks:o.length>0?o:void 0,toolUses:s.length>0?s:void 0})}addToolResultMessage(e,o,s){this.history.push({role:"user",content:"",toolResults:[{toolUseId:e,content:o,isError:s}]})}addToolResultsMessage(e){this.history.push({role:"user",content:"",toolResults:e})}addSystemReminder(e){this.history.push({role:"user",content:`<system-reminder>
|
|
5
5
|
${e}
|
|
6
|
-
</system-reminder>`})}injectLongTermMemory(e,o,s=""){if(this.longTermMemoryInjected)return;let n=[];if(e&&n.push(`# SWIFTY.md
|
|
6
|
+
</system-reminder>`})}hasReminderContaining(e){return this.history.some(o=>o.role==="user"&&p(o.content).includes(e))}injectLongTermMemory(e,o,s=""){if(this.longTermMemoryInjected)return;let n=[];if(e&&n.push(`# SWIFTY.md
|
|
7
7
|
Codebase and user instructions are shown below. Be sure to adhere to these instructions. IMPORTANT: These instructions OVERRIDE any default behavior and you MUST follow them exactly as written.
|
|
8
8
|
|
|
9
9
|
`+e),o&&n.push(`# Auto Memory
|
|
@@ -18,14 +18,14 @@ ${n.join(`
|
|
|
18
18
|
`)}
|
|
19
19
|
|
|
20
20
|
IMPORTANT: this context may or may not be relevant to your tasks. You should not respond to this context unless it is highly relevant to your task.
|
|
21
|
-
</system-reminder>`;this.history.unshift({role:"user",content:a}),this.longTermMemoryInjected=!0}len(){return this.history.length}truncateTo(e){e<0&&(e=0),!(e>this.history.length)&&(this.history=this.history.slice(0,e))}getMessages(){return[...this.history]}replaceWithCompacted(e,o){this.history=[{role:"user",content:e},...o],this.longTermMemoryInjected=!1,this.clearUsageAnchor()}recordUsageAnchor(e,o,s,n){let r=e+s+n+o;r<=0||(this.baselineTokens=r,this._anchorCount=this.history.length)}clearUsageAnchor(){this.baselineTokens=0,this._anchorCount=0}usageAnchorState(){return this.baselineTokens<=0?null:{baselineTokens:this.baselineTokens,anchorCount:this._anchorCount}}};import{randomBytes as z}from"crypto";import{readFileSync as I,writeFileSync as H,readdirSync as W,mkdirSync as J,statSync as X,existsSync as A,unlinkSync as
|
|
22
|
-
`;H(n,r,{flag:"a",encoding:"utf-8"})}function
|
|
23
|
-
`))if(n.trim())try{let r=JSON.parse(n),{success:l,data:a,error:c}=x(B,r);l?!a.content&&!(a.tool_uses?.length??0)&&!(a.tool_results?.length??0)||s.push(a):b.error({err:c},"session operation failed")}catch(r){b.error({err:r},"session operation failed")}return s}function j(t){return t?.map(e=>({toolUseId:e.tool_use_id,toolName:e.tool_name,arguments:e.arguments}))}function F(t){return t?.map(e=>({toolUseId:e.tool_use_id,content:e.content,isError:e.is_error}))}function
|
|
21
|
+
</system-reminder>`;this.history.unshift({role:"user",content:a}),this.longTermMemoryInjected=!0}len(){return this.history.length}truncateTo(e){e<0&&(e=0),!(e>this.history.length)&&(this.history=this.history.slice(0,e))}getMessages(){return[...this.history]}replaceWithCompacted(e,o){this.history=[{role:"user",content:e},...o],this.longTermMemoryInjected=!1,this.clearUsageAnchor()}recordUsageAnchor(e,o,s,n){let r=e+s+n+o;r<=0||(this.baselineTokens=r,this._anchorCount=this.history.length)}clearUsageAnchor(){this.baselineTokens=0,this._anchorCount=0}usageAnchorState(){return this.baselineTokens<=0?null:{baselineTokens:this.baselineTokens,anchorCount:this._anchorCount}}};import{randomBytes as z}from"crypto";import{readFileSync as I,writeFileSync as H,readdirSync as W,mkdirSync as J,statSync as X,existsSync as A,unlinkSync as Ce,rmSync as xe}from"fs";import{join as y}from"path";var S="compact_boundary";var E=i.object({tool_use_id:i.string(),tool_name:i.string(),arguments:i.record(i.string(),i.unknown()).optional()}),k=i.union([i.string(),i.array(i.record(i.string(),i.unknown()))]),N=i.object({tool_use_id:i.string(),content:k,is_error:i.boolean().optional()}),B=i.object({role:i.string(),content:k.default(""),timestamp:i.number(),type:i.string().optional(),tool_uses:i.array(E).optional(),tool_results:i.array(N).optional()}),G=i.object({role:i.string(),content:k,tool_uses:i.array(E).optional(),tool_results:i.array(N).optional()});function O(t){return(t??[]).map(e=>({tool_use_id:e.toolUseId,tool_name:e.toolName,...e.arguments&&Object.keys(e.arguments).length?{arguments:e.arguments}:{}}))}function L(t){return(t??[]).map(e=>({tool_use_id:e.toolUseId,content:e.content,...e.isError?{is_error:!0}:{}}))}var V=i.object({summary:i.string(),keep:i.array(G)}),b=v({module:"session"});function R(t){return y(t,".swifty","sessions")}function Ie(t,e){return y(R(t),e+".jsonl")}function Ae(){let t=Date.now().toString(36),e=z(4).toString("hex");return`${t}-${e}`}function Q(t,e,o){let s=R(t);J(s,{recursive:!0});let n=y(s,`${e}.jsonl`),r=JSON.stringify(o)+`
|
|
22
|
+
`;H(n,r,{flag:"a",encoding:"utf-8"})}function Ee(t,e,o){Q(t,e,{role:"system",content:JSON.stringify(o),timestamp:Math.floor(Date.now()/1e3),type:S})}function Ne(t,e){let o=y(R(t),`${e}.jsonl`);if(!A(o))return[];let s=[];for(let n of I(o,"utf-8").split(`
|
|
23
|
+
`))if(n.trim())try{let r=JSON.parse(n),{success:l,data:a,error:c}=x(B,r);l?!a.content&&!(a.tool_uses?.length??0)&&!(a.tool_results?.length??0)||s.push(a):b.error({err:c},"session operation failed")}catch(r){b.error({err:r},"session operation failed")}return s}function j(t){return t?.map(e=>({toolUseId:e.tool_use_id,toolName:e.tool_name,arguments:e.arguments}))}function F(t){return t?.map(e=>({toolUseId:e.tool_use_id,content:e.content,isError:e.is_error}))}function Be(t){let e=-1;for(let s=t.length-1;s>=0;s--)if(t[s].type===S){e=s;break}let o=[];if(e>=0){let s=null;try{let n=t[e].content,r=typeof n=="string"?JSON.parse(n):null;s=M(V,r)}catch{s=null}if(s){let n=`This session continues from a previous conversation, which has been compressed due to context limitations. Here is a summary of the earlier messages:
|
|
24
24
|
|
|
25
25
|
`+s.summary;s.keep.length>0&&(n+=`
|
|
26
26
|
|
|
27
|
-
Recent messages have been preserved verbatim.`),o.push({role:"user",content:n});for(let r of s.keep)r.role!=="user"&&r.role!=="assistant"||!r.content&&!(r.tool_uses?.length??0)&&!(r.tool_results?.length??0)||o.push({role:r.role,content:r.content,toolUses:j(r.tool_uses),toolResults:F(r.tool_results)})}for(let n=e+1;n<t.length;n++){let r=t[n];if(r.type===S)continue;let l=P(r);l&&o.push(l)}return o}for(let s of t){let n=P(s);n&&o.push(n)}return o}function P(t){return t.role!=="user"&&t.role!=="assistant"||!t.content&&!(t.tool_uses?.length??0)&&!(t.tool_results?.length??0)?null:{role:t.role,content:t.content,toolUses:j(t.tool_uses),toolResults:F(t.tool_results)}}function
|
|
28
|
-
`)){if(!d.trim())continue;let m;try{let g=JSON.parse(d);m=M(B,g)}catch(g){b.error({err:g},"session operation failed");continue}u++,!c&&m.role==="user"&&m.content&&(c=
|
|
27
|
+
Recent messages have been preserved verbatim.`),o.push({role:"user",content:n});for(let r of s.keep)r.role!=="user"&&r.role!=="assistant"||!r.content&&!(r.tool_uses?.length??0)&&!(r.tool_results?.length??0)||o.push({role:r.role,content:r.content,toolUses:j(r.tool_uses),toolResults:F(r.tool_results)})}for(let n=e+1;n<t.length;n++){let r=t[n];if(r.type===S)continue;let l=P(r);l&&o.push(l)}return o}for(let s of t){let n=P(s);n&&o.push(n)}return o}function P(t){return t.role!=="user"&&t.role!=="assistant"||!t.content&&!(t.tool_uses?.length??0)&&!(t.tool_results?.length??0)?null:{role:t.role,content:t.content,toolUses:j(t.tool_uses),toolResults:F(t.tool_results)}}function Oe(t){let e=R(t);if(!A(e))return[];let o=W(e).filter(n=>n.endsWith(".jsonl")),s=[];for(let n of o){let r=y(e,n),l=X(r),a=n.replace(".jsonl",""),c="",u=0;try{for(let d of I(r,"utf-8").split(`
|
|
28
|
+
`)){if(!d.trim())continue;let m;try{let g=JSON.parse(d);m=M(B,g)}catch(g){b.error({err:g},"session operation failed");continue}u++,!c&&m.role==="user"&&m.content&&(c=p(m.content).slice(0,100))}}catch(d){b.error({err:d},"session operation failed");continue}s.push({id:a,firstMessage:c,messageCount:u,size:l.size,modTime:l.mtime})}return s.sort((n,r)=>r.modTime.getTime()-n.modTime.getTime()),s}var D=3,Z=3,ee="[earlier conversation truncated for compaction retry]",te=3.5,oe=1e4,se=5,ne=4e4,re=2,ie=2e4,ae=13e3,le=3e3;function $(t,e,o=!1){return t-Math.min(e,ie)-(o?le:ae)}var q=class{consecutiveFailures=0},ce=7e3;function Y(t){if(typeof t=="string")return t.length;let e=0;for(let o of t)o.type==="text"?e+=U(o,"text").length:o.type==="image"&&(e+=ce);return e}function w(t){let e=0;for(let o of t){if(e+=Y(o.content),o.toolUses&&(e+=JSON.stringify(o.toolUses).length),o.toolResults)for(let s of o.toolResults)e+=Y(s.content);if(o.thinkingBlocks)for(let s of o.thinkingBlocks)e+=s.thinking.length}return Math.ceil(e/te)}function ue(t){return w(t.getMessages())}function C(t){return w([t])}function de(t){return t.role==="user"&&!!t.toolResults&&t.toolResults.length>0}function me(t){let e=0,o=0,s=t.length;for(let n=t.length-1;n>=0;n--){let r=C(t[n]);if(o>0&&e+r>ne||(s=n,e+=r,o++,e>=oe||o>=se))break}return s=he(t,s),s}function he(t,e){if(e<=0||e>=t.length||!de(t[e]))return e;let o=new Set((t[e].toolResults??[]).map(s=>s.toolUseId));for(let s=e-1;s>=0;s--){let n=t[s];if(n.role==="assistant"&&n.toolUses?.some(r=>o.has(r.toolUseId)))return s}return e}function ge(t,e){let o=e??t.usageAnchorState();if(!o)return ue(t);let s=t.getMessages(),n=Math.min(o.anchorCount,s.length);return o.baselineTokens+w(s.slice(n))}async function $e(t,e,o,s,n,r,l,a,c=""){let u=ge(t),d=$(o,s),m=$(o,s,!0);if(u<d)return{compacted:!1,message:""};if(!(u>=m)&&n.consecutiveFailures>=D)return{compacted:!1,message:`Auto-compact circuit breaker: ${String(D)} consecutive failures`};try{let f=await K(t,e,r,l,a,c);return n.consecutiveFailures=0,f}catch(f){return n.consecutiveFailures++,{compacted:!1,message:`Auto-compact failed: ${_(f)}`}}}async function qe(t,e,o,s,n,r=""){return K(t,e,o,s,n,r)}var fe=`Your task is to create a detailed summary of the conversation so far, paying close attention to the user's explicit requests and your previous actions.
|
|
29
29
|
This summary should be thorough in capturing technical details, code patterns, and architectural decisions that would be essential for continuing development work without losing context.
|
|
30
30
|
|
|
31
31
|
Before providing your final summary, wrap your analysis in <analysis> tags to organize your thoughts and ensure you've covered all necessary points. In your analysis process:
|
|
@@ -110,7 +110,7 @@ Here's an example of how your output should be structured:
|
|
|
110
110
|
|
|
111
111
|
Please provide your summary based on the conversation so far, following this structure and ensuring precision and thoroughness in your response.`;function pe(t){return fe+`
|
|
112
112
|
|
|
113
|
-
`+t}function ye(t){let e=[],o=[],s=!1;for(let n of t)n.role==="assistant"&&s&&o.length>0&&(e.push(o),o=[]),o.push(n),s=!!(n.toolResults&&n.toolResults.length>0);return o.length>0&&e.push(o),e}function Te(t,e){let o=ye(t);if(o.length<2)return null;let s;if(e>0){let r=0;s=0;for(let l of o)if(r+=l.reduce((a,c)=>a+C(c),0),s++,r>=e)break}else s=Math.max(1,Math.floor(o.length/5));if(s=Math.min(s,o.length-1),s<1)return null;let n=o.slice(s).flat();return n.length>0&&n[0].role!=="user"&&n.unshift({role:"user",content:ee}),n}function be(t){return t.map(e=>{let o=`[${e.role}]: ${
|
|
113
|
+
`+t}function ye(t){let e=[],o=[],s=!1;for(let n of t)n.role==="assistant"&&s&&o.length>0&&(e.push(o),o=[]),o.push(n),s=!!(n.toolResults&&n.toolResults.length>0);return o.length>0&&e.push(o),e}function Te(t,e){let o=ye(t);if(o.length<2)return null;let s;if(e>0){let r=0;s=0;for(let l of o)if(r+=l.reduce((a,c)=>a+C(c),0),s++,r>=e)break}else s=Math.max(1,Math.floor(o.length/5));if(s=Math.min(s,o.length-1),s<1)return null;let n=o.slice(s).flat();return n.length>0&&n[0].role!=="user"&&n.unshift({role:"user",content:ee}),n}function be(t){return t.map(e=>{let o=`[${e.role}]: ${p(e.content)}`;return e.toolUses&&(o+=`
|
|
114
114
|
[tools: ${e.toolUses.map(s=>s.toolName).join(", ")}]`),o}).join(`
|
|
115
115
|
|
|
116
116
|
`)}async function Re(t,e,o){let s=e;for(let n=0;;n++){let r=be(s),l=new T;l.addUserMessage(pe(r));try{let a="",c=t.stream(l,o);for await(let d of c)d.type==="text_delta"&&(a+=d.text);let u=/<summary>([\s\S]*?)<\/summary>/.exec(a);return u?u[1].trim():a}catch(a){let c=a instanceof Error?a.message.toLowerCase():"";if(!(c.includes("prompt")&&c.includes("long")||c.includes("too many")||c.includes("context_length"))||n>=Z)throw a;let d=s.reduce((g,f)=>g+C(f),0)/5,m=Te(s,d);if(!m)throw a;s=m}}}async function K(t,e,o,s,n,r=""){let l=t.getMessages(),a=me(l);if(a<=0||a<re)return{compacted:!1,message:`Compaction skipped: only ${String(a)} message(s) to summarize, kept verbatim`};let c=l.slice(0,a),u=l.slice(a),d=await Re(e,c,n),m=o?o.buildRecoveryAttachment(s):"",g=`This session continues from a previous conversation, which has been compressed due to context limitations. Here is a summary of the earlier messages:
|
|
@@ -123,4 +123,4 @@ If you need specific details from before compaction (code snippets, error messag
|
|
|
123
123
|
|
|
124
124
|
---
|
|
125
125
|
|
|
126
|
-
${m}`),t.replaceWithCompacted(g,u);let f=u.filter(h=>(h.role==="user"||h.role==="assistant")&&(h.content||(h.toolUses?.length??0)||(h.toolResults?.length??0))).map(h=>({role:h.role,content:h.content,...h.toolUses?.length?{tool_uses:O(h.toolUses)}:{},...h.toolResults?.length?{tool_results:L(h.toolResults)}:{}}));return{compacted:!0,message:`Compacted ${String(c.length)} messages into summary (${String(d.length)} chars), kept ${String(u.length)} recent messages verbatim`,boundary:{summary:d,keep:f}}}export{T as a,O as b,L as c,
|
|
126
|
+
${m}`),t.replaceWithCompacted(g,u);let f=u.filter(h=>(h.role==="user"||h.role==="assistant")&&(h.content||(h.toolUses?.length??0)||(h.toolResults?.length??0))).map(h=>({role:h.role,content:h.content,...h.toolUses?.length?{tool_uses:O(h.toolUses)}:{},...h.toolResults?.length?{tool_results:L(h.toolResults)}:{}}));return{compacted:!0,message:`Compacted ${String(c.length)} messages into summary (${String(d.length)} chars), kept ${String(u.length)} recent messages verbatim`,boundary:{summary:d,keep:f}}}export{T as a,O as b,L as c,Ie as d,Ae as e,Q as f,Ee as g,Ne as h,Be as i,Oe as j,$ as k,q as l,$e as m,qe as n};
|