tabby-opencode-status 0.1.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.
- package/README.md +55 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -0
package/README.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# tabby-opencode-status
|
|
2
|
+
|
|
3
|
+
Native [Tabby](https://tabby.sh) plugin: tab color, progress bar, title emoji,
|
|
4
|
+
and activity dot follow the [opencode](https://opencode.ai) session status.
|
|
5
|
+
Includes **session restore**: tabs running opencode are recorded and can be
|
|
6
|
+
reopened with `opencode --continue` after a Tabby restart.
|
|
7
|
+
|
|
8
|
+
Companion: [`opencode-tabby-status`](../opencode-tabby-status) (the opencode
|
|
9
|
+
side, writes `$TMPDIR/tabby-claude-status.d/*.json`).
|
|
10
|
+
|
|
11
|
+
## Status mapping
|
|
12
|
+
|
|
13
|
+
| opencode | tab | default color |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| working ⚡ | color + indeterminate progress | orange `#ffa500` |
|
|
16
|
+
| needs input ❓ | color + activity dot + bell | gold `#ffd700` |
|
|
17
|
+
| done ✅ | color flash | green `#50c878` |
|
|
18
|
+
| error ❌ | color + activity dot | red `#ff5050` |
|
|
19
|
+
| idle 🌱 | default | — |
|
|
20
|
+
|
|
21
|
+
## Install
|
|
22
|
+
|
|
23
|
+
From npm — in Tabby: **Settings → Plugins**, search `tabby-opencode-status`,
|
|
24
|
+
install, then fully restart Tabby. Configure under **Settings → Opencode
|
|
25
|
+
Status** (surfaces, colors, auto-resume, resume command).
|
|
26
|
+
|
|
27
|
+
From a clone (development):
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
npm install
|
|
31
|
+
npm run install-plugin # build dist/ + copy into Tabby's plugin dir
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Restart Tabby.
|
|
35
|
+
|
|
36
|
+
## Session restore
|
|
37
|
+
|
|
38
|
+
While running, the bridge records every tab whose PTY process tree contains
|
|
39
|
+
`opencode` (cwd + title) into `opencodeStatus.sessions` in the Tabby config.
|
|
40
|
+
Settings → Opencode Status lists them with per-row Resume / Forget, plus
|
|
41
|
+
"Resume all now". With auto-resume on, all saved sessions reopen ~on boot at
|
|
42
|
+
their recorded cwd with the resume command (default `opencode --continue`).
|
|
43
|
+
|
|
44
|
+
## Develop
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
npm test # typecheck + framework-free logic tests
|
|
48
|
+
npm run build # UMD bundle in dist/ (Tabby/Angular externals)
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
`src/interfaces`, `src/services`, `src/decorator`, `src/tabby/sessionTracker.ts`
|
|
52
|
+
are framework-free and covered by `test/run.ts`. `src/tabby/*.service|module|component`
|
|
53
|
+
integrate with Tabby APIs (`terminus-core`, `terminus-terminal`,
|
|
54
|
+
`terminus-settings`, `tabby-local`); `src/tabby/ambient.d.ts` pins the exact
|
|
55
|
+
consumed surface against Tabby 1.0.231 typings — re-check it when retargeting.
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e(require("@angular/common"),require("@angular/core"),require("@angular/forms"),require("terminus-core"),require("terminus-settings"),require("terminus-terminal"));else if("function"==typeof define&&define.amd)define(["@angular/common","@angular/core","@angular/forms","terminus-core","terminus-settings","terminus-terminal"],e);else{var s="object"==typeof exports?e(require("@angular/common"),require("@angular/core"),require("@angular/forms"),require("terminus-core"),require("terminus-settings"),require("terminus-terminal")):e(t["@angular/common"],t["@angular/core"],t["@angular/forms"],t["terminus-core"],t["terminus-settings"],t["terminus-terminal"]);for(var o in s)("object"==typeof exports?exports:t)[o]=s[o]}}(global,(t,e,s,o,i,r)=>(()=>{"use strict";var n={87(t,e){e.OpencodeStatusDecorator=void 0,e.OpencodeStatusDecorator=class{constructor(t){this.config=t,this.tabs=new Map,this.pidIndex=new Map}setConfig(t){this.config=t}reapply(){for(const[t,e]of this.tabs)e.status&&this.apply(t,e.status)}attachTab(t,e){this.tabs.set(t,{ptyPid:e,baseTitle:this.stripEmoji(t.title),emoji:"",status:null}),t.onTitleFromTerminal(e=>{const s=this.tabs.get(t);if(!s)return;const o=this.stripEmoji(e),i=s.emoji?`${s.emoji} ${s.baseTitle}`:s.baseTitle;o!==s.baseTitle?(s.baseTitle=o,s.emoji&&t.setTitle(`${s.emoji} ${o}`)):s.emoji&&e!==i&&t.setTitle(i)})}detachTab(t){this.clear(t),this.tabs.delete(t),this.rebuildIndex()}registerPid(t,e){let s=this.pidIndex.get(t);s||this.pidIndex.set(t,s=new Set),s.add(e)}rebuildIndex(){this.pidIndex.clear()}route(t,e,s){for(const[o,i]of this.tabs){const r=new Set([i.ptyPid,...s(i.ptyPid)]);e.some(t=>r.has(t))&&this.apply(o,t)}}apply(t,e){const s=this.tabs.get(t);if(!s)return;s.status=e;const o=this.config;t.color=o.showTabColor&&"idle"!==e?o.colors[e]:null,t.setProgress(o.showProgress&&"working"===e?.5:null),!o.showActivityDot||"question"!==e&&"error"!==e?t.clearActivity():t.displayActivity(),s.emoji=o.showTitleEmoji?o.emoji[e]:"",t.setTitle(s.emoji?`${s.emoji} ${s.baseTitle}`:s.baseTitle)}clear(t){const e=this.tabs.get(t);t.color=null,t.setProgress(null),t.clearActivity(),e&&(e.emoji="",t.setTitle(e.baseTitle))}stripEmoji(t){for(const e of Object.values(this.config.emoji))if(e){if(t===e)return"";if(t.startsWith(e)){const s=t.slice(e.length),o=/^[\uFE0F\s]+/u.exec(s);if(o)return s.slice(o[0].length)}}return t}}},19(t,e){e.DEFAULT_CONFIG=void 0,e.statusForEvent=function(t){switch(t){case"PreToolUse":case"PostToolUse":case"UserPromptSubmit":return"working";case"Notification":case"PermissionRequest":return"question";case"Stop":return"done";case"PostToolUseFailure":return"error";default:return"idle"}},e.DEFAULT_CONFIG={colors:{working:"#ffa500",question:"#ffd700",done:"#50c878",error:"#ff5050"},emoji:{working:"⚡",question:"❓",done:"✅",error:"❌",idle:"🌱"},showTabColor:!0,showTitleEmoji:!1,showProgress:!1,showActivityDot:!1,spoolDir:"",pollMs:3e3}},41(t,e,s){var o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.StatusFileService=void 0,e.parseSpoolFile=c;const i=o(s(896)),r=o(s(857)),n=o(s(928)),a=s(19);function c(t){try{const e=JSON.parse(t);return e.event&&Array.isArray(e.ancestors)?{status:(0,a.statusForEvent)(e.event),session:e.session||"",ancestors:e.ancestors,cwd:e.cwd||""}:null}catch{return null}}e.StatusFileService=class{constructor(t=n.default.join(r.default.tmpdir(),"tabby-claude-status.d"),e=500){this.spoolDir=t,this.pollMs=e,this.timer=null}start(t){this.stop(),this.timer=setInterval(()=>this.drain(t),this.pollMs)}stop(){this.timer&&clearInterval(this.timer),this.timer=null}drain(t){let e;try{e=i.default.readdirSync(this.spoolDir)}catch{return}for(const s of e){if(!s.endsWith(".json"))continue;const e=n.default.join(this.spoolDir,s);let o;try{o=i.default.readFileSync(e,"utf8")}catch{continue}let r=!1;const a=c(o);if(a)try{r=!0===t(a)}catch{r=!1}let l=null===a;if(!l)try{l=Date.now()-i.default.statSync(e).mtimeMs>15e3}catch{l=!0}if(r||l)try{i.default.rmSync(e)}catch{}}}}},762(t,e,s){var o,i,r,n=this&&this.__decorate||function(t,e,s,o){var i,r=arguments.length,n=r<3?e:null===o?o=Object.getOwnPropertyDescriptor(e,s):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(t,e,s,o);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(n=(r<3?i(n):r>3?i(e,s,n):i(e,s))||n);return r>3&&n&&Object.defineProperty(e,s,n),n},a=this&&this.__metadata||function(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)},c=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.OpencodeStatusBridge=void 0;const l=s(860),u=s(767),d=s(344),f=c(s(896)),h=c(s(857)),p=c(s(928)),g=s(41),m=s(87),b=s(19),v=s(86),y=/(^|[/\\])opencode(\s|$)/,S=p.default.join(h.default.tmpdir(),"tabby-opencode-status.debug.json"),w=[];function j(t){try{let e={};try{e=JSON.parse(f.default.readFileSync(S,"utf8"))}catch{}f.default.writeFileSync(S,JSON.stringify({...e,...t,ts:Date.now()},null,2))}catch{}}let T=class{constructor(t,e,s){this.app=t,this.config=e,this.injector=s,this.spool=null,this.decorator=new m.OpencodeStatusDecorator({...b.DEFAULT_CONFIG}),this.tracker=new v.SessionTracker,this.tracked=new Map,this.timer=null,this.configSub=null,this.lastConfigKey="",this.tickCount=0,this.resumed=!1,this.trackerDirty=!1,this.terminalSvc=void 0}start(){this.stop(),this.decorator=new m.OpencodeStatusDecorator(this.pluginConfig());const t=this.pluginConfig();this.spool=new g.StatusFileService(t.spoolDir||void 0,t.pollMs),this.tracker.load(this.config.store?.opencodeStatus?.sessions??null),this.timer=setInterval(()=>{this.tick().catch(()=>{})},t.pollMs);try{const t=this.config.changed$;this.configSub=t?.subscribe(()=>this.onConfigChanged())??null}catch{this.configSub=null}j({started:!0,pollMs:t.pollMs,showTabColor:t.showTabColor,showTitleEmoji:t.showTitleEmoji,showProgress:t.showProgress,showActivityDot:t.showActivityDot,colors:t.colors,emoji:t.emoji})}stop(){this.timer&&clearInterval(this.timer),this.timer=null;try{this.configSub?.unsubscribe()}catch{}this.configSub=null;for(const t of[...this.tracked.keys()])this.detach(t)}onConfigChanged(){this.syncConfig()}syncConfig(){const t=this.pluginConfig(),e=JSON.stringify([t.showTabColor,t.showTitleEmoji,t.showProgress,t.showActivityDot,t.colors,t.emoji]);e!==this.lastConfigKey&&(this.lastConfigKey=e,this.decorator.setConfig(t),this.decorator.reapply(),j({configSynced:!0,showTabColor:t.showTabColor,showTitleEmoji:t.showTitleEmoji,showProgress:t.showProgress,showActivityDot:t.showActivityDot}))}getSessions(){return this.tracker.list()}forgetSession(t){this.tracker.forget(t),this.saveTracker()}async resumeSession(t){await this.openRecord(t,this.pluginConfig().resumeCommand)}async resumeAllSessions(){const t=this.pluginConfig().resumeCommand;for(const e of this.tracker.list())await this.openRecord(e,t)}pluginConfig(){const t=this.config.store?.opencodeStatus??{};return{...b.DEFAULT_CONFIG,spoolDir:"",pollMs:3e3,autoResume:!1,resumeCommand:"opencode --continue",sessions:[],...t,colors:{...b.DEFAULT_CONFIG.colors,...t.colors??{}},emoji:{...b.DEFAULT_CONFIG.emoji,...t.emoji??{}}}}async tick(){this.tickCount++,this.syncConfig(),this.discover(),j({tick:this.tickCount,tabs:this.allTabs().length,trackedCount:this.tracked.size}),this.tickCount%10==1&&await this.refreshProcs(),this.spool?.drain(t=>this.route(t)),this.resumed||(this.resumed=!0,this.pluginConfig().autoResume&&await this.resumeAllSessions()),this.trackerDirty&&this.tickCount%10==0&&this.saveTracker()}allTabs(){const t=[];for(const e of this.app.tabs??[])e instanceof u.SplitTabComponent?t.push(...e.getAllTabs()):t.push(e);return t}discover(){const t=new Set;for(const e of this.allTabs()){if(t.add(e),this.tracked.has(e)||!(e instanceof d.BaseTerminalTabComponent))continue;const{like:s,dispose:o}=this.adapt(e);this.decorator.attachTab(s,0),this.tracked.set(e,{terminal:e,adapter:s,disposeAdapter:o,procs:new Map}),e.destroyed$.subscribe(()=>this.detach(e)),e.sessionChanged$?.subscribe(()=>{this.refreshTab(e).catch(()=>{})})}for(const e of[...this.tracked.keys()])t.has(e)||this.detach(e)}detach(t){const e=this.tracked.get(t);e&&(this.decorator.clear(e.adapter),e.disposeAdapter(),this.tracked.delete(t))}adapt(t){const e=t.titleChange$.subscribe(t=>s?.(t));let s=null;return{like:{get color(){return t.color},set color(e){t.color=e},get title(){return t.title},setProgress:e=>t.setProgress(e),setTitle:e=>t.setTitle(e),displayActivity:()=>t.displayActivity(),clearActivity:()=>t.clearActivity(),onTitleFromTerminal:t=>{s=t}},dispose:()=>e.unsubscribe()}}async childProcs(t){const e=new Map;try{const s=t.session?.pty,o=await(s?.getChildProcesses?.());for(const t of o??[]){const s="number"==typeof t?.pid?t.pid:parseInt(String(t?.pid??""),10);Number.isFinite(s)&&e.set(s,t.command||"")}const i=await(s?.getTruePID?.()),r="number"==typeof i?i:parseInt(String(i??""),10);Number.isFinite(r)&&!e.has(r)&&e.set(r,await this.commandOf(r))}catch{}return e}async commandOf(t){try{return(await f.default.promises.readFile(`/proc/${t}/cmdline`,"utf8")).split("\0")[0]||""}catch{return""}}async refreshProcs(){for(const[t,e]of this.tracked)e.procs=await this.childProcs(e.terminal),await this.trackTab(t,e);j({tracked:[...this.tracked.values()].map(t=>({title:t.terminal.title??"",procs:[...t.procs.entries()].map(([t,e])=>`${t}:${e}`)}))})}async refreshTab(t){const e=this.tracked.get(t);e&&(e.procs=await this.childProcs(e.terminal),await this.trackTab(t,e))}async trackTab(t,e){if(![...e.procs.values()].some(t=>y.test(t)))return;let s="";try{s=await(e.terminal.session?.getWorkingDirectory?.())||""}catch{}s&&(this.tracker.note(s,t.title),this.trackerDirty=!0)}route(t){const e=new Set(t.ancestors.map(t=>String(t))),s=[];for(const o of this.tracked.values())[...o.procs.keys()].some(t=>e.has(String(t)))&&(s.push(o.terminal.title??""),this.decorator.apply(o.adapter,t.status));return w.push({ts:Date.now(),status:t.status,ancestors:t.ancestors,hits:s}),w.length>20&&w.shift(),j({lastRoute:{status:t.status,ancestors:t.ancestors,hits:s},routes:w}),s.length>0}saveTracker(){var t;this.trackerDirty=!1,(t=this.config).store??(t.store={}),this.config.store.opencodeStatus||(this.config.store.opencodeStatus={}),this.config.store.opencodeStatus.sessions=this.tracker.list(),this.config.save()}getTerminalService(){if(void 0!==this.terminalSvc)return this.terminalSvc;this.terminalSvc=null;try{const t=globalThis.require,e=t?.("tabby-local"),s=e?.TerminalService;if(s)try{this.terminalSvc=this.injector.get(s,null)}catch{}}catch{}return this.terminalSvc}async openRecord(t,e){const s=this.getTerminalService();if(!s)return;let o=null;try{o=await s.openTab(void 0,t.cwd)}catch{return}for(let t=0;t<40;t++){const t=o?.session;if(t)break;await new Promise(t=>setTimeout(t,250))}try{await(o.sendInput?.(`${e}\n`))}catch{}}};e.OpencodeStatusBridge=T,e.OpencodeStatusBridge=T=n([(0,l.Injectable)(),a("design:paramtypes",["function"==typeof(o=void 0!==u.AppService&&u.AppService)?o:Object,"function"==typeof(i=void 0!==u.ConfigService&&u.ConfigService)?i:Object,"function"==typeof(r=void 0!==l.Injector&&l.Injector)?r:Object])],T)},849(t,e,s){var o=this&&this.__decorate||function(t,e,s,o){var i,r=arguments.length,n=r<3?e:null===o?o=Object.getOwnPropertyDescriptor(e,s):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(t,e,s,o);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(n=(r<3?i(n):r>3?i(e,s,n):i(e,s))||n);return r>3&&n&&Object.defineProperty(e,s,n),n};Object.defineProperty(e,"__esModule",{value:!0}),e.OpencodeStatusConfigProvider=void 0;const i=s(860),r=s(767),n=s(19);let a=class extends r.ConfigProvider{constructor(){super(...arguments),this.defaults={opencodeStatus:{...n.DEFAULT_CONFIG,spoolDir:"",pollMs:500,autoResume:!1,resumeCommand:"opencode --continue",sessions:[]}},this.platformDefaults={}}};e.OpencodeStatusConfigProvider=a,e.OpencodeStatusConfigProvider=a=o([(0,i.Injectable)()],a)},716(t,e,s){var o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var i=s(178);Object.defineProperty(e,"default",{enumerable:!0,get:function(){return o(i).default}})},178(t,e,s){var o,i,r=this&&this.__createBinding||(Object.create?function(t,e,s,o){void 0===o&&(o=s);var i=Object.getOwnPropertyDescriptor(e,s);i&&!("get"in i?!e.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return e[s]}}),Object.defineProperty(t,o,i)}:function(t,e,s,o){void 0===o&&(o=s),t[o]=e[s]}),n=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),a=this&&this.__decorate||function(t,e,s,o){var i,r=arguments.length,n=r<3?e:null===o?o=Object.getOwnPropertyDescriptor(e,s):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(t,e,s,o);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(n=(r<3?i(n):r>3?i(e,s,n):i(e,s))||n);return r>3&&n&&Object.defineProperty(e,s,n),n},c=this&&this.__importStar||(o=function(t){return o=Object.getOwnPropertyNames||function(t){var e=[];for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&(e[e.length]=s);return e},o(t)},function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var s=o(t),i=0;i<s.length;i++)"default"!==s[i]&&r(e,t,s[i]);return n(e,t),e}),l=this&&this.__metadata||function(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)},u=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});const d=s(860),f=s(358),h=s(182),p=c(s(767)),g=s(85),m=u(s(896)),b=u(s(857)),v=u(s(928)),y=s(762),S=s(849),w=s(193),j=s(797);function T(t){try{m.default.writeFileSync(v.default.join(b.default.tmpdir(),"tabby-opencode-status.marker.json"),JSON.stringify({ts:Date.now(),...t}))}catch{}}let O=class{constructor(t){try{t.start(),T({loaded:!0})}catch(t){T({loaded:!1,error:String(t),stack:t?.stack})}}};O=a([(0,d.NgModule)({imports:[f.CommonModule,h.FormsModule,p.default],providers:[y.OpencodeStatusBridge,{provide:p.ConfigProvider,useClass:S.OpencodeStatusConfigProvider,multi:!0},{provide:g.SettingsTabProvider,useClass:j.OpencodeStatusSettingsTabProvider,multi:!0}],declarations:[w.OpencodeStatusSettingsTabComponent]}),l("design:paramtypes",["function"==typeof(i=void 0!==y.OpencodeStatusBridge&&y.OpencodeStatusBridge)?i:Object])],O),e.default=O,T({phase:"import"})},86(t,e){e.SessionTracker=void 0,e.SessionTracker=class{constructor(){this.records=new Map}note(t,e,s=Date.now()){t&&this.records.set(t,{cwd:t,title:e||t,lastSeen:s})}forget(t){this.records.delete(t)}list(){return[...this.records.values()].sort((t,e)=>e.lastSeen-t.lastSeen)}prune(t,e=Date.now()){for(const[s,o]of this.records)e-o.lastSeen>t&&this.records.delete(s)}serialize(){return JSON.stringify(this.list())}load(t){if(this.records.clear(),"string"!=typeof t)this.loadParsed(t);else try{this.loadParsed(JSON.parse(t))}catch{}}loadParsed(t){if(Array.isArray(t))for(const e of t)e&&"string"==typeof e.cwd&&e.cwd&&this.records.set(e.cwd,{cwd:e.cwd,title:"string"==typeof e.title?e.title:e.cwd,lastSeen:"number"==typeof e.lastSeen?e.lastSeen:0})}}},193(t,e,s){var o,i,r=this&&this.__decorate||function(t,e,s,o){var i,r=arguments.length,n=r<3?e:null===o?o=Object.getOwnPropertyDescriptor(e,s):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(t,e,s,o);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(n=(r<3?i(n):r>3?i(e,s,n):i(e,s))||n);return r>3&&n&&Object.defineProperty(e,s,n),n},n=this&&this.__metadata||function(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)};Object.defineProperty(e,"__esModule",{value:!0}),e.OpencodeStatusSettingsTabComponent=void 0;const a=s(860),c=s(767),l=s(762);let u=class{constructor(t,e){this.config=t,this.bridge=e}save(){this.config.save()}};e.OpencodeStatusSettingsTabComponent=u,e.OpencodeStatusSettingsTabComponent=u=r([(0,a.Component)({selector:"opencode-status-settings",template:'\n<h3>Opencode Status</h3>\n<div class="form-group">\n <label>Tab color on status change</label>\n <toggle [(ngModel)]="config.store.opencodeStatus.showTabColor" (ngModelChange)="save()"></toggle>\n</div>\n<div class="form-group">\n <label>Title emoji prefix</label>\n <toggle [(ngModel)]="config.store.opencodeStatus.showTitleEmoji" (ngModelChange)="save()"></toggle>\n</div>\n<div class="form-group">\n <label>Progress bar while working</label>\n <toggle [(ngModel)]="config.store.opencodeStatus.showProgress" (ngModelChange)="save()"></toggle>\n</div>\n<div class="form-group">\n <label>Activity dot when input is needed</label>\n <toggle [(ngModel)]="config.store.opencodeStatus.showActivityDot" (ngModelChange)="save()"></toggle>\n</div>\n<div class="form-group">\n <label>Auto-resume saved sessions on Tabby launch</label>\n <toggle [(ngModel)]="config.store.opencodeStatus.autoResume" (ngModelChange)="save()"></toggle>\n</div>\n<div class="form-group">\n <label>Resume command</label>\n <input class="form-control" [(ngModel)]="config.store.opencodeStatus.resumeCommand" (ngModelChange)="save()" />\n</div>\n<h4 class="mt-3">Saved opencode sessions</h4>\n<div class="form-group">\n <button class="btn btn-outline-primary" (click)="bridge.resumeAllSessions()">Resume all now</button>\n</div>\n<div class="list-group">\n <div class="list-group-item d-flex align-items-center" *ngFor="let s of bridge.getSessions()">\n <div class="mr-auto"><div>{{s.title}}</div><div class="text-muted">{{s.cwd}}</div></div>\n <button class="btn btn-outline-info ml-2" (click)="bridge.resumeSession(s)">Resume</button>\n <button class="btn btn-outline-danger ml-1" (click)="bridge.forgetSession(s.cwd)">Forget</button>\n </div>\n</div>\n '}),n("design:paramtypes",["function"==typeof(o=void 0!==c.ConfigService&&c.ConfigService)?o:Object,"function"==typeof(i=void 0!==l.OpencodeStatusBridge&&l.OpencodeStatusBridge)?i:Object])],u)},797(t,e,s){var o=this&&this.__decorate||function(t,e,s,o){var i,r=arguments.length,n=r<3?e:null===o?o=Object.getOwnPropertyDescriptor(e,s):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(t,e,s,o);else for(var a=t.length-1;a>=0;a--)(i=t[a])&&(n=(r<3?i(n):r>3?i(e,s,n):i(e,s))||n);return r>3&&n&&Object.defineProperty(e,s,n),n};Object.defineProperty(e,"__esModule",{value:!0}),e.OpencodeStatusSettingsTabProvider=void 0;const i=s(860),r=s(85),n=s(193);let a=class extends r.SettingsTabProvider{constructor(){super(...arguments),this.id="opencode-status",this.title="Opencode Status"}getComponentType(){return n.OpencodeStatusSettingsTabComponent}};e.OpencodeStatusSettingsTabProvider=a,e.OpencodeStatusSettingsTabProvider=a=o([(0,i.Injectable)()],a)},896(t){t.exports=require("fs")},857(t){t.exports=require("os")},928(t){t.exports=require("path")},358(e){e.exports=t},860(t){t.exports=e},182(t){t.exports=s},767(t){t.exports=o},85(t){t.exports=i},344(t){t.exports=r}};const a={};return function t(e){const s=a[e];if(void 0!==s)return s.exports;const o=a[e]={exports:{}};return n[e].call(o.exports,o,o.exports,t),o.exports}(716)})());
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://tabby-opencode-status/webpack/universalModuleDefinition","webpack://tabby-opencode-status/./src/decorator/opencodeStatusDecorator.ts","webpack://tabby-opencode-status/./src/interfaces/types.ts","webpack://tabby-opencode-status/./src/services/statusFileService.ts","webpack://tabby-opencode-status/./src/tabby/bridge.service.ts","webpack://tabby-opencode-status/./src/tabby/config.provider.ts","webpack://tabby-opencode-status/./src/tabby/index.ts","webpack://tabby-opencode-status/./src/tabby/module.ts","webpack://tabby-opencode-status/./src/tabby/sessionTracker.ts","webpack://tabby-opencode-status/./src/tabby/settingsTab.component.ts","webpack://tabby-opencode-status/./src/tabby/settingsTab.provider.ts","webpack://tabby-opencode-status/external node-commonjs \"fs\"","webpack://tabby-opencode-status/external node-commonjs \"os\"","webpack://tabby-opencode-status/external node-commonjs \"path\"","webpack://tabby-opencode-status/external umd \"@angular/common\"","webpack://tabby-opencode-status/external umd \"@angular/core\"","webpack://tabby-opencode-status/external umd \"@angular/forms\"","webpack://tabby-opencode-status/external umd \"terminus-core\"","webpack://tabby-opencode-status/external umd \"terminus-settings\"","webpack://tabby-opencode-status/external umd \"terminus-terminal\"","webpack://tabby-opencode-status/webpack/bootstrap","webpack://tabby-opencode-status/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@angular/common\"), require(\"@angular/core\"), require(\"@angular/forms\"), require(\"terminus-core\"), require(\"terminus-settings\"), require(\"terminus-terminal\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"@angular/common\", \"@angular/core\", \"@angular/forms\", \"terminus-core\", \"terminus-settings\", \"terminus-terminal\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"@angular/common\"), require(\"@angular/core\"), require(\"@angular/forms\"), require(\"terminus-core\"), require(\"terminus-settings\"), require(\"terminus-terminal\")) : factory(root[\"@angular/common\"], root[\"@angular/core\"], root[\"@angular/forms\"], root[\"terminus-core\"], root[\"terminus-settings\"], root[\"terminus-terminal\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(global, (__WEBPACK_EXTERNAL_MODULE__358__, __WEBPACK_EXTERNAL_MODULE__860__, __WEBPACK_EXTERNAL_MODULE__182__, __WEBPACK_EXTERNAL_MODULE__767__, __WEBPACK_EXTERNAL_MODULE__85__, __WEBPACK_EXTERNAL_MODULE__344__) => {\nreturn ","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OpencodeStatusDecorator = void 0;\nclass OpencodeStatusDecorator {\n constructor(config) {\n this.config = config;\n // ptyPid per tab, supplied by the Tabby wiring (tabby-local session pid).\n this.tabs = new Map();\n // pid -> tabs whose ancestry contains it, rebuilt on attach.\n this.pidIndex = new Map();\n }\n // Swap in a fresh config snapshot (settings toggles) and re-apply the last\n // status so changes take effect without reloading Tabby.\n setConfig(config) {\n this.config = config;\n }\n reapply() {\n for (const [tab, rec] of this.tabs) {\n if (rec.status)\n this.apply(tab, rec.status);\n }\n }\n attachTab(tab, ptyPid) {\n this.tabs.set(tab, { ptyPid, baseTitle: this.stripEmoji(tab.title), emoji: \"\", status: null });\n // NB: Tabby's titleChange$ also fires for OUR setTitle calls, so the\n // callback must be a no-op when the title already has the wanted prefix —\n // otherwise setTitle -> emit -> setTitle loops forever.\n tab.onTitleFromTerminal((title) => {\n const rec = this.tabs.get(tab);\n if (!rec)\n return;\n const base = this.stripEmoji(title);\n const want = rec.emoji ? `${rec.emoji} ${rec.baseTitle}` : rec.baseTitle;\n if (base !== rec.baseTitle) {\n rec.baseTitle = base;\n if (rec.emoji)\n tab.setTitle(`${rec.emoji} ${base}`);\n }\n else if (rec.emoji && title !== want) {\n tab.setTitle(want);\n }\n });\n }\n detachTab(tab) {\n this.clear(tab);\n this.tabs.delete(tab);\n this.rebuildIndex();\n }\n registerPid(pid, tab) {\n let set = this.pidIndex.get(pid);\n if (!set)\n this.pidIndex.set(pid, (set = new Set()));\n set.add(tab);\n }\n rebuildIndex() {\n this.pidIndex.clear();\n }\n // Route one parsed spool event to every tab whose ancestry intersects.\n // ancestorsOf resolves the full parent chain for a pid on this platform.\n route(status, ancestors, ancestorsOf) {\n for (const [tab, rec] of this.tabs) {\n const chain = new Set([rec.ptyPid, ...ancestorsOf(rec.ptyPid)]);\n if (ancestors.some((a) => chain.has(a)))\n this.apply(tab, status);\n }\n }\n apply(tab, status) {\n const rec = this.tabs.get(tab);\n if (!rec)\n return;\n rec.status = status;\n const c = this.config;\n tab.color = c.showTabColor && status !== \"idle\" ? c.colors[status] : null;\n tab.setProgress(c.showProgress && status === \"working\" ? 0.5 : null);\n if (c.showActivityDot && (status === \"question\" || status === \"error\"))\n tab.displayActivity();\n else\n tab.clearActivity();\n rec.emoji = c.showTitleEmoji ? c.emoji[status] : \"\";\n tab.setTitle(rec.emoji ? `${rec.emoji} ${rec.baseTitle}` : rec.baseTitle);\n }\n clear(tab) {\n const rec = this.tabs.get(tab);\n tab.color = null;\n tab.setProgress(null);\n tab.clearActivity();\n if (rec) {\n rec.emoji = \"\";\n tab.setTitle(rec.baseTitle);\n }\n }\n // Strip a known status-emoji prefix. Matched against the configured values\n // (not a char-class regex: astral emoji like 🌱 need the `u` flag to match\n // as whole code points, and config-driven matching stays correct if the\n // emoji set ever changes). Only strips when followed by a separator.\n stripEmoji(title) {\n for (const e of Object.values(this.config.emoji)) {\n if (!e)\n continue;\n if (title === e)\n return \"\";\n if (title.startsWith(e)) {\n const rest = title.slice(e.length);\n const sep = /^[\\uFE0F\\s]+/u.exec(rest);\n if (sep)\n return rest.slice(sep[0].length);\n }\n }\n return title;\n }\n}\nexports.OpencodeStatusDecorator = OpencodeStatusDecorator;\n","\"use strict\";\n// Shared shapes for tabby-opencode-status. Framework-free so the mapping\n// logic stays unit-testable outside Tabby.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_CONFIG = void 0;\nexports.statusForEvent = statusForEvent;\nexports.DEFAULT_CONFIG = {\n colors: {\n working: \"#ffa500\",\n question: \"#ffd700\",\n done: \"#50c878\",\n error: \"#ff5050\",\n },\n emoji: {\n working: \"⚡\",\n question: \"❓\",\n done: \"✅\",\n error: \"❌\",\n idle: \"🌱\",\n },\n showTabColor: true,\n showTitleEmoji: false,\n showProgress: false,\n showActivityDot: false,\n spoolDir: \"\",\n pollMs: 3000,\n};\n// Claude-hook names (also emitted by opencode-tabby-status) -> tab state.\nfunction statusForEvent(event) {\n switch (event) {\n case \"PreToolUse\":\n case \"PostToolUse\":\n case \"UserPromptSubmit\":\n return \"working\";\n case \"Notification\":\n case \"PermissionRequest\":\n return \"question\";\n case \"Stop\":\n return \"done\";\n case \"PostToolUseFailure\":\n return \"error\";\n default:\n return \"idle\";\n }\n}\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StatusFileService = void 0;\nexports.parseSpoolFile = parseSpoolFile;\n// Spool watcher: polls the status dir written by opencode-tabby-status,\n// reads each event file (atomic temp+rename on the writer side) and hands\n// parsed { status, ancestors } to a callback. A file is consumed only when the\n// callback reports it was routed — multiple Tabby windows can share one spool\n// dir, and an unrouted file must stay readable for the window that owns the\n// tab. Unrouted files are swept once stale so they cannot accumulate.\n// Plain TypeScript, no Angular imports — runs under plain node for tests.\nconst fs_1 = __importDefault(require(\"fs\"));\nconst os_1 = __importDefault(require(\"os\"));\nconst path_1 = __importDefault(require(\"path\"));\nconst types_1 = require(\"../interfaces/types\");\n/** Unrouted spool files older than this are discarded (no window wanted them). */\nconst UNROUTED_TTL_MS = 15000;\nfunction parseSpoolFile(raw) {\n try {\n const s = JSON.parse(raw);\n if (!s.event || !Array.isArray(s.ancestors))\n return null;\n return {\n status: (0, types_1.statusForEvent)(s.event),\n session: s.session || \"\",\n ancestors: s.ancestors,\n cwd: s.cwd || \"\",\n };\n }\n catch {\n return null;\n }\n}\nclass StatusFileService {\n constructor(spoolDir = path_1.default.join(os_1.default.tmpdir(), \"tabby-claude-status.d\"), pollMs = 500) {\n this.spoolDir = spoolDir;\n this.pollMs = pollMs;\n this.timer = null;\n }\n start(onStatus) {\n this.stop();\n this.timer = setInterval(() => this.drain(onStatus), this.pollMs);\n }\n stop() {\n if (this.timer)\n clearInterval(this.timer);\n this.timer = null;\n }\n drain(onStatus) {\n let files;\n try {\n files = fs_1.default.readdirSync(this.spoolDir);\n }\n catch {\n return;\n }\n for (const f of files) {\n if (!f.endsWith(\".json\"))\n continue;\n const full = path_1.default.join(this.spoolDir, f);\n let raw;\n try {\n raw = fs_1.default.readFileSync(full, \"utf8\");\n }\n catch {\n continue;\n }\n let routed = false;\n const parsed = parseSpoolFile(raw);\n if (parsed) {\n try {\n routed = onStatus(parsed) === true;\n }\n catch {\n routed = false;\n }\n }\n // Malformed files can never be routed by anyone — drop immediately.\n let stale = parsed === null;\n if (!stale) {\n try {\n stale = Date.now() - fs_1.default.statSync(full).mtimeMs > UNROUTED_TTL_MS;\n }\n catch {\n stale = true;\n }\n }\n if (routed || stale) {\n try {\n fs_1.default.rmSync(full);\n }\n catch {\n // already gone\n }\n }\n }\n }\n}\nexports.StatusFileService = StatusFileService;\n","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar _a, _b, _c;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OpencodeStatusBridge = void 0;\n// Bridge between Tabby and the opencode spool files.\n// - Discovers terminal tabs (flattening splits) and attaches the decorator.\n// - Matches spool events to tabs via PTY child-PID ancestry intersection.\n// - Tracks tabs running opencode for session restore after a Tabby restart.\n//\n// Child PIDs come from the local PTY (`session.pty.getChildProcesses()`),\n// feature-detected at runtime: SSH/serial tabs simply never match.\nconst core_1 = require(\"@angular/core\");\nconst terminus_core_1 = require(\"terminus-core\");\nconst terminus_terminal_1 = require(\"terminus-terminal\");\nconst fs_1 = __importDefault(require(\"fs\"));\nconst os_1 = __importDefault(require(\"os\"));\nconst path_1 = __importDefault(require(\"path\"));\nconst statusFileService_1 = require(\"../services/statusFileService\");\nconst opencodeStatusDecorator_1 = require(\"../decorator/opencodeStatusDecorator\");\nconst types_1 = require(\"../interfaces/types\");\nconst sessionTracker_1 = require(\"./sessionTracker\");\nconst OPENCODE_RE = /(^|[/\\\\])opencode(\\s|$)/;\nconst DEBUG_FILE = path_1.default.join(os_1.default.tmpdir(), \"tabby-opencode-status.debug.json\");\nconst ROUTE_LOG = [];\n// Best-effort diagnostics: after a restart this file shows what the bridge\n// discovered, which pids each tab matched, and how spool events routed.\nfunction debugLog(entry) {\n try {\n let prev = {};\n try {\n prev = JSON.parse(fs_1.default.readFileSync(DEBUG_FILE, \"utf8\"));\n }\n catch {\n // first write\n }\n fs_1.default.writeFileSync(DEBUG_FILE, JSON.stringify({ ...prev, ...entry, ts: Date.now() }, null, 2));\n }\n catch {\n // diagnostics are best-effort\n }\n}\nlet OpencodeStatusBridge = class OpencodeStatusBridge {\n constructor(app, config, injector) {\n this.app = app;\n this.config = config;\n this.injector = injector;\n this.spool = null;\n this.decorator = new opencodeStatusDecorator_1.OpencodeStatusDecorator({ ...types_1.DEFAULT_CONFIG });\n this.tracker = new sessionTracker_1.SessionTracker();\n this.tracked = new Map();\n this.timer = null;\n this.configSub = null;\n this.lastConfigKey = \"\";\n this.tickCount = 0;\n this.resumed = false;\n this.trackerDirty = false;\n this.terminalSvc = undefined;\n }\n start() {\n this.stop();\n this.decorator = new opencodeStatusDecorator_1.OpencodeStatusDecorator(this.pluginConfig());\n const cfg = this.pluginConfig();\n this.spool = new statusFileService_1.StatusFileService(cfg.spoolDir || undefined, cfg.pollMs);\n this.tracker.load(this.config.store?.opencodeStatus?.sessions ?? null);\n this.timer = setInterval(() => {\n this.tick().catch(() => { });\n }, cfg.pollMs);\n // Settings toggles call config.save() -> changed$; re-apply live instead of\n // requiring a Tabby reload for the new flags to take effect.\n try {\n const changed = this.config.changed$;\n this.configSub = changed?.subscribe(() => this.onConfigChanged()) ?? null;\n }\n catch {\n this.configSub = null;\n }\n debugLog({\n started: true,\n pollMs: cfg.pollMs,\n showTabColor: cfg.showTabColor,\n showTitleEmoji: cfg.showTitleEmoji,\n showProgress: cfg.showProgress,\n showActivityDot: cfg.showActivityDot,\n colors: cfg.colors,\n emoji: cfg.emoji,\n });\n }\n stop() {\n if (this.timer)\n clearInterval(this.timer);\n this.timer = null;\n try {\n this.configSub?.unsubscribe();\n }\n catch {\n // ignore\n }\n this.configSub = null;\n for (const tab of [...this.tracked.keys()])\n this.detach(tab);\n }\n onConfigChanged() {\n this.syncConfig();\n }\n // Re-read the live config. The plugin starts before ConfigService has\n // finished loading the store, and settings can change later — so sync on\n // every tick (cheap key compare) instead of snapshotting once in start().\n syncConfig() {\n const cfg = this.pluginConfig();\n const key = JSON.stringify([\n cfg.showTabColor,\n cfg.showTitleEmoji,\n cfg.showProgress,\n cfg.showActivityDot,\n cfg.colors,\n cfg.emoji,\n ]);\n if (key === this.lastConfigKey)\n return;\n this.lastConfigKey = key;\n this.decorator.setConfig(cfg);\n this.decorator.reapply();\n debugLog({\n configSynced: true,\n showTabColor: cfg.showTabColor,\n showTitleEmoji: cfg.showTitleEmoji,\n showProgress: cfg.showProgress,\n showActivityDot: cfg.showActivityDot,\n });\n }\n // -- session restore API (used by the settings tab) --\n getSessions() {\n return this.tracker.list();\n }\n forgetSession(cwd) {\n this.tracker.forget(cwd);\n this.saveTracker();\n }\n async resumeSession(rec) {\n await this.openRecord(rec, this.pluginConfig().resumeCommand);\n }\n async resumeAllSessions() {\n const cmd = this.pluginConfig().resumeCommand;\n for (const rec of this.tracker.list())\n await this.openRecord(rec, cmd);\n }\n // -- internals --\n pluginConfig() {\n const store = (this.config.store?.opencodeStatus ?? {});\n return {\n ...types_1.DEFAULT_CONFIG,\n spoolDir: \"\",\n pollMs: 3000,\n autoResume: false,\n resumeCommand: \"opencode --continue\",\n sessions: [],\n ...store,\n // Nested maps merge over the defaults: an empty/partial `colors` or\n // `emoji` object in the user config must not blank out the defaults\n // (a shallow spread would leave `colors[status]` undefined).\n colors: { ...types_1.DEFAULT_CONFIG.colors, ...(store.colors ?? {}) },\n emoji: { ...types_1.DEFAULT_CONFIG.emoji, ...(store.emoji ?? {}) },\n };\n }\n async tick() {\n this.tickCount++;\n this.syncConfig();\n this.discover();\n debugLog({ tick: this.tickCount, tabs: this.allTabs().length, trackedCount: this.tracked.size });\n if (this.tickCount % 10 === 1)\n await this.refreshProcs();\n this.spool?.drain((s) => this.route(s));\n if (!this.resumed) {\n this.resumed = true;\n if (this.pluginConfig().autoResume)\n await this.resumeAllSessions();\n }\n if (this.trackerDirty && this.tickCount % 10 === 0)\n this.saveTracker();\n }\n allTabs() {\n const out = [];\n for (const t of this.app.tabs ?? []) {\n if (t instanceof terminus_core_1.SplitTabComponent)\n out.push(...t.getAllTabs());\n else\n out.push(t);\n }\n return out;\n }\n discover() {\n const seen = new Set();\n for (const tab of this.allTabs()) {\n seen.add(tab);\n if (this.tracked.has(tab) || !(tab instanceof terminus_terminal_1.BaseTerminalTabComponent))\n continue;\n const { like, dispose } = this.adapt(tab);\n this.decorator.attachTab(like, 0);\n this.tracked.set(tab, { terminal: tab, adapter: like, disposeAdapter: dispose, procs: new Map() });\n tab.destroyed$.subscribe(() => this.detach(tab));\n tab.sessionChanged$?.subscribe(() => {\n this.refreshTab(tab).catch(() => { });\n });\n }\n for (const tab of [...this.tracked.keys()]) {\n if (!seen.has(tab))\n this.detach(tab);\n }\n }\n detach(tab) {\n const t = this.tracked.get(tab);\n if (!t)\n return;\n this.decorator.clear(t.adapter);\n t.disposeAdapter();\n this.tracked.delete(tab);\n }\n adapt(tab) {\n const sub = tab.titleChange$.subscribe((title) => cb?.(title));\n let cb = null;\n const like = {\n get color() {\n return tab.color;\n },\n set color(v) {\n tab.color = v;\n },\n get title() {\n return tab.title;\n },\n setProgress: (p) => tab.setProgress(p),\n setTitle: (t) => tab.setTitle(t),\n displayActivity: () => tab.displayActivity(),\n clearActivity: () => tab.clearActivity(),\n onTitleFromTerminal: (fn) => {\n cb = fn;\n },\n };\n return { like, dispose: () => sub.unsubscribe() };\n }\n async childProcs(tab) {\n const out = new Map();\n try {\n const pty = tab.session?.pty;\n const kids = await pty?.getChildProcesses?.();\n for (const k of kids ?? []) {\n // ps-node returns pids as strings on Linux — coerce so Map lookups by\n // number (spool ancestors) actually match.\n const pid = typeof k?.pid === \"number\" ? k.pid : parseInt(String(k?.pid ?? \"\"), 10);\n if (Number.isFinite(pid))\n out.set(pid, k.command || \"\");\n }\n // The pty's \"true PID\" resolves through single-child chains, so it can\n // land on the running command (e.g. opencode) instead of the shell — in\n // that case getChildProcesses() is empty and no spool ancestor matches.\n // Include the true PID itself so ancestry intersection still works.\n const rawTruePid = await pty?.getTruePID?.();\n const truePid = typeof rawTruePid === \"number\" ? rawTruePid : parseInt(String(rawTruePid ?? \"\"), 10);\n if (Number.isFinite(truePid) && !out.has(truePid)) {\n out.set(truePid, await this.commandOf(truePid));\n }\n }\n catch {\n // SSH/serial/starting tabs: no match, no crash\n }\n return out;\n }\n async commandOf(pid) {\n try {\n const raw = await fs_1.default.promises.readFile(`/proc/${pid}/cmdline`, \"utf8\");\n return raw.split(\"\\u0000\")[0] || \"\";\n }\n catch {\n return \"\";\n }\n }\n async refreshProcs() {\n for (const [tab, t] of this.tracked) {\n t.procs = await this.childProcs(t.terminal);\n await this.trackTab(tab, t);\n }\n debugLog({\n tracked: [...this.tracked.values()].map((t) => ({\n title: t.terminal.title ?? \"\",\n procs: [...t.procs.entries()].map(([pid, cmd]) => `${pid}:${cmd}`),\n })),\n });\n }\n async refreshTab(tab) {\n const t = this.tracked.get(tab);\n if (!t)\n return;\n t.procs = await this.childProcs(t.terminal);\n await this.trackTab(tab, t);\n }\n async trackTab(tab, t) {\n if (![...t.procs.values()].some((cmd) => OPENCODE_RE.test(cmd)))\n return;\n let cwd = \"\";\n try {\n cwd = (await t.terminal.session?.getWorkingDirectory?.()) || \"\";\n }\n catch {\n // ignore\n }\n if (!cwd)\n return;\n this.tracker.note(cwd, tab.title);\n this.trackerDirty = true;\n }\n // Returns true when the event was applied to at least one tab in THIS window\n // (the spool file may then be consumed; unrouted files stay for other windows).\n route(s) {\n // Compare as strings: spool ancestors are JSON numbers while pids coming\n // from ps-node/Tabby may be strings (or vice versa).\n const ancestors = new Set(s.ancestors.map((a) => String(a)));\n const hits = [];\n for (const t of this.tracked.values()) {\n if ([...t.procs.keys()].some((pid) => ancestors.has(String(pid)))) {\n hits.push(t.terminal.title ?? \"\");\n this.decorator.apply(t.adapter, s.status);\n }\n }\n ROUTE_LOG.push({ ts: Date.now(), status: s.status, ancestors: s.ancestors, hits });\n if (ROUTE_LOG.length > 20)\n ROUTE_LOG.shift();\n debugLog({ lastRoute: { status: s.status, ancestors: s.ancestors, hits }, routes: ROUTE_LOG });\n return hits.length > 0;\n }\n saveTracker() {\n var _a;\n this.trackerDirty = false;\n (_a = this.config).store ?? (_a.store = {});\n if (!this.config.store.opencodeStatus)\n this.config.store.opencodeStatus = {};\n this.config.store.opencodeStatus.sessions = this.tracker.list();\n this.config.save();\n }\n // Resolve tabby-local's TerminalService lazily and defensively: community\n // plugins are only guaranteed terminus-*/@angular externals, so a static\n // import could kill the whole bundle at load time. Property access keeps\n // webpack from treating this as a build-time dependency.\n getTerminalService() {\n if (this.terminalSvc !== undefined)\n return this.terminalSvc;\n this.terminalSvc = null;\n try {\n const nodeRequire = globalThis.require;\n const mod = nodeRequire?.(\"tabby-local\");\n const Cls = mod?.TerminalService;\n if (Cls) {\n try {\n this.terminalSvc = this.injector.get(Cls, null);\n }\n catch {\n // no provider: resume stays disabled\n }\n }\n }\n catch {\n // unresolvable: resume stays disabled\n }\n return this.terminalSvc;\n }\n async openRecord(rec, command) {\n const terminal = this.getTerminalService();\n if (!terminal)\n return; // tabby-local not resolvable here: resume unavailable, colors unaffected\n let tab = null;\n try {\n tab = await terminal.openTab(undefined, rec.cwd);\n }\n catch {\n return;\n }\n for (let i = 0; i < 40; i++) {\n const session = tab?.session;\n if (session)\n break;\n await new Promise((r) => setTimeout(r, 250));\n }\n try {\n await tab.sendInput?.(`${command}\\n`);\n }\n catch {\n // tab may have been closed already\n }\n }\n};\nexports.OpencodeStatusBridge = OpencodeStatusBridge;\nexports.OpencodeStatusBridge = OpencodeStatusBridge = __decorate([\n (0, core_1.Injectable)(),\n __metadata(\"design:paramtypes\", [typeof (_a = typeof terminus_core_1.AppService !== \"undefined\" && terminus_core_1.AppService) === \"function\" ? _a : Object, typeof (_b = typeof terminus_core_1.ConfigService !== \"undefined\" && terminus_core_1.ConfigService) === \"function\" ? _b : Object, typeof (_c = typeof core_1.Injector !== \"undefined\" && core_1.Injector) === \"function\" ? _c : Object])\n], OpencodeStatusBridge);\n","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OpencodeStatusConfigProvider = void 0;\nconst core_1 = require(\"@angular/core\");\nconst terminus_core_1 = require(\"terminus-core\");\nconst types_1 = require(\"../interfaces/types\");\nlet OpencodeStatusConfigProvider = class OpencodeStatusConfigProvider extends terminus_core_1.ConfigProvider {\n constructor() {\n super(...arguments);\n this.defaults = {\n opencodeStatus: {\n ...types_1.DEFAULT_CONFIG,\n spoolDir: \"\",\n pollMs: 500,\n autoResume: false,\n resumeCommand: \"opencode --continue\",\n sessions: [],\n },\n };\n this.platformDefaults = {};\n }\n};\nexports.OpencodeStatusConfigProvider = OpencodeStatusConfigProvider;\nexports.OpencodeStatusConfigProvider = OpencodeStatusConfigProvider = __decorate([\n (0, core_1.Injectable)()\n], OpencodeStatusConfigProvider);\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = void 0;\nvar module_1 = require(\"./module\");\nObject.defineProperty(exports, \"default\", { enumerable: true, get: function () { return __importDefault(module_1).default; } });\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __metadata = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar _a;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst core_1 = require(\"@angular/core\");\nconst common_1 = require(\"@angular/common\");\nconst forms_1 = require(\"@angular/forms\");\nconst terminus_core_1 = __importStar(require(\"terminus-core\"));\nconst terminus_settings_1 = require(\"terminus-settings\");\nconst fs_1 = __importDefault(require(\"fs\"));\nconst os_1 = __importDefault(require(\"os\"));\nconst path_1 = __importDefault(require(\"path\"));\nconst bridge_service_1 = require(\"./bridge.service\");\nconst config_provider_1 = require(\"./config.provider\");\nconst settingsTab_component_1 = require(\"./settingsTab.component\");\nconst settingsTab_provider_1 = require(\"./settingsTab.provider\");\n// Black-box load marker: proves the bundle executed inside Tabby (or captures\n// the exact error if it dies during startup).\nfunction marker(data) {\n try {\n fs_1.default.writeFileSync(path_1.default.join(os_1.default.tmpdir(), \"tabby-opencode-status.marker.json\"), JSON.stringify({ ts: Date.now(), ...data }));\n }\n catch {\n // ignore\n }\n}\nlet OpencodeStatusModule = class OpencodeStatusModule {\n // Instantiating the bridge starts the spool poll loop.\n constructor(bridge) {\n try {\n bridge.start();\n marker({ loaded: true });\n }\n catch (e) {\n marker({ loaded: false, error: String(e), stack: e?.stack });\n }\n }\n};\nOpencodeStatusModule = __decorate([\n (0, core_1.NgModule)({\n // TerminusCoreModule declares/exports <toggle>; without it the settings\n // toggles are unknown elements and silently render nothing.\n imports: [common_1.CommonModule, forms_1.FormsModule, terminus_core_1.default],\n providers: [\n bridge_service_1.OpencodeStatusBridge,\n { provide: terminus_core_1.ConfigProvider, useClass: config_provider_1.OpencodeStatusConfigProvider, multi: true },\n { provide: terminus_settings_1.SettingsTabProvider, useClass: settingsTab_provider_1.OpencodeStatusSettingsTabProvider, multi: true },\n ],\n declarations: [settingsTab_component_1.OpencodeStatusSettingsTabComponent],\n }),\n __metadata(\"design:paramtypes\", [typeof (_a = typeof bridge_service_1.OpencodeStatusBridge !== \"undefined\" && bridge_service_1.OpencodeStatusBridge) === \"function\" ? _a : Object])\n], OpencodeStatusModule);\nexports.default = OpencodeStatusModule;\n// Bundle-evaluation probe: runs at require() time, before Angular touches us.\n// If this marker exists but no loaded:true marker, DI/instantiation failed.\n// If neither exists, the bundle never evaluated (discovery/require problem).\nmarker({ phase: \"import\" });\n","\"use strict\";\n// Framework-free record of tabs running opencode, for session restore.\n// Persisted via the Tabby config store (opencodeStatus.sessions), executed by\n// the bridge (bridge.service.ts) which reopens tabs after a Tabby restart.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SessionTracker = void 0;\nclass SessionTracker {\n constructor() {\n this.records = new Map();\n }\n note(cwd, title, now = Date.now()) {\n if (!cwd)\n return;\n this.records.set(cwd, { cwd, title: title || cwd, lastSeen: now });\n }\n forget(cwd) {\n this.records.delete(cwd);\n }\n list() {\n return [...this.records.values()].sort((a, b) => b.lastSeen - a.lastSeen);\n }\n prune(maxAgeMs, now = Date.now()) {\n for (const [key, rec] of this.records) {\n if (now - rec.lastSeen > maxAgeMs)\n this.records.delete(key);\n }\n }\n serialize() {\n return JSON.stringify(this.list());\n }\n load(raw) {\n this.records.clear();\n if (typeof raw === \"string\") {\n try {\n this.loadParsed(JSON.parse(raw));\n }\n catch {\n // keep empty\n }\n return;\n }\n this.loadParsed(raw);\n }\n loadParsed(raw) {\n if (!Array.isArray(raw))\n return;\n for (const r of raw) {\n if (r && typeof r.cwd === \"string\" && r.cwd) {\n this.records.set(r.cwd, {\n cwd: r.cwd,\n title: typeof r.title === \"string\" ? r.title : r.cwd,\n lastSeen: typeof r.lastSeen === \"number\" ? r.lastSeen : 0,\n });\n }\n }\n }\n}\nexports.SessionTracker = SessionTracker;\n","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __metadata = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};\nvar _a, _b;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OpencodeStatusSettingsTabComponent = void 0;\nconst core_1 = require(\"@angular/core\");\nconst terminus_core_1 = require(\"terminus-core\");\nconst bridge_service_1 = require(\"./bridge.service\");\nlet OpencodeStatusSettingsTabComponent = class OpencodeStatusSettingsTabComponent {\n constructor(config, bridge) {\n this.config = config;\n this.bridge = bridge;\n }\n save() {\n this.config.save();\n }\n};\nexports.OpencodeStatusSettingsTabComponent = OpencodeStatusSettingsTabComponent;\nexports.OpencodeStatusSettingsTabComponent = OpencodeStatusSettingsTabComponent = __decorate([\n (0, core_1.Component)({\n selector: \"opencode-status-settings\",\n template: `\n<h3>Opencode Status</h3>\n<div class=\"form-group\">\n <label>Tab color on status change</label>\n <toggle [(ngModel)]=\"config.store.opencodeStatus.showTabColor\" (ngModelChange)=\"save()\"></toggle>\n</div>\n<div class=\"form-group\">\n <label>Title emoji prefix</label>\n <toggle [(ngModel)]=\"config.store.opencodeStatus.showTitleEmoji\" (ngModelChange)=\"save()\"></toggle>\n</div>\n<div class=\"form-group\">\n <label>Progress bar while working</label>\n <toggle [(ngModel)]=\"config.store.opencodeStatus.showProgress\" (ngModelChange)=\"save()\"></toggle>\n</div>\n<div class=\"form-group\">\n <label>Activity dot when input is needed</label>\n <toggle [(ngModel)]=\"config.store.opencodeStatus.showActivityDot\" (ngModelChange)=\"save()\"></toggle>\n</div>\n<div class=\"form-group\">\n <label>Auto-resume saved sessions on Tabby launch</label>\n <toggle [(ngModel)]=\"config.store.opencodeStatus.autoResume\" (ngModelChange)=\"save()\"></toggle>\n</div>\n<div class=\"form-group\">\n <label>Resume command</label>\n <input class=\"form-control\" [(ngModel)]=\"config.store.opencodeStatus.resumeCommand\" (ngModelChange)=\"save()\" />\n</div>\n<h4 class=\"mt-3\">Saved opencode sessions</h4>\n<div class=\"form-group\">\n <button class=\"btn btn-outline-primary\" (click)=\"bridge.resumeAllSessions()\">Resume all now</button>\n</div>\n<div class=\"list-group\">\n <div class=\"list-group-item d-flex align-items-center\" *ngFor=\"let s of bridge.getSessions()\">\n <div class=\"mr-auto\"><div>{{s.title}}</div><div class=\"text-muted\">{{s.cwd}}</div></div>\n <button class=\"btn btn-outline-info ml-2\" (click)=\"bridge.resumeSession(s)\">Resume</button>\n <button class=\"btn btn-outline-danger ml-1\" (click)=\"bridge.forgetSession(s.cwd)\">Forget</button>\n </div>\n</div>\n `,\n }),\n __metadata(\"design:paramtypes\", [typeof (_a = typeof terminus_core_1.ConfigService !== \"undefined\" && terminus_core_1.ConfigService) === \"function\" ? _a : Object, typeof (_b = typeof bridge_service_1.OpencodeStatusBridge !== \"undefined\" && bridge_service_1.OpencodeStatusBridge) === \"function\" ? _b : Object])\n], OpencodeStatusSettingsTabComponent);\n","\"use strict\";\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.OpencodeStatusSettingsTabProvider = void 0;\nconst core_1 = require(\"@angular/core\");\nconst terminus_settings_1 = require(\"terminus-settings\");\nconst settingsTab_component_1 = require(\"./settingsTab.component\");\nlet OpencodeStatusSettingsTabProvider = class OpencodeStatusSettingsTabProvider extends terminus_settings_1.SettingsTabProvider {\n constructor() {\n super(...arguments);\n this.id = \"opencode-status\";\n this.title = \"Opencode Status\";\n }\n getComponentType() {\n return settingsTab_component_1.OpencodeStatusSettingsTabComponent;\n }\n};\nexports.OpencodeStatusSettingsTabProvider = OpencodeStatusSettingsTabProvider;\nexports.OpencodeStatusSettingsTabProvider = OpencodeStatusSettingsTabProvider = __decorate([\n (0, core_1.Injectable)()\n], OpencodeStatusSettingsTabProvider);\n","module.exports = require(\"fs\");","module.exports = require(\"os\");","module.exports = require(\"path\");","module.exports = __WEBPACK_EXTERNAL_MODULE__358__;","module.exports = __WEBPACK_EXTERNAL_MODULE__860__;","module.exports = __WEBPACK_EXTERNAL_MODULE__182__;","module.exports = __WEBPACK_EXTERNAL_MODULE__767__;","module.exports = __WEBPACK_EXTERNAL_MODULE__85__;","module.exports = __WEBPACK_EXTERNAL_MODULE__344__;","// The module cache\nconst __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tconst cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tconst module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nlet __webpack_exports__ = __webpack_require__(716);\n"],"names":["root","factory","exports","module","require","define","amd","a","i","global","__WEBPACK_EXTERNAL_MODULE__358__","__WEBPACK_EXTERNAL_MODULE__860__","__WEBPACK_EXTERNAL_MODULE__182__","__WEBPACK_EXTERNAL_MODULE__767__","__WEBPACK_EXTERNAL_MODULE__85__","__WEBPACK_EXTERNAL_MODULE__344__","OpencodeStatusDecorator","constructor","config","this","tabs","Map","pidIndex","setConfig","reapply","tab","rec","status","apply","attachTab","ptyPid","set","baseTitle","stripEmoji","title","emoji","onTitleFromTerminal","get","base","want","setTitle","detachTab","clear","delete","rebuildIndex","registerPid","pid","Set","add","route","ancestors","ancestorsOf","chain","some","has","c","color","showTabColor","colors","setProgress","showProgress","showActivityDot","clearActivity","displayActivity","showTitleEmoji","e","Object","values","startsWith","rest","slice","length","sep","exec","DEFAULT_CONFIG","statusForEvent","event","working","question","done","error","idle","spoolDir","pollMs","__importDefault","mod","__esModule","default","defineProperty","value","StatusFileService","parseSpoolFile","fs_1","__webpack_require__","os_1","path_1","types_1","raw","s","JSON","parse","Array","isArray","session","cwd","join","tmpdir","timer","start","onStatus","stop","setInterval","drain","clearInterval","files","readdirSync","f","endsWith","full","readFileSync","routed","parsed","stale","Date","now","statSync","mtimeMs","rmSync","_a","_b","_c","__decorate","decorators","target","key","desc","d","arguments","r","getOwnPropertyDescriptor","Reflect","decorate","__metadata","k","v","metadata","OpencodeStatusBridge","core_1","terminus_core_1","terminus_terminal_1","statusFileService_1","opencodeStatusDecorator_1","sessionTracker_1","OPENCODE_RE","DEBUG_FILE","ROUTE_LOG","debugLog","entry","prev","writeFileSync","stringify","ts","app","injector","spool","decorator","tracker","SessionTracker","tracked","configSub","lastConfigKey","tickCount","resumed","trackerDirty","terminalSvc","undefined","pluginConfig","cfg","load","store","opencodeStatus","sessions","tick","catch","changed","changed$","subscribe","onConfigChanged","started","unsubscribe","keys","detach","syncConfig","configSynced","getSessions","list","forgetSession","forget","saveTracker","resumeSession","openRecord","resumeCommand","resumeAllSessions","cmd","autoResume","discover","allTabs","trackedCount","size","refreshProcs","out","t","SplitTabComponent","push","getAllTabs","seen","BaseTerminalTabComponent","like","dispose","adapt","terminal","adapter","disposeAdapter","procs","destroyed$","sessionChanged$","refreshTab","sub","titleChange$","cb","p","fn","childProcs","pty","kids","getChildProcesses","parseInt","String","Number","isFinite","command","rawTruePid","getTruePID","truePid","commandOf","promises","readFile","split","trackTab","map","entries","test","getWorkingDirectory","note","hits","shift","lastRoute","routes","save","getTerminalService","nodeRequire","globalThis","Cls","TerminalService","openTab","Promise","setTimeout","sendInput","Injectable","AppService","ConfigService","Injector","OpencodeStatusConfigProvider","ConfigProvider","super","defaults","platformDefaults","module_1","enumerable","ownKeys","__createBinding","create","o","m","k2","writable","configurable","__setModuleDefault","__importStar","getOwnPropertyNames","ar","prototype","hasOwnProperty","call","result","common_1","forms_1","terminus_settings_1","bridge_service_1","config_provider_1","settingsTab_component_1","settingsTab_provider_1","marker","data","OpencodeStatusModule","bridge","loaded","stack","NgModule","imports","CommonModule","FormsModule","providers","provide","useClass","multi","SettingsTabProvider","OpencodeStatusSettingsTabProvider","declarations","OpencodeStatusSettingsTabComponent","phase","records","lastSeen","sort","b","prune","maxAgeMs","serialize","loadParsed","Component","selector","template","id","getComponentType","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tabby-opencode-status",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Native Tabby plugin: paint tab color / progress / title from opencode session status, with session restore",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "tmiland",
|
|
7
|
+
"email": "326116980+tmiland@users.noreply.github.com"
|
|
8
|
+
},
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/tmiland-lab/tabby-opencode-status.git",
|
|
13
|
+
"directory": "packages/tabby-opencode-status"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"tabby-plugin",
|
|
17
|
+
"opencode",
|
|
18
|
+
"terminal",
|
|
19
|
+
"tab-color",
|
|
20
|
+
"status"
|
|
21
|
+
],
|
|
22
|
+
"main": "dist/index.js",
|
|
23
|
+
"files": [
|
|
24
|
+
"dist"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"typecheck": "tsc --noEmit",
|
|
28
|
+
"build": "webpack --config webpack.config.mjs",
|
|
29
|
+
"test": "npm run typecheck && tsc -p tsconfig.test.json && node dist-test/test/run.js && npm run build && node scripts/smoke-bundle.js",
|
|
30
|
+
"install-plugin": "npm run build && node scripts/install-plugin.js"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/node": "^20.0.0",
|
|
34
|
+
"ts-loader": "^9.5.0",
|
|
35
|
+
"typescript": "^5.5.0",
|
|
36
|
+
"webpack": "^5.90.0",
|
|
37
|
+
"webpack-cli": "^5.1.0"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"reflect-metadata": "^0.2.2"
|
|
41
|
+
}
|
|
42
|
+
}
|