tabby-tab-notes 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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 GrillerGeek
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # tabby-tab-notes
2
+
3
+ A Tabby terminal plugin: persistent per-tab markdown notes in a docked side panel, with an auto-stamped context header (cwd + git branch), optional repo-pinning, and plain-file storage that can roam between machines. It's a handoff doc for *you* โ€” so when you come back to a tab you remember what you were doing and what's next.
4
+
5
+ ## Status: working
6
+
7
+ Verified live on Tabby (macOS):
8
+
9
+ - Docked notes panel, toggled from the toolbar button (or the `tab-notes-toggle` hotkey)
10
+ - A separate note per tab, switching automatically as you change tabs
11
+ - Auto-stamped header showing the tab's working directory and git branch
12
+ - `๐Ÿ“Œ Pin` a note to its repo so any tab in that repo shares it (hybrid binding)
13
+ - Notes stored as plain `.md` files (default `~/.config/tabby/tab-notes/`)
14
+ - **Notes survive a full restart and reattach to the correct tabs**
15
+
16
+ ## Install
17
+
18
+ See [INSTALL.md](INSTALL.md). In short: `npm install --legacy-peer-deps && npm run build`, symlink into Tabby's plugin dir, enable "restore tabs on startup".
19
+
20
+ ## Design & build history
21
+
22
+ - Design spec: `docs/specs/2026-06-05-tabby-tab-notes-design.md`
23
+ - Implementation plan: `docs/plans/2026-06-05-tabby-tab-notes.md`
24
+
25
+ ## Known rough edges
26
+
27
+ - Default notes folder is `~/.config/tabby/tab-notes/` on all platforms (works, but not Tabby's native config dir on macOS/Windows); repoint it via the `tabNotes.folder` config for synced/cross-machine use.
28
+ - The header's "last command" field is reserved but not yet populated (would need shell integration).
29
+ - Panel is a fixed overlay on the right edge; it covers part of the terminal rather than reflowing it.
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ !function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("@angular/core"),require("tabby-core"),require("rxjs"),require("rxjs/operators"),require("os"),require("path"),require("fs"),require("child_process"));else if("function"==typeof define&&define.amd)define(["@angular/core","tabby-core","rxjs","rxjs/operators","os","path","fs","child_process"],t);else{var n="object"==typeof exports?t(require("@angular/core"),require("tabby-core"),require("rxjs"),require("rxjs/operators"),require("os"),require("path"),require("fs"),require("child_process")):t(e["@angular/core"],e["tabby-core"],e.rxjs,e["rxjs/operators"],e.os,e.path,e.fs,e.child_process);for(var o in n)("object"==typeof exports?exports:e)[o]=n[o]}}(global,(e,t,n,o,r,i,s,a)=>(()=>{"use strict";var l={860(t){t.exports=e},660(e){e.exports=a},947(e){e.exports=s},234(e){e.exports=r},911(e){e.exports=i},961(e){e.exports=n},439(e){e.exports=o},650(e){e.exports=t}},c={};function d(e){var t=c[e];if(void 0!==t)return t.exports;var n=c[e]={exports:{}};return l[e](n,n.exports,d),n.exports}d.d=(e,t)=>{for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var u={};d.r(u),d.d(u,{default:()=>z});var h=d(860),p=d(650),f=d(961),b=d(439),v=d(234),y=d(911),x=d(947);const g="\x3c!-- tab-notes:header --\x3e",m="\x3c!-- tab-notes:end-header --\x3e";class P{constructor(e){this.notesDir=e}indexPath(){return y.join(this.notesDir,"index.json")}notePath(e){if(/[/\\]/.test(e))throw new Error(`Invalid noteId: "${e}"`);return y.join(this.notesDir,`${e}.md`)}ensureDir(){x.mkdirSync(this.notesDir,{recursive:!0})}readIndex(){var e,t;try{const n=JSON.parse(x.readFileSync(this.indexPath(),"utf8"));return{meta:null!==(e=n.meta)&&void 0!==e?e:{},pins:null!==(t=n.pins)&&void 0!==t?t:{}}}catch(e){return{meta:{},pins:{}}}}writeIndex(e){this.ensureDir();const t=this.indexPath()+".tmp";x.writeFileSync(t,JSON.stringify(e,null,2),"utf8"),x.renameSync(t,this.indexPath())}load(e){if(/[/\\]/.test(e))throw new Error(`Invalid noteId: "${e}"`);try{return function(e){const t=e.indexOf(g),n=e.indexOf(m);return-1===t||-1===n||n<t?{header:"",body:e.trim()}:{header:e.slice(t+25,n).trim(),body:e.slice(n+29).trim()}}(x.readFileSync(this.notePath(e),"utf8"))}catch(e){return{header:"",body:""}}}write(e,t){this.ensureDir(),x.writeFileSync(this.notePath(e),function(e){if(e.header.includes(m))throw new Error("Note header must not contain the end-sentinel");return`${g}\n${e.header}\n${m}\n\n${e.body}\n`}(t),"utf8")}saveBody(e,t){this.write(e,{header:this.load(e).header,body:t})}saveHeader(e,t){this.write(e,{header:t,body:this.load(e).body})}getMeta(e){var t;return null!==(t=this.readIndex().meta[e])&&void 0!==t?t:null}setMeta(e,t){const n=this.readIndex();n.meta[e]=t,this.writeIndex(n)}getPins(){return this.readIndex().pins}setPin(e,t){const n=this.readIndex();n.pins[e]=t,this.writeIndex(n)}removePin(e){const t=this.readIndex();delete t.pins[e],this.writeIndex(t)}}class w{constructor(e){this.store=e}resolve(e){if(e.repoPath){const t=this.store.getPins()[e.repoPath];if(t)return t}return e.noteId}pinToRepo(e,t){this.store.setPin(e,t)}unpin(e){this.store.removePin(e)}isPinned(e){return!!e&&e in this.store.getPins()}}var j=d(660);const R=(e,t,n)=>new Promise((o,r)=>{(0,j.execFile)(e,t,{cwd:n},(e,t)=>e?r(e):o(t))});var I,E,T;let S=class{constructor(e,t,n){this.app=e,this.config=t,this.hotkeys=n,this.currentNoteId=null,this.currentRepoPath=null,this.bodyInput$=new f.Subject,this.visible=!1,this.header="",this.body="",this.panelWidth=340,this.panelEl=null,this.headerEl=null,this.textareaEl=null,this.pinBtnEl=null}init(){var e,t;this.store=new P(this.resolveFolder()),this.binding=new w(this.store),this.bodyInput$.pipe((0,b.debounceTime)(400)).subscribe(e=>this.persistBody(e)),this.app.activeTabChange$.subscribe(e=>{this.loadForTab(e)}),this.hotkeys.hotkey$.subscribe(e=>{"tab-notes-toggle"===e&&this.toggle(),"tab-notes-pin"===e&&this.pinCurrentToRepo()}),(null===(t=null===(e=this.config.store)||void 0===e?void 0:e.tabNotes)||void 0===t?void 0:t.panelVisible)&&this.toggle()}resolveFolder(){var e,t;const n=null===(t=null===(e=this.config.store)||void 0===e?void 0:e.tabNotes)||void 0===t?void 0:t.folder,o=y.join(v.homedir(),".config","tabby","tab-notes"),r=n||o;try{return new P(r).ensureDir(),r}catch(e){return console.warn("[tab-notes] notes folder unwritable, falling back to config dir:",e),o}}toggle(){this.visible=!this.visible,this.visible?(this.mountPanel(),this.loadForTab(this.app.activeTab)):this.unmountPanel()}mountPanel(){if(this.panelEl)return;const e=document.createElement("div");e.style.cssText=["position:fixed","top:0","right:0","bottom:0",`width:${this.panelWidth}px`,"z-index:99998","display:flex","flex-direction:column","background:rgba(24,24,27,0.97)","color:#e4e4e7","border-left:1px solid #3f3f46","box-shadow:-4px 0 16px rgba(0,0,0,0.35)",'font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif'].join(";");const t=document.createElement("div");t.style.cssText=["display:flex","align-items:center","justify-content:space-between","padding:8px 10px","background:#18181b","border-bottom:1px solid #3f3f46","font-size:12px","font-weight:600","letter-spacing:.02em"].join(";");const n=document.createElement("span");n.textContent="Tab Notes";const o=document.createElement("div");o.style.cssText="display:flex;gap:4px";const r=document.createElement("button");r.textContent="๐Ÿ“Œ Pin",r.title="Pin this note to the current repo",this.styleButton(r),r.addEventListener("click",()=>this.pinCurrentToRepo()),this.pinBtnEl=r;const i=document.createElement("button");i.textContent="โœ•",i.title="Close (toggle with the toolbar button)",this.styleButton(i),i.addEventListener("click",()=>this.toggle()),o.appendChild(r),o.appendChild(i),t.appendChild(n),t.appendChild(o);const s=document.createElement("div");s.style.cssText=["padding:6px 10px","font-size:11px","color:#a1a1aa","white-space:pre-wrap","word-break:break-all","border-bottom:1px solid #27272a"].join(";"),this.headerEl=s;const a=document.createElement("textarea");a.placeholder="What were you doing in this tab? What's next?",a.style.cssText=["flex:1","resize:none","border:0","outline:none","padding:10px","background:transparent","color:#e4e4e7","font-size:13px","line-height:1.5","font-family:ui-monospace,SFMono-Regular,Menlo,monospace"].join(";"),a.addEventListener("input",()=>this.onBodyChanged(a.value)),this.textareaEl=a,e.appendChild(t),e.appendChild(s),e.appendChild(a),document.body.appendChild(e),this.panelEl=e,this.applyLayout(!0),this.renderState(),setTimeout(()=>{var e;return null===(e=this.textareaEl)||void 0===e?void 0:e.focus()},0)}applyLayout(e){const t=document.querySelector("app-root"),n=document.querySelector("app-root .content");t&&(t.style.transition="width 0.15s ease",t.style.width=e?`calc(100vw - ${this.panelWidth}px)`:""),n&&(n.style.width=e?"100%":""),setTimeout(()=>window.dispatchEvent(new Event("resize")),160)}styleButton(e){e.style.cssText=["background:transparent","border:1px solid #3f3f46","border-radius:4px","color:#d4d4d8","font-size:11px","padding:2px 6px","cursor:pointer"].join(";")}unmountPanel(){var e;null===(e=this.panelEl)||void 0===e||e.remove(),this.panelEl=null,this.headerEl=null,this.textareaEl=null,this.pinBtnEl=null,this.applyLayout(!1)}renderState(){if(this.headerEl&&(this.headerEl.textContent=this.header||"> ๐Ÿ“ unknown"),this.textareaEl&&this.textareaEl.value!==this.body&&(this.textareaEl.value=this.body),this.pinBtnEl){const e=this.binding.isPinned(this.currentRepoPath);this.pinBtnEl.textContent=e?"๐Ÿ“Œ Pinned":"๐Ÿ“Œ Pin",this.pinBtnEl.style.opacity=this.currentRepoPath?"1":"0.4"}}async loadForTab(e){if(!e||!e.__tabNotesId)return this.currentNoteId=null,void this.renderState();const t=await this.readCwd(e),n=t?await async function(e,t){try{return{repoPath:(await t("git",["-C",e,"rev-parse","--show-toplevel"],e)).trim()||null,branch:function(e){const t=e.trim();return t.length>0?t:null}(await t("git",["-C",e,"branch","--show-current"],e))}}catch(e){return{repoPath:null,branch:null}}}(t,R):{repoPath:null,branch:null};this.currentRepoPath=n.repoPath;const o=this.binding.resolve({noteId:e.__tabNotesId,repoPath:n.repoPath});this.currentNoteId=o;const r=this.store.load(o),i=function(e){var t;const n=[`๐Ÿ“ ${null!==(t=e.cwd)&&void 0!==t?t:"unknown"}`];return e.branch&&n.push(e.branch),e.lastCommand&&n.push(`last: ${e.lastCommand}`),`> ${n.join(" ยท ")}`}({cwd:t,branch:n.branch,lastCommand:null});this.store.saveHeader(o,i),this.header=i,this.body=r.body,this.renderState()}async readCwd(e){var t,n,o,r;const i=null!==(n=null===(t=null==e?void 0:e.getFocusedTab)||void 0===t?void 0:t.call(e))&&void 0!==n?n:e,s=null==i?void 0:i.session;try{return(null===(o=null==s?void 0:s.supportsWorkingDirectory)||void 0===o?void 0:o.call(s))&&null!==(r=await s.getWorkingDirectory())&&void 0!==r?r:null}catch(e){return null}}onBodyChanged(e){this.body=e,this.bodyInput$.next(e)}persistBody(e){if(!this.currentNoteId)return;this.store.saveBody(this.currentNoteId,e);const t=e.split("\n")[0].slice(0,60);this.store.setMeta(this.currentNoteId,{title:t,lastActive:(new Date).toISOString()})}pinCurrentToRepo(){this.currentNoteId&&this.currentRepoPath&&(this.binding.isPinned(this.currentRepoPath)?this.binding.unpin(this.currentRepoPath):this.binding.pinToRepo(this.currentRepoPath,this.currentNoteId),this.loadForTab(this.app.activeTab))}};S=function(e,t,n,o){var r,i=arguments.length,s=i<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,o);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(i<3?r(s):i>3?r(t,n,s):r(t,n))||s);return i>3&&s&&Object.defineProperty(t,n,s),s}([(0,h.Injectable)({providedIn:"root"}),function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}("design:paramtypes",["function"==typeof(I=void 0!==p.AppService&&p.AppService)?I:Object,"function"==typeof(E=void 0!==p.ConfigService&&p.ConfigService)?E:Object,"function"==typeof(T=void 0!==p.HotkeysService&&p.HotkeysService)?T:Object])],S);const C=require("crypto");var O;let N=class{constructor(e){this.tabRecovery=e}init(e){this.patchRecovery(),e.tabOpened$.subscribe(e=>this.attach(e));for(const t of e.tabs)this.attach(t)}patchRecovery(){var e;const t=this.tabRecovery;if(t.__tabNotesPatched)return;const n=null===(e=t.recoverTab)||void 0===e?void 0:e.bind(t);n&&(t.recoverTab=async e=>{var t;const o=await n(e);return o&&(null==e?void 0:e.tabNotesId)&&(o.inputs={...null!==(t=o.inputs)&&void 0!==t?t:{},__tabNotesId:e.tabNotesId}),o},t.__tabNotesPatched=!0)}attach(e){var t;if(e.__tabNotesId||(e.__tabNotesId=(0,C.randomUUID)()),e.__tabNotesGetTokenPatched)return;const n=null===(t=e.getRecoveryToken)||void 0===t?void 0:t.bind(e);n&&(e.getRecoveryToken=async()=>{const t=await n();return t&&(t.tabNotesId=e.__tabNotesId),t},e.__tabNotesGetTokenPatched=!0)}};N=function(e,t,n,o){var r,i=arguments.length,s=i<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,o);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(i<3?r(s):i>3?r(t,n,s):r(t,n))||s);return i>3&&s&&Object.defineProperty(t,n,s),s}([(0,h.Injectable)({providedIn:"root"}),function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}("design:paramtypes",["function"==typeof(O=void 0!==p.TabRecoveryService&&p.TabRecoveryService)?O:Object])],N);var k;let _=class extends p.ToolbarButtonProvider{constructor(e){super(),this.panel=e}provide(){return[{icon:"note",title:"Tab Notes",weight:5,click:()=>this.panel.toggle()}]}};_=function(e,t,n,o){var r,i=arguments.length,s=i<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,o);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(i<3?r(s):i>3?r(t,n,s):r(t,n))||s);return i>3&&s&&Object.defineProperty(t,n,s),s}([(0,h.Injectable)(),function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}("design:paramtypes",["function"==typeof(k=void 0!==S&&S)?k:Object])],_);class q extends p.ConfigProvider{constructor(){super(...arguments),this.defaults={tabNotes:{folder:null,panelVisible:!1}}}}class B extends p.HotkeyProvider{async provide(){return[{id:"tab-notes-toggle",name:"Toggle tab notes panel"},{id:"tab-notes-pin",name:"Pin this tab note to its repo"}]}}var $,D,F;let M=class{constructor(e,t,n){n.init(e),t.init()}};M=function(e,t,n,o){var r,i=arguments.length,s=i<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,o);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(i<3?r(s):i>3?r(t,n,s):r(t,n))||s);return i>3&&s&&Object.defineProperty(t,n,s),s}([(0,h.NgModule)({providers:[S,N,{provide:p.ToolbarButtonProvider,useClass:_,multi:!0},{provide:p.ConfigProvider,useClass:q,multi:!0},{provide:p.HotkeyProvider,useClass:B,multi:!0}]}),function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}("design:paramtypes",["function"==typeof($=void 0!==p.AppService&&p.AppService)?$:Object,"function"==typeof(D=void 0!==S&&S)?D:Object,"function"==typeof(F=void 0!==N&&N)?F:Object])],M);const z=M;return u})());
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","mappings":"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","sources":["webpack-tabby-tab-notes:///webpack/universalModuleDefinition","webpack-tabby-tab-notes:///external umd \"@angular/core\"","webpack-tabby-tab-notes:///external umd \"child_process\"","webpack-tabby-tab-notes:///external umd \"fs\"","webpack-tabby-tab-notes:///external umd \"os\"","webpack-tabby-tab-notes:///external umd \"path\"","webpack-tabby-tab-notes:///external umd \"rxjs\"","webpack-tabby-tab-notes:///external umd \"rxjs/operators\"","webpack-tabby-tab-notes:///external umd \"tabby-core\"","webpack-tabby-tab-notes:///webpack/bootstrap","webpack-tabby-tab-notes:///webpack/runtime/define property getters","webpack-tabby-tab-notes:///webpack/runtime/hasOwnProperty shorthand","webpack-tabby-tab-notes:///webpack/runtime/make namespace object","webpack-tabby-tab-notes:///./src/lib/noteStore.ts","webpack-tabby-tab-notes:///./src/lib/noteBinding.ts","webpack-tabby-tab-notes:///./src/services/nodeExec.ts","webpack-tabby-tab-notes:///./src/services/notesPanel.service.ts","webpack-tabby-tab-notes:///./src/lib/contextStamper.ts","webpack-tabby-tab-notes:///external node-commonjs \"crypto\"","webpack-tabby-tab-notes:///./src/services/tabId.service.ts","webpack-tabby-tab-notes:///./src/providers/toolbarButton.ts","webpack-tabby-tab-notes:///./src/providers/config.ts","webpack-tabby-tab-notes:///./src/providers/hotkeys.ts","webpack-tabby-tab-notes:///./src/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@angular/core\"), require(\"tabby-core\"), require(\"rxjs\"), require(\"rxjs/operators\"), require(\"os\"), require(\"path\"), require(\"fs\"), require(\"child_process\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"@angular/core\", \"tabby-core\", \"rxjs\", \"rxjs/operators\", \"os\", \"path\", \"fs\", \"child_process\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"@angular/core\"), require(\"tabby-core\"), require(\"rxjs\"), require(\"rxjs/operators\"), require(\"os\"), require(\"path\"), require(\"fs\"), require(\"child_process\")) : factory(root[\"@angular/core\"], root[\"tabby-core\"], root[\"rxjs\"], root[\"rxjs/operators\"], root[\"os\"], root[\"path\"], root[\"fs\"], root[\"child_process\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(global, (__WEBPACK_EXTERNAL_MODULE__860__, __WEBPACK_EXTERNAL_MODULE__650__, __WEBPACK_EXTERNAL_MODULE__961__, __WEBPACK_EXTERNAL_MODULE__439__, __WEBPACK_EXTERNAL_MODULE__234__, __WEBPACK_EXTERNAL_MODULE__911__, __WEBPACK_EXTERNAL_MODULE__947__, __WEBPACK_EXTERNAL_MODULE__660__) => {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__860__;","module.exports = __WEBPACK_EXTERNAL_MODULE__660__;","module.exports = __WEBPACK_EXTERNAL_MODULE__947__;","module.exports = __WEBPACK_EXTERNAL_MODULE__234__;","module.exports = __WEBPACK_EXTERNAL_MODULE__911__;","module.exports = __WEBPACK_EXTERNAL_MODULE__961__;","module.exports = __WEBPACK_EXTERNAL_MODULE__439__;","module.exports = __WEBPACK_EXTERNAL_MODULE__650__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar 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\tvar 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](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import * as fs from 'fs'\nimport * as path from 'path'\n\nexport interface NoteContent { header: string; body: string }\nexport interface NoteMeta { title: string; lastActive: string }\ninterface IndexShape { meta: Record<string, NoteMeta>; pins: Record<string, string> }\n\nconst HEADER_START = '<!-- tab-notes:header -->'\nconst HEADER_END = '<!-- tab-notes:end-header -->'\n\nexport function parseNoteFile(raw: string): NoteContent {\n const start = raw.indexOf(HEADER_START)\n const end = raw.indexOf(HEADER_END)\n if (start === -1 || end === -1 || end < start) {\n return { header: '', body: raw.trim() }\n }\n const header = raw.slice(start + HEADER_START.length, end).trim()\n const body = raw.slice(end + HEADER_END.length).trim()\n return { header, body }\n}\n\nexport function serializeNoteFile(content: NoteContent): string {\n if (content.header.includes(HEADER_END)) {\n throw new Error('Note header must not contain the end-sentinel')\n }\n return `${HEADER_START}\\n${content.header}\\n${HEADER_END}\\n\\n${content.body}\\n`\n}\n\nexport class NoteStore {\n constructor(private notesDir: string) {}\n\n private indexPath(): string { return path.join(this.notesDir, 'index.json') }\n private notePath(noteId: string): string {\n if (/[/\\\\]/.test(noteId)) { throw new Error(`Invalid noteId: \"${noteId}\"`) }\n return path.join(this.notesDir, `${noteId}.md`)\n }\n\n ensureDir(): void { fs.mkdirSync(this.notesDir, { recursive: true }) }\n\n private readIndex(): IndexShape {\n try {\n const parsed = JSON.parse(fs.readFileSync(this.indexPath(), 'utf8'))\n return { meta: parsed.meta ?? {}, pins: parsed.pins ?? {} }\n } catch { return { meta: {}, pins: {} } }\n }\n\n private writeIndex(index: IndexShape): void {\n this.ensureDir()\n const tmp = this.indexPath() + '.tmp'\n fs.writeFileSync(tmp, JSON.stringify(index, null, 2), 'utf8')\n fs.renameSync(tmp, this.indexPath())\n }\n\n load(noteId: string): NoteContent {\n if (/[/\\\\]/.test(noteId)) { throw new Error(`Invalid noteId: \"${noteId}\"`) }\n try { return parseNoteFile(fs.readFileSync(this.notePath(noteId), 'utf8')) }\n catch { return { header: '', body: '' } }\n }\n\n private write(noteId: string, content: NoteContent): void {\n this.ensureDir()\n fs.writeFileSync(this.notePath(noteId), serializeNoteFile(content), 'utf8')\n }\n\n saveBody(noteId: string, body: string): void {\n this.write(noteId, { header: this.load(noteId).header, body })\n }\n\n saveHeader(noteId: string, header: string): void {\n this.write(noteId, { header, body: this.load(noteId).body })\n }\n\n getMeta(noteId: string): NoteMeta | null { return this.readIndex().meta[noteId] ?? null }\n\n setMeta(noteId: string, meta: NoteMeta): void {\n const index = this.readIndex(); index.meta[noteId] = meta; this.writeIndex(index)\n }\n\n getPins(): Record<string, string> { return this.readIndex().pins }\n\n setPin(repoPath: string, noteId: string): void {\n const index = this.readIndex(); index.pins[repoPath] = noteId; this.writeIndex(index)\n }\n\n removePin(repoPath: string): void {\n const index = this.readIndex(); delete index.pins[repoPath]; this.writeIndex(index)\n }\n}\n","import { NoteStore } from './noteStore'\n\nexport interface TabRef { noteId: string; repoPath: string | null }\n\nexport class NoteBinding {\n constructor(private store: NoteStore) {}\n\n resolve(tab: TabRef): string {\n if (tab.repoPath) {\n const pinned = this.store.getPins()[tab.repoPath]\n if (pinned) { return pinned }\n }\n return tab.noteId\n }\n\n pinToRepo(repoPath: string, noteId: string): void { this.store.setPin(repoPath, noteId) }\n unpin(repoPath: string): void { this.store.removePin(repoPath) }\n isPinned(repoPath: string | null): boolean {\n return repoPath ? repoPath in this.store.getPins() : false\n }\n}\n","import { execFile } from 'child_process'\nimport { ExecFn } from '../lib/contextStamper'\n\nexport const nodeExec: ExecFn = (cmd, args, cwd) => new Promise((resolve, reject) => {\n execFile(cmd, args, { cwd }, (err, stdout) => err ? reject(err) : resolve(stdout))\n})\n","import { Injectable } from '@angular/core'\nimport { Subject } from 'rxjs'\nimport { debounceTime } from 'rxjs/operators'\nimport * as os from 'os'\nimport * as path from 'path'\nimport { AppService, ConfigService, HotkeysService } from 'tabby-core'\nimport { NoteStore } from '../lib/noteStore'\nimport { NoteBinding } from '../lib/noteBinding'\nimport { formatHeader, getRepoContext } from '../lib/contextStamper'\nimport { nodeExec } from './nodeExec'\n\n@Injectable({ providedIn: 'root' })\nexport class NotesPanelService {\n private store!: NoteStore\n private binding!: NoteBinding\n private currentNoteId: string | null = null\n private currentRepoPath: string | null = null\n private bodyInput$ = new Subject<string>()\n\n visible = false\n header = ''\n body = ''\n\n // Plain-DOM panel (avoids Angular dynamic-component API differences across Tabby versions).\n private readonly panelWidth = 340\n private panelEl: HTMLElement | null = null\n private headerEl: HTMLElement | null = null\n private textareaEl: HTMLTextAreaElement | null = null\n private pinBtnEl: HTMLButtonElement | null = null\n\n constructor(\n private app: AppService,\n private config: ConfigService,\n private hotkeys: HotkeysService,\n ) {}\n\n init(): void {\n this.store = new NoteStore(this.resolveFolder())\n this.binding = new NoteBinding(this.store)\n\n this.bodyInput$.pipe(debounceTime(400)).subscribe(body => this.persistBody(body))\n\n this.app.activeTabChange$.subscribe((tab: any) => { void this.loadForTab(tab) })\n\n this.hotkeys.hotkey$.subscribe((id: string) => {\n if (id === 'tab-notes-toggle') { this.toggle() }\n if (id === 'tab-notes-pin') { this.pinCurrentToRepo() }\n })\n\n if ((this.config.store as any)?.tabNotes?.panelVisible) {\n this.toggle()\n }\n }\n\n private resolveFolder(): string {\n const configured = (this.config.store as any)?.tabNotes?.folder\n const fallback = path.join(os.homedir(), '.config', 'tabby', 'tab-notes')\n const folder = configured || fallback\n try {\n new NoteStore(folder).ensureDir()\n return folder\n } catch (e) {\n console.warn('[tab-notes] notes folder unwritable, falling back to config dir:', e)\n return fallback\n }\n }\n\n // ---- panel lifecycle ----\n\n toggle(): void {\n this.visible = !this.visible\n if (this.visible) {\n this.mountPanel()\n void this.loadForTab(this.app.activeTab)\n } else {\n this.unmountPanel()\n }\n }\n\n private mountPanel(): void {\n if (this.panelEl) { return }\n\n const panel = document.createElement('div')\n panel.style.cssText = [\n 'position:fixed', 'top:0', 'right:0', 'bottom:0', `width:${this.panelWidth}px`,\n 'z-index:99998', 'display:flex', 'flex-direction:column',\n 'background:rgba(24,24,27,0.97)', 'color:#e4e4e7',\n 'border-left:1px solid #3f3f46', 'box-shadow:-4px 0 16px rgba(0,0,0,0.35)',\n 'font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif',\n ].join(';')\n\n const titlebar = document.createElement('div')\n titlebar.style.cssText = [\n 'display:flex', 'align-items:center', 'justify-content:space-between',\n 'padding:8px 10px', 'background:#18181b', 'border-bottom:1px solid #3f3f46',\n 'font-size:12px', 'font-weight:600', 'letter-spacing:.02em',\n ].join(';')\n\n const title = document.createElement('span')\n title.textContent = 'Tab Notes'\n\n const actions = document.createElement('div')\n actions.style.cssText = 'display:flex;gap:4px'\n\n const pinBtn = document.createElement('button')\n pinBtn.textContent = '๐Ÿ“Œ Pin'\n pinBtn.title = 'Pin this note to the current repo'\n this.styleButton(pinBtn)\n pinBtn.addEventListener('click', () => this.pinCurrentToRepo())\n this.pinBtnEl = pinBtn\n\n const closeBtn = document.createElement('button')\n closeBtn.textContent = 'โœ•'\n closeBtn.title = 'Close (toggle with the toolbar button)'\n this.styleButton(closeBtn)\n closeBtn.addEventListener('click', () => this.toggle())\n\n actions.appendChild(pinBtn)\n actions.appendChild(closeBtn)\n titlebar.appendChild(title)\n titlebar.appendChild(actions)\n\n const header = document.createElement('div')\n header.style.cssText = [\n 'padding:6px 10px', 'font-size:11px', 'color:#a1a1aa',\n 'white-space:pre-wrap', 'word-break:break-all', 'border-bottom:1px solid #27272a',\n ].join(';')\n this.headerEl = header\n\n const textarea = document.createElement('textarea')\n textarea.placeholder = \"What were you doing in this tab? What's next?\"\n textarea.style.cssText = [\n 'flex:1', 'resize:none', 'border:0', 'outline:none', 'padding:10px',\n 'background:transparent', 'color:#e4e4e7', 'font-size:13px', 'line-height:1.5',\n 'font-family:ui-monospace,SFMono-Regular,Menlo,monospace',\n ].join(';')\n textarea.addEventListener('input', () => this.onBodyChanged(textarea.value))\n this.textareaEl = textarea\n\n panel.appendChild(titlebar)\n panel.appendChild(header)\n panel.appendChild(textarea)\n document.body.appendChild(panel)\n this.panelEl = panel\n\n this.applyLayout(true)\n this.renderState()\n setTimeout(() => this.textareaEl?.focus(), 0)\n }\n\n // Reflow Tabby's content so the terminal shrinks to the left of the panel instead of\n // being covered. Inline styles override the stylesheet's width:100vw; Tabby's own\n // terminal ResizeObserver re-fits the PTY to the new width. Clearing them restores\n // the original layout exactly.\n private applyLayout(open: boolean): void {\n const appRoot = document.querySelector('app-root') as HTMLElement | null\n const content = document.querySelector('app-root .content') as HTMLElement | null\n if (appRoot) {\n appRoot.style.transition = 'width 0.15s ease'\n appRoot.style.width = open ? `calc(100vw - ${this.panelWidth}px)` : ''\n }\n if (content) {\n content.style.width = open ? '100%' : ''\n }\n // Nudge a resize so the terminal re-fits immediately rather than on next focus.\n setTimeout(() => window.dispatchEvent(new Event('resize')), 160)\n }\n\n private styleButton(btn: HTMLButtonElement): void {\n btn.style.cssText = [\n 'background:transparent', 'border:1px solid #3f3f46', 'border-radius:4px',\n 'color:#d4d4d8', 'font-size:11px', 'padding:2px 6px', 'cursor:pointer',\n ].join(';')\n }\n\n private unmountPanel(): void {\n this.panelEl?.remove()\n this.panelEl = null\n this.headerEl = null\n this.textareaEl = null\n this.pinBtnEl = null\n this.applyLayout(false)\n }\n\n private renderState(): void {\n if (this.headerEl) { this.headerEl.textContent = this.header || '> ๐Ÿ“ unknown' }\n if (this.textareaEl && this.textareaEl.value !== this.body) {\n this.textareaEl.value = this.body\n }\n if (this.pinBtnEl) {\n const pinned = this.binding.isPinned(this.currentRepoPath)\n this.pinBtnEl.textContent = pinned ? '๐Ÿ“Œ Pinned' : '๐Ÿ“Œ Pin'\n this.pinBtnEl.style.opacity = this.currentRepoPath ? '1' : '0.4'\n }\n }\n\n // ---- note loading / saving ----\n\n async loadForTab(tab: any): Promise<void> {\n if (!tab || !tab['__tabNotesId']) { this.currentNoteId = null; this.renderState(); return }\n const cwd = await this.readCwd(tab)\n const repo = cwd ? await getRepoContext(cwd, nodeExec) : { repoPath: null, branch: null }\n this.currentRepoPath = repo.repoPath\n const noteId = this.binding.resolve({ noteId: tab['__tabNotesId'], repoPath: repo.repoPath })\n this.currentNoteId = noteId\n const note = this.store.load(noteId)\n const header = formatHeader({ cwd, branch: repo.branch, lastCommand: null })\n this.store.saveHeader(noteId, header)\n this.header = header\n this.body = note.body\n this.renderState()\n }\n\n private async readCwd(tab: any): Promise<string | null> {\n // VERIFIED against Tabby typings (tabby-core splitTab.component.d.ts + tabby-terminal\n // baseTerminalTab.component.d.ts / session.d.ts): app.activeTab is a SplitTabComponent\n // whose focused child pane (getFocusedTab()) is the BaseTerminalTabComponent that holds\n // `session: BaseSession | null`. The session exposes\n // supportsWorkingDirectory(): boolean\n // getWorkingDirectory(): Promise<string | null>\n const pane = tab?.getFocusedTab?.() ?? tab\n const session = pane?.session\n try {\n if (session?.supportsWorkingDirectory?.()) {\n return (await session.getWorkingDirectory()) ?? null\n }\n return null\n } catch { return null }\n }\n\n onBodyChanged(body: string): void { this.body = body; this.bodyInput$.next(body) }\n\n private persistBody(body: string): void {\n if (!this.currentNoteId) { return }\n this.store.saveBody(this.currentNoteId, body)\n const title = body.split('\\n')[0].slice(0, 60)\n this.store.setMeta(this.currentNoteId, { title, lastActive: new Date().toISOString() })\n }\n\n pinCurrentToRepo(): void {\n if (!this.currentNoteId || !this.currentRepoPath) { return }\n if (this.binding.isPinned(this.currentRepoPath)) {\n this.binding.unpin(this.currentRepoPath)\n } else {\n this.binding.pinToRepo(this.currentRepoPath, this.currentNoteId)\n }\n void this.loadForTab(this.app.activeTab)\n }\n}\n","export interface RepoContext { repoPath: string | null; branch: string | null }\nexport interface HeaderInput { cwd: string | null; branch: string | null; lastCommand: string | null }\nexport type ExecFn = (cmd: string, args: string[], cwd: string) => Promise<string>\n\nexport function formatHeader(input: HeaderInput): string {\n const parts: string[] = [`๐Ÿ“ ${input.cwd ?? 'unknown'}`]\n if (input.branch) { parts.push(input.branch) }\n if (input.lastCommand) { parts.push(`last: ${input.lastCommand}`) }\n return `> ${parts.join(' ยท ')}`\n}\n\nexport function parseBranch(stdout: string): string | null {\n const trimmed = stdout.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nexport async function getRepoContext(cwd: string, exec: ExecFn): Promise<RepoContext> {\n try {\n const top = (await exec('git', ['-C', cwd, 'rev-parse', '--show-toplevel'], cwd)).trim()\n const branch = parseBranch(await exec('git', ['-C', cwd, 'branch', '--show-current'], cwd))\n return { repoPath: top || null, branch }\n } catch {\n return { repoPath: null, branch: null }\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"crypto\");","import { Injectable } from '@angular/core'\nimport { AppService, TabRecoveryService } from 'tabby-core'\nimport { randomUUID } from 'crypto'\n\n// Owns the stable per-tab noteId and makes it survive a Tabby restart.\n//\n// Persistence chain (verified against Tabby's bundled code/typings):\n// 1. attach() wraps a tab's getRecoveryToken() so the saved token carries `tabNotesId`.\n// RecoveryToken allows arbitrary fields, so Tabby persists it in the saved-tabs file.\n// 2. On relaunch, patchRecovery() hooks TabRecoveryService.recoverTab(): it copies\n// token.tabNotesId into the rebuilt tab's params.inputs.\n// 3. TabsService.create() does `Object.assign(tab, params.inputs)`, so the restored tab\n// instance comes back with its original __tabNotesId โ€” and loadForTab resolves it to\n// the same note file.\n@Injectable({ providedIn: 'root' })\nexport class TabIdService {\n constructor(private tabRecovery: TabRecoveryService) {}\n\n init(app: AppService): void {\n this.patchRecovery()\n app.tabOpened$.subscribe((tab: any) => this.attach(tab))\n for (const tab of app.tabs) { this.attach(tab) }\n }\n\n private patchRecovery(): void {\n const svc: any = this.tabRecovery\n if (svc.__tabNotesPatched) { return }\n const original = svc.recoverTab?.bind(svc)\n if (!original) { return }\n svc.recoverTab = async (token: any) => {\n const params = await original(token)\n if (params && token?.tabNotesId) {\n params.inputs = { ...(params.inputs ?? {}), __tabNotesId: token.tabNotesId }\n }\n return params\n }\n svc.__tabNotesPatched = true\n }\n\n attach(tab: any): void {\n if (!tab['__tabNotesId']) { tab['__tabNotesId'] = randomUUID() }\n if (tab['__tabNotesGetTokenPatched']) { return }\n const original = tab.getRecoveryToken?.bind(tab)\n if (!original) { return }\n tab.getRecoveryToken = async () => {\n const token = await original()\n if (token) { token.tabNotesId = tab['__tabNotesId'] }\n return token\n }\n tab['__tabNotesGetTokenPatched'] = true\n }\n}\n","import { Injectable } from '@angular/core'\nimport { ToolbarButtonProvider, ToolbarButton } from 'tabby-core'\nimport { NotesPanelService } from '../services/notesPanel.service'\n\n// CONFIRM: ToolbarButtonProvider.provide() return type โ€” verify ToolbarButton shape has\n// { icon, title, weight, click } fields against tabby-clippy. The `icon` value 'note'\n// may need to match a specific icon set (FontAwesome, Material Icons, etc.) used by Tabby;\n// check tabby-clippy for the correct icon identifier format.\n@Injectable()\nexport class NotesButtonProvider extends ToolbarButtonProvider {\n constructor(private panel: NotesPanelService) { super() }\n provide(): ToolbarButton[] {\n return [{ icon: 'note', title: 'Tab Notes', weight: 5, click: () => this.panel.toggle() }]\n }\n}\n","import { ConfigProvider } from 'tabby-core'\n\n// CONFIRM ConfigProvider base class and the shape of the `defaults` property against\n// tabby-clippy (https://github.com/Eugeny/tabby-clippy). Specifically verify:\n// - whether `defaults` should be a plain object literal assigned as a class property,\n// or returned from an overridden method (e.g. getDefaults())\n// - the exact import path and that ConfigProvider is exported from 'tabby-core'\nexport class TabNotesConfigProvider extends ConfigProvider {\n defaults = { tabNotes: { folder: null, panelVisible: false } }\n}\n","import { HotkeyProvider, HotkeyDescription } from 'tabby-core'\n\n// CONFIRM HotkeyProvider base class and provide() return shape against tabby-clippy.\n// Specifically verify:\n// - that HotkeyDescription has { id: string; name: string } shape (no required additional fields)\n// - that HotkeyProvider is exported from 'tabby-core' (not tabby-settings)\n// - that the method is async provide(): Promise<HotkeyDescription[]> (vs provide(): HotkeyDescription[])\nexport class TabNotesHotkeyProvider extends HotkeyProvider {\n async provide(): Promise<HotkeyDescription[]> {\n return [\n { id: 'tab-notes-toggle', name: 'Toggle tab notes panel' },\n { id: 'tab-notes-pin', name: 'Pin this tab note to its repo' },\n ]\n }\n}\n","import { NgModule } from '@angular/core'\nimport {\n AppService, ToolbarButtonProvider, ConfigProvider, HotkeyProvider,\n} from 'tabby-core'\nimport { NotesPanelService } from './services/notesPanel.service'\nimport { TabIdService } from './services/tabId.service'\nimport { NotesButtonProvider } from './providers/toolbarButton'\nimport { TabNotesConfigProvider } from './providers/config'\nimport { TabNotesHotkeyProvider } from './providers/hotkeys'\n\n// CONFIRM: module-constructor bootstrap is the right hook in this Tabby version\n// (tabby-clippy uses this pattern). If a dedicated bootstrap provider is preferred\n// (e.g. a BootstrapProvider multi-token), switch to it and register it here.\n// Verify against tabby-clippy's NgModule definition.\n@NgModule({\n providers: [\n NotesPanelService,\n TabIdService,\n { provide: ToolbarButtonProvider, useClass: NotesButtonProvider, multi: true },\n { provide: ConfigProvider, useClass: TabNotesConfigProvider, multi: true },\n { provide: HotkeyProvider, useClass: TabNotesHotkeyProvider, multi: true },\n ],\n})\nexport default class TabNotesModule {\n constructor(app: AppService, panel: NotesPanelService, tabIds: TabIdService) {\n tabIds.init(app)\n panel.init()\n }\n}\n"],"names":["root","factory","exports","module","require","define","amd","a","i","global","__WEBPACK_EXTERNAL_MODULE__860__","__WEBPACK_EXTERNAL_MODULE__650__","__WEBPACK_EXTERNAL_MODULE__961__","__WEBPACK_EXTERNAL_MODULE__439__","__WEBPACK_EXTERNAL_MODULE__234__","__WEBPACK_EXTERNAL_MODULE__911__","__WEBPACK_EXTERNAL_MODULE__947__","__WEBPACK_EXTERNAL_MODULE__660__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","HEADER_START","HEADER_END","NoteStore","constructor","notesDir","this","indexPath","external_path_","join","notePath","noteId","test","Error","ensureDir","external_fs_","mkdirSync","recursive","readIndex","parsed","JSON","parse","readFileSync","meta","_a","pins","_b","_c","writeIndex","index","tmp","writeFileSync","stringify","renameSync","load","raw","start","indexOf","end","header","body","trim","slice","parseNoteFile","write","content","includes","serializeNoteFile","saveBody","saveHeader","getMeta","setMeta","getPins","setPin","repoPath","removePin","NoteBinding","store","resolve","tab","pinned","pinToRepo","unpin","isPinned","nodeExec","cmd","args","cwd","Promise","reject","external_child_process_","execFile","err","stdout","NotesPanelService","app","config","hotkeys","currentNoteId","currentRepoPath","bodyInput$","external_rxjs_","Subject","visible","panelWidth","panelEl","headerEl","textareaEl","pinBtnEl","init","resolveFolder","binding","pipe","operators_","debounceTime","subscribe","persistBody","activeTabChange$","loadForTab","hotkey$","id","toggle","pinCurrentToRepo","tabNotes","panelVisible","configured","folder","fallback","external_os_","homedir","e","console","warn","mountPanel","activeTab","unmountPanel","panel","document","createElement","style","cssText","titlebar","title","textContent","actions","pinBtn","styleButton","addEventListener","closeBtn","appendChild","textarea","placeholder","onBodyChanged","applyLayout","renderState","setTimeout","focus","open","appRoot","querySelector","transition","width","window","dispatchEvent","Event","btn","remove","opacity","readCwd","repo","async","exec","branch","trimmed","length","parseBranch","getRepoContext","note","input","parts","push","lastCommand","formatHeader","pane","getFocusedTab","session","supportsWorkingDirectory","_d","getWorkingDirectory","_e","next","split","lastActive","Date","toISOString","__decorate","core_","Injectable","providedIn","external_tabby_core_","AppService","ConfigService","HotkeysService","external_crypto_namespaceObject","TabIdService","tabRecovery","patchRecovery","tabOpened$","attach","tabs","svc","__tabNotesPatched","original","recoverTab","bind","token","params","tabNotesId","inputs","__tabNotesId","randomUUID","getRecoveryToken","tabId_service_decorate","TabRecoveryService","tabId_service_a","NotesButtonProvider","ToolbarButtonProvider","super","provide","icon","weight","click","toolbarButton_decorate","toolbarButton_a","TabNotesConfigProvider","ConfigProvider","defaults","TabNotesHotkeyProvider","HotkeyProvider","name","TabNotesModule","tabIds","src_decorate","NgModule","providers","useClass","multi","src_a","src_b","src_c"],"sourceRoot":""}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "tabby-tab-notes",
3
+ "version": "0.1.0",
4
+ "description": "Persistent per-tab markdown notes for Tabby",
5
+ "keywords": ["tabby-plugin"],
6
+ "author": "GrillerGeek",
7
+ "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/GrillerGeek/tabby-tab-notes.git"
11
+ },
12
+ "homepage": "https://github.com/GrillerGeek/tabby-tab-notes#readme",
13
+ "bugs": "https://github.com/GrillerGeek/tabby-tab-notes/issues",
14
+ "main": "dist/index.js",
15
+ "scripts": {
16
+ "build": "webpack --progress --color",
17
+ "watch": "webpack --progress --color --watch",
18
+ "test": "jest",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "files": ["dist"],
22
+ "peerDependencies": {
23
+ "@angular/core": "*",
24
+ "tabby-core": "*",
25
+ "tabby-terminal": "*",
26
+ "rxjs": "*"
27
+ },
28
+ "devDependencies": {
29
+ "@types/jest": "^29.5.0",
30
+ "@types/node": "^20.0.0",
31
+ "jest": "^29.7.0",
32
+ "ts-jest": "^29.1.0",
33
+ "ts-loader": "^9.5.0",
34
+ "typescript": "~5.3.0",
35
+ "webpack": "^5.89.0",
36
+ "webpack-cli": "^5.1.0"
37
+ }
38
+ }