@pome-sh/cli 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build-info.json +3 -3
- package/dist/src/doctor/checks.js +2 -2
- package/node_modules/@pome-sh/sdk/dist/db.d.ts +4 -4
- package/node_modules/@pome-sh/sdk/dist/db.js +93 -25
- package/node_modules/@pome-sh/sdk/dist/db.js.map +1 -1
- package/node_modules/@pome-sh/sdk/package.json +2 -6
- package/node_modules/@pome-sh/twin-github/README.md +2 -1
- package/node_modules/@pome-sh/twin-github/package.json +2 -3
- package/node_modules/@pome-sh/twin-slack/package.json +2 -3
- package/node_modules/@pome-sh/twin-stripe/README.md +2 -2
- package/node_modules/@pome-sh/twin-stripe/package.json +2 -3
- package/package.json +6 -7
- package/dist/src/recorder/verdictArtifact.d.ts +0 -71
- package/dist/src/recorder/verdictArtifact.js +0 -207
- package/dist/src/score/view.d.ts +0 -38
- package/dist/src/score/view.js +0 -59
- package/dist/src/twin/github/app.d.ts +0 -10
- package/dist/src/twin/github/app.js +0 -316
- package/dist/src/twin/github/db/migrations.d.ts +0 -2
- package/dist/src/twin/github/db/migrations.js +0 -64
- package/dist/src/twin/github/db/openDatabase.d.ts +0 -2
- package/dist/src/twin/github/db/openDatabase.js +0 -13
- package/dist/src/twin/github/db/queries.d.ts +0 -77
- package/dist/src/twin/github/db/queries.js +0 -93
- package/dist/src/twin/github/domain/seed.d.ts +0 -74
- package/dist/src/twin/github/domain/seed.js +0 -104
- package/dist/src/twin/github/domain/serializers.d.ts +0 -113
- package/dist/src/twin/github/domain/serializers.js +0 -76
- package/dist/src/twin/github/types.d.ts +0 -66
- package/dist/src/twin/github/types.js +0 -1
- package/dist/src/twin-github/app.d.ts +0 -9
- package/dist/src/twin-github/app.js +0 -327
- package/dist/src/twin-github/auth.d.ts +0 -16
- package/dist/src/twin-github/auth.js +0 -142
- package/dist/src/twin-github/build-info.d.ts +0 -7
- package/dist/src/twin-github/build-info.js +0 -52
- package/dist/src/twin-github/db.d.ts +0 -4
- package/dist/src/twin-github/db.js +0 -362
- package/dist/src/twin-github/domain.d.ts +0 -1649
- package/dist/src/twin-github/domain.js +0 -957
- package/dist/src/twin-github/errors.d.ts +0 -14
- package/dist/src/twin-github/errors.js +0 -34
- package/dist/src/twin-github/index.d.ts +0 -9
- package/dist/src/twin-github/index.js +0 -7
- package/dist/src/twin-github/mcp.d.ts +0 -17
- package/dist/src/twin-github/mcp.js +0 -281
- package/dist/src/twin-github/recorder.d.ts +0 -2
- package/dist/src/twin-github/recorder.js +0 -29
- package/dist/src/twin-github/seed.d.ts +0 -74
- package/dist/src/twin-github/seed.js +0 -107
- package/dist/src/twin-github/serializers.d.ts +0 -449
- package/dist/src/twin-github/serializers.js +0 -429
- package/dist/src/twin-github/server.d.ts +0 -1
- package/dist/src/twin-github/server.js +0 -34
- package/dist/src/twin-github/tools.d.ts +0 -1545
- package/dist/src/twin-github/tools.js +0 -347
- package/dist/src/twin-github/types.d.ts +0 -198
- package/dist/src/twin-github/types.js +0 -1
- package/dist/src/twin-github/unsupported-envelope.d.ts +0 -10
- package/dist/src/twin-github/unsupported-envelope.js +0 -29
- package/dist/src/twin-github/util.d.ts +0 -13
- package/dist/src/twin-github/util.js +0 -61
- package/dist/src/twin-slack/app.d.ts +0 -17
- package/dist/src/twin-slack/app.js +0 -683
- package/dist/src/twin-slack/auth.d.ts +0 -38
- package/dist/src/twin-slack/auth.js +0 -219
- package/dist/src/twin-slack/build-info.d.ts +0 -7
- package/dist/src/twin-slack/build-info.js +0 -9
- package/dist/src/twin-slack/db.d.ts +0 -4
- package/dist/src/twin-slack/db.js +0 -213
- package/dist/src/twin-slack/domain.d.ts +0 -236
- package/dist/src/twin-slack/domain.js +0 -1293
- package/dist/src/twin-slack/errors.d.ts +0 -16
- package/dist/src/twin-slack/errors.js +0 -60
- package/dist/src/twin-slack/index.d.ts +0 -8
- package/dist/src/twin-slack/index.js +0 -8
- package/dist/src/twin-slack/mcp.d.ts +0 -17
- package/dist/src/twin-slack/mcp.js +0 -226
- package/dist/src/twin-slack/recorder.d.ts +0 -2
- package/dist/src/twin-slack/recorder.js +0 -15
- package/dist/src/twin-slack/seed.d.ts +0 -49
- package/dist/src/twin-slack/seed.js +0 -139
- package/dist/src/twin-slack/serializers.d.ts +0 -141
- package/dist/src/twin-slack/serializers.js +0 -377
- package/dist/src/twin-slack/tools.d.ts +0 -97
- package/dist/src/twin-slack/tools.js +0 -171
- package/dist/src/twin-slack/types.d.ts +0 -164
- package/dist/src/twin-slack/types.js +0 -1
- package/dist/src/twin-slack/unsupported-envelope.d.ts +0 -12
- package/dist/src/twin-slack/unsupported-envelope.js +0 -61
- package/dist/src/twin-slack/upstream-types.d.ts +0 -19
- package/dist/src/twin-slack/upstream-types.js +0 -1
- package/dist/src/twin-slack/util.d.ts +0 -31
- package/dist/src/twin-slack/util.js +0 -136
- package/node_modules/base64-js/LICENSE +0 -21
- package/node_modules/base64-js/README.md +0 -34
- package/node_modules/base64-js/base64js.min.js +0 -1
- package/node_modules/base64-js/index.d.ts +0 -3
- package/node_modules/base64-js/index.js +0 -150
- package/node_modules/base64-js/package.json +0 -47
- package/node_modules/better-sqlite3/LICENSE +0 -21
- package/node_modules/better-sqlite3/README.md +0 -99
- package/node_modules/better-sqlite3/binding.gyp +0 -38
- package/node_modules/better-sqlite3/build/Release/better_sqlite3.node +0 -0
- package/node_modules/better-sqlite3/deps/common.gypi +0 -68
- package/node_modules/better-sqlite3/deps/copy.js +0 -31
- package/node_modules/better-sqlite3/deps/defines.gypi +0 -42
- package/node_modules/better-sqlite3/deps/download.sh +0 -123
- package/node_modules/better-sqlite3/deps/patches/1208.patch +0 -15
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.c +0 -269395
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.h +0 -14347
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3ext.h +0 -739
- package/node_modules/better-sqlite3/deps/sqlite3.gyp +0 -80
- package/node_modules/better-sqlite3/deps/test_extension.c +0 -21
- package/node_modules/better-sqlite3/lib/database.js +0 -90
- package/node_modules/better-sqlite3/lib/index.js +0 -3
- package/node_modules/better-sqlite3/lib/methods/aggregate.js +0 -43
- package/node_modules/better-sqlite3/lib/methods/backup.js +0 -67
- package/node_modules/better-sqlite3/lib/methods/function.js +0 -31
- package/node_modules/better-sqlite3/lib/methods/inspect.js +0 -7
- package/node_modules/better-sqlite3/lib/methods/pragma.js +0 -12
- package/node_modules/better-sqlite3/lib/methods/serialize.js +0 -16
- package/node_modules/better-sqlite3/lib/methods/table.js +0 -189
- package/node_modules/better-sqlite3/lib/methods/transaction.js +0 -78
- package/node_modules/better-sqlite3/lib/methods/wrappers.js +0 -54
- package/node_modules/better-sqlite3/lib/sqlite-error.js +0 -20
- package/node_modules/better-sqlite3/lib/util.js +0 -12
- package/node_modules/better-sqlite3/package.json +0 -59
- package/node_modules/better-sqlite3/src/addon.cpp +0 -47
- package/node_modules/better-sqlite3/src/better_sqlite3.cpp +0 -74
- package/node_modules/better-sqlite3/src/objects/backup.cpp +0 -120
- package/node_modules/better-sqlite3/src/objects/backup.hpp +0 -36
- package/node_modules/better-sqlite3/src/objects/database.cpp +0 -417
- package/node_modules/better-sqlite3/src/objects/database.hpp +0 -103
- package/node_modules/better-sqlite3/src/objects/statement-iterator.cpp +0 -113
- package/node_modules/better-sqlite3/src/objects/statement-iterator.hpp +0 -50
- package/node_modules/better-sqlite3/src/objects/statement.cpp +0 -383
- package/node_modules/better-sqlite3/src/objects/statement.hpp +0 -58
- package/node_modules/better-sqlite3/src/util/bind-map.cpp +0 -73
- package/node_modules/better-sqlite3/src/util/binder.cpp +0 -193
- package/node_modules/better-sqlite3/src/util/constants.cpp +0 -172
- package/node_modules/better-sqlite3/src/util/custom-aggregate.cpp +0 -121
- package/node_modules/better-sqlite3/src/util/custom-function.cpp +0 -59
- package/node_modules/better-sqlite3/src/util/custom-table.cpp +0 -409
- package/node_modules/better-sqlite3/src/util/data-converter.cpp +0 -17
- package/node_modules/better-sqlite3/src/util/data.cpp +0 -194
- package/node_modules/better-sqlite3/src/util/helpers.cpp +0 -109
- package/node_modules/better-sqlite3/src/util/macros.cpp +0 -90
- package/node_modules/better-sqlite3/src/util/query-macros.cpp +0 -71
- package/node_modules/better-sqlite3/src/util/row-builder.cpp +0 -49
- package/node_modules/bindings/LICENSE.md +0 -22
- package/node_modules/bindings/README.md +0 -98
- package/node_modules/bindings/bindings.js +0 -221
- package/node_modules/bindings/package.json +0 -28
- package/node_modules/bl/.travis.yml +0 -17
- package/node_modules/bl/BufferList.js +0 -396
- package/node_modules/bl/LICENSE.md +0 -13
- package/node_modules/bl/README.md +0 -247
- package/node_modules/bl/bl.js +0 -84
- package/node_modules/bl/package.json +0 -37
- package/node_modules/bl/test/convert.js +0 -21
- package/node_modules/bl/test/indexOf.js +0 -492
- package/node_modules/bl/test/isBufferList.js +0 -32
- package/node_modules/bl/test/test.js +0 -869
- package/node_modules/buffer/AUTHORS.md +0 -70
- package/node_modules/buffer/LICENSE +0 -21
- package/node_modules/buffer/README.md +0 -410
- package/node_modules/buffer/index.d.ts +0 -186
- package/node_modules/buffer/index.js +0 -1817
- package/node_modules/buffer/package.json +0 -96
- package/node_modules/chownr/LICENSE +0 -15
- package/node_modules/chownr/README.md +0 -3
- package/node_modules/chownr/chownr.js +0 -167
- package/node_modules/chownr/package.json +0 -29
- package/node_modules/decompress-response/index.d.ts +0 -22
- package/node_modules/decompress-response/index.js +0 -58
- package/node_modules/decompress-response/license +0 -9
- package/node_modules/decompress-response/package.json +0 -56
- package/node_modules/decompress-response/readme.md +0 -48
- package/node_modules/deep-extend/CHANGELOG.md +0 -46
- package/node_modules/deep-extend/LICENSE +0 -20
- package/node_modules/deep-extend/README.md +0 -91
- package/node_modules/deep-extend/index.js +0 -1
- package/node_modules/deep-extend/lib/deep-extend.js +0 -150
- package/node_modules/deep-extend/package.json +0 -62
- package/node_modules/detect-libc/LICENSE +0 -201
- package/node_modules/detect-libc/README.md +0 -163
- package/node_modules/detect-libc/index.d.ts +0 -14
- package/node_modules/detect-libc/lib/detect-libc.js +0 -313
- package/node_modules/detect-libc/lib/elf.js +0 -39
- package/node_modules/detect-libc/lib/filesystem.js +0 -51
- package/node_modules/detect-libc/lib/process.js +0 -24
- package/node_modules/detect-libc/package.json +0 -44
- package/node_modules/end-of-stream/LICENSE +0 -21
- package/node_modules/end-of-stream/README.md +0 -54
- package/node_modules/end-of-stream/index.js +0 -96
- package/node_modules/end-of-stream/package.json +0 -37
- package/node_modules/expand-template/.travis.yml +0 -6
- package/node_modules/expand-template/LICENSE +0 -21
- package/node_modules/expand-template/README.md +0 -43
- package/node_modules/expand-template/index.js +0 -26
- package/node_modules/expand-template/package.json +0 -29
- package/node_modules/expand-template/test.js +0 -67
- package/node_modules/file-uri-to-path/.npmignore +0 -1
- package/node_modules/file-uri-to-path/.travis.yml +0 -30
- package/node_modules/file-uri-to-path/History.md +0 -21
- package/node_modules/file-uri-to-path/LICENSE +0 -20
- package/node_modules/file-uri-to-path/README.md +0 -74
- package/node_modules/file-uri-to-path/index.d.ts +0 -2
- package/node_modules/file-uri-to-path/index.js +0 -66
- package/node_modules/file-uri-to-path/package.json +0 -32
- package/node_modules/file-uri-to-path/test/test.js +0 -24
- package/node_modules/file-uri-to-path/test/tests.json +0 -13
- package/node_modules/fs-constants/LICENSE +0 -21
- package/node_modules/fs-constants/README.md +0 -26
- package/node_modules/fs-constants/browser.js +0 -1
- package/node_modules/fs-constants/index.js +0 -1
- package/node_modules/fs-constants/package.json +0 -19
- package/node_modules/github-from-package/.travis.yml +0 -4
- package/node_modules/github-from-package/LICENSE +0 -18
- package/node_modules/github-from-package/example/package.json +0 -8
- package/node_modules/github-from-package/example/url.js +0 -3
- package/node_modules/github-from-package/index.js +0 -17
- package/node_modules/github-from-package/package.json +0 -30
- package/node_modules/github-from-package/readme.markdown +0 -53
- package/node_modules/github-from-package/test/a.json +0 -8
- package/node_modules/github-from-package/test/b.json +0 -5
- package/node_modules/github-from-package/test/c.json +0 -5
- package/node_modules/github-from-package/test/d.json +0 -7
- package/node_modules/github-from-package/test/e.json +0 -5
- package/node_modules/github-from-package/test/url.js +0 -19
- package/node_modules/ieee754/LICENSE +0 -11
- package/node_modules/ieee754/README.md +0 -51
- package/node_modules/ieee754/index.d.ts +0 -10
- package/node_modules/ieee754/index.js +0 -85
- package/node_modules/ieee754/package.json +0 -52
- package/node_modules/inherits/LICENSE +0 -16
- package/node_modules/inherits/README.md +0 -42
- package/node_modules/inherits/inherits.js +0 -9
- package/node_modules/inherits/inherits_browser.js +0 -27
- package/node_modules/inherits/package.json +0 -29
- package/node_modules/ini/LICENSE +0 -15
- package/node_modules/ini/README.md +0 -102
- package/node_modules/ini/ini.js +0 -206
- package/node_modules/ini/package.json +0 -33
- package/node_modules/mimic-response/index.d.ts +0 -17
- package/node_modules/mimic-response/index.js +0 -77
- package/node_modules/mimic-response/license +0 -9
- package/node_modules/mimic-response/package.json +0 -42
- package/node_modules/mimic-response/readme.md +0 -78
- package/node_modules/minimist/.eslintrc +0 -29
- package/node_modules/minimist/.github/FUNDING.yml +0 -12
- package/node_modules/minimist/.nycrc +0 -14
- package/node_modules/minimist/CHANGELOG.md +0 -298
- package/node_modules/minimist/LICENSE +0 -18
- package/node_modules/minimist/README.md +0 -121
- package/node_modules/minimist/example/parse.js +0 -4
- package/node_modules/minimist/index.js +0 -263
- package/node_modules/minimist/package.json +0 -75
- package/node_modules/minimist/test/all_bool.js +0 -34
- package/node_modules/minimist/test/bool.js +0 -177
- package/node_modules/minimist/test/dash.js +0 -43
- package/node_modules/minimist/test/default_bool.js +0 -37
- package/node_modules/minimist/test/dotted.js +0 -24
- package/node_modules/minimist/test/kv_short.js +0 -32
- package/node_modules/minimist/test/long.js +0 -33
- package/node_modules/minimist/test/num.js +0 -38
- package/node_modules/minimist/test/parse.js +0 -209
- package/node_modules/minimist/test/parse_modified.js +0 -11
- package/node_modules/minimist/test/proto.js +0 -64
- package/node_modules/minimist/test/short.js +0 -69
- package/node_modules/minimist/test/stop_early.js +0 -17
- package/node_modules/minimist/test/unknown.js +0 -104
- package/node_modules/minimist/test/whitespace.js +0 -10
- package/node_modules/mkdirp-classic/LICENSE +0 -21
- package/node_modules/mkdirp-classic/README.md +0 -18
- package/node_modules/mkdirp-classic/index.js +0 -98
- package/node_modules/mkdirp-classic/package.json +0 -18
- package/node_modules/napi-build-utils/.github/workflows/run-npm-tests.yml +0 -31
- package/node_modules/napi-build-utils/LICENSE +0 -21
- package/node_modules/napi-build-utils/README.md +0 -52
- package/node_modules/napi-build-utils/index.js +0 -214
- package/node_modules/napi-build-utils/index.md +0 -0
- package/node_modules/napi-build-utils/package.json +0 -42
- package/node_modules/node-abi/LICENSE +0 -21
- package/node_modules/node-abi/README.md +0 -54
- package/node_modules/node-abi/abi_registry.json +0 -453
- package/node_modules/node-abi/index.js +0 -179
- package/node_modules/node-abi/package.json +0 -45
- package/node_modules/once/LICENSE +0 -15
- package/node_modules/once/README.md +0 -79
- package/node_modules/once/once.js +0 -42
- package/node_modules/once/package.json +0 -33
- package/node_modules/prebuild-install/CHANGELOG.md +0 -131
- package/node_modules/prebuild-install/CONTRIBUTING.md +0 -6
- package/node_modules/prebuild-install/LICENSE +0 -21
- package/node_modules/prebuild-install/README.md +0 -163
- package/node_modules/prebuild-install/asset.js +0 -44
- package/node_modules/prebuild-install/bin.js +0 -78
- package/node_modules/prebuild-install/download.js +0 -142
- package/node_modules/prebuild-install/error.js +0 -14
- package/node_modules/prebuild-install/help.txt +0 -16
- package/node_modules/prebuild-install/index.js +0 -1
- package/node_modules/prebuild-install/log.js +0 -33
- package/node_modules/prebuild-install/package.json +0 -67
- package/node_modules/prebuild-install/proxy.js +0 -35
- package/node_modules/prebuild-install/rc.js +0 -64
- package/node_modules/prebuild-install/util.js +0 -143
- package/node_modules/pump/.github/FUNDING.yml +0 -2
- package/node_modules/pump/.travis.yml +0 -5
- package/node_modules/pump/LICENSE +0 -21
- package/node_modules/pump/README.md +0 -74
- package/node_modules/pump/SECURITY.md +0 -5
- package/node_modules/pump/empty.js +0 -1
- package/node_modules/pump/index.js +0 -86
- package/node_modules/pump/package.json +0 -30
- package/node_modules/pump/test-browser.js +0 -66
- package/node_modules/pump/test-node.js +0 -53
- package/node_modules/rc/LICENSE.APACHE2 +0 -15
- package/node_modules/rc/LICENSE.BSD +0 -26
- package/node_modules/rc/LICENSE.MIT +0 -24
- package/node_modules/rc/README.md +0 -227
- package/node_modules/rc/browser.js +0 -7
- package/node_modules/rc/cli.js +0 -4
- package/node_modules/rc/index.js +0 -53
- package/node_modules/rc/lib/utils.js +0 -104
- package/node_modules/rc/package.json +0 -29
- package/node_modules/rc/test/ini.js +0 -16
- package/node_modules/rc/test/nested-env-vars.js +0 -50
- package/node_modules/rc/test/test.js +0 -59
- package/node_modules/readable-stream/CONTRIBUTING.md +0 -38
- package/node_modules/readable-stream/GOVERNANCE.md +0 -136
- package/node_modules/readable-stream/LICENSE +0 -47
- package/node_modules/readable-stream/README.md +0 -106
- package/node_modules/readable-stream/errors-browser.js +0 -127
- package/node_modules/readable-stream/errors.js +0 -116
- package/node_modules/readable-stream/experimentalWarning.js +0 -17
- package/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
- package/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
- package/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
- package/node_modules/readable-stream/lib/_stream_transform.js +0 -190
- package/node_modules/readable-stream/lib/_stream_writable.js +0 -641
- package/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
- package/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
- package/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
- package/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
- package/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
- package/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
- package/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
- package/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
- package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
- package/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
- package/node_modules/readable-stream/package.json +0 -68
- package/node_modules/readable-stream/readable-browser.js +0 -9
- package/node_modules/readable-stream/readable.js +0 -16
- package/node_modules/safe-buffer/LICENSE +0 -21
- package/node_modules/safe-buffer/README.md +0 -584
- package/node_modules/safe-buffer/index.d.ts +0 -187
- package/node_modules/safe-buffer/index.js +0 -65
- package/node_modules/safe-buffer/package.json +0 -51
- package/node_modules/semver/LICENSE +0 -15
- package/node_modules/semver/README.md +0 -680
- package/node_modules/semver/bin/semver.js +0 -195
- package/node_modules/semver/classes/comparator.js +0 -143
- package/node_modules/semver/classes/index.js +0 -7
- package/node_modules/semver/classes/range.js +0 -577
- package/node_modules/semver/classes/semver.js +0 -350
- package/node_modules/semver/functions/clean.js +0 -8
- package/node_modules/semver/functions/cmp.js +0 -54
- package/node_modules/semver/functions/coerce.js +0 -62
- package/node_modules/semver/functions/compare-build.js +0 -9
- package/node_modules/semver/functions/compare-loose.js +0 -5
- package/node_modules/semver/functions/compare.js +0 -7
- package/node_modules/semver/functions/diff.js +0 -60
- package/node_modules/semver/functions/eq.js +0 -5
- package/node_modules/semver/functions/gt.js +0 -5
- package/node_modules/semver/functions/gte.js +0 -5
- package/node_modules/semver/functions/inc.js +0 -21
- package/node_modules/semver/functions/lt.js +0 -5
- package/node_modules/semver/functions/lte.js +0 -5
- package/node_modules/semver/functions/major.js +0 -5
- package/node_modules/semver/functions/minor.js +0 -5
- package/node_modules/semver/functions/neq.js +0 -5
- package/node_modules/semver/functions/parse.js +0 -18
- package/node_modules/semver/functions/patch.js +0 -5
- package/node_modules/semver/functions/prerelease.js +0 -8
- package/node_modules/semver/functions/rcompare.js +0 -5
- package/node_modules/semver/functions/rsort.js +0 -5
- package/node_modules/semver/functions/satisfies.js +0 -12
- package/node_modules/semver/functions/sort.js +0 -5
- package/node_modules/semver/functions/truncate.js +0 -48
- package/node_modules/semver/functions/valid.js +0 -8
- package/node_modules/semver/index.js +0 -93
- package/node_modules/semver/internal/constants.js +0 -37
- package/node_modules/semver/internal/debug.js +0 -11
- package/node_modules/semver/internal/identifiers.js +0 -29
- package/node_modules/semver/internal/lrucache.js +0 -42
- package/node_modules/semver/internal/parse-options.js +0 -17
- package/node_modules/semver/internal/re.js +0 -223
- package/node_modules/semver/package.json +0 -78
- package/node_modules/semver/preload.js +0 -4
- package/node_modules/semver/range.bnf +0 -17
- package/node_modules/semver/ranges/gtr.js +0 -6
- package/node_modules/semver/ranges/intersects.js +0 -9
- package/node_modules/semver/ranges/ltr.js +0 -6
- package/node_modules/semver/ranges/max-satisfying.js +0 -27
- package/node_modules/semver/ranges/min-satisfying.js +0 -26
- package/node_modules/semver/ranges/min-version.js +0 -63
- package/node_modules/semver/ranges/outside.js +0 -82
- package/node_modules/semver/ranges/simplify.js +0 -49
- package/node_modules/semver/ranges/subset.js +0 -249
- package/node_modules/semver/ranges/to-comparators.js +0 -10
- package/node_modules/semver/ranges/valid.js +0 -13
- package/node_modules/simple-concat/.travis.yml +0 -3
- package/node_modules/simple-concat/LICENSE +0 -20
- package/node_modules/simple-concat/README.md +0 -44
- package/node_modules/simple-concat/index.js +0 -15
- package/node_modules/simple-concat/package.json +0 -47
- package/node_modules/simple-concat/test/basic.js +0 -41
- package/node_modules/simple-get/.github/dependabot.yml +0 -15
- package/node_modules/simple-get/.github/workflows/ci.yml +0 -23
- package/node_modules/simple-get/LICENSE +0 -20
- package/node_modules/simple-get/README.md +0 -333
- package/node_modules/simple-get/index.js +0 -108
- package/node_modules/simple-get/package.json +0 -67
- package/node_modules/string_decoder/LICENSE +0 -48
- package/node_modules/string_decoder/README.md +0 -47
- package/node_modules/string_decoder/lib/string_decoder.js +0 -296
- package/node_modules/string_decoder/package.json +0 -34
- package/node_modules/strip-json-comments/index.js +0 -70
- package/node_modules/strip-json-comments/license +0 -21
- package/node_modules/strip-json-comments/package.json +0 -42
- package/node_modules/strip-json-comments/readme.md +0 -64
- package/node_modules/tar-fs/.travis.yml +0 -6
- package/node_modules/tar-fs/LICENSE +0 -21
- package/node_modules/tar-fs/README.md +0 -165
- package/node_modules/tar-fs/index.js +0 -392
- package/node_modules/tar-fs/package.json +0 -46
- package/node_modules/tar-fs/test/fixtures/a/hello.txt +0 -1
- package/node_modules/tar-fs/test/fixtures/b/a/test.txt +0 -1
- package/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
- package/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
- package/node_modules/tar-fs/test/fixtures/e/file +0 -0
- package/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
- package/node_modules/tar-fs/test/index.js +0 -457
- package/node_modules/tar-stream/LICENSE +0 -21
- package/node_modules/tar-stream/README.md +0 -168
- package/node_modules/tar-stream/extract.js +0 -257
- package/node_modules/tar-stream/headers.js +0 -295
- package/node_modules/tar-stream/index.js +0 -2
- package/node_modules/tar-stream/pack.js +0 -255
- package/node_modules/tar-stream/package.json +0 -58
- package/node_modules/tar-stream/sandbox.js +0 -11
- package/node_modules/tunnel-agent/LICENSE +0 -55
- package/node_modules/tunnel-agent/README.md +0 -4
- package/node_modules/tunnel-agent/index.js +0 -244
- package/node_modules/tunnel-agent/package.json +0 -22
- package/node_modules/util-deprecate/History.md +0 -16
- package/node_modules/util-deprecate/LICENSE +0 -24
- package/node_modules/util-deprecate/README.md +0 -53
- package/node_modules/util-deprecate/browser.js +0 -67
- package/node_modules/util-deprecate/node.js +0 -6
- package/node_modules/util-deprecate/package.json +0 -27
- package/node_modules/wrappy/LICENSE +0 -15
- package/node_modules/wrappy/README.md +0 -36
- package/node_modules/wrappy/package.json +0 -29
- package/node_modules/wrappy/wrappy.js +0 -33
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { MiddlewareHandler } from "hono";
|
|
2
|
-
export interface SessionClaims {
|
|
3
|
-
sid: string;
|
|
4
|
-
team_id: string;
|
|
5
|
-
exp: number;
|
|
6
|
-
login?: string;
|
|
7
|
-
}
|
|
8
|
-
export interface Session {
|
|
9
|
-
sid: string;
|
|
10
|
-
team_id: string;
|
|
11
|
-
login?: string;
|
|
12
|
-
}
|
|
13
|
-
export declare function resolveAuthSecret(): string;
|
|
14
|
-
export declare function bearerAuth(): MiddlewareHandler;
|
|
15
|
-
/**
|
|
16
|
-
* Admin endpoint protection. Tiered policy:
|
|
17
|
-
* 1. TWIN_ADMIN_TOKEN set → require X-Admin-Token to match (timing-safe).
|
|
18
|
-
* 2. TWIN_ADMIN_TOKEN unset + remoteAddress known → allow only loopback.
|
|
19
|
-
* 3. TWIN_ADMIN_TOKEN unset + remoteAddress unknown (test path) →
|
|
20
|
-
* allow only when NODE_ENV is not "production".
|
|
21
|
-
*
|
|
22
|
-
* The unknown-remote case is the gap that the legacy localhostOnly() fell
|
|
23
|
-
* through. In production we now deny it explicitly; in tests we still allow
|
|
24
|
-
* so the in-process Hono harness keeps working without env plumbing.
|
|
25
|
-
*/
|
|
26
|
-
export declare function requireAdminAuth(): MiddlewareHandler;
|
|
27
|
-
export declare const localhostOnly: typeof requireAdminAuth;
|
|
28
|
-
/**
|
|
29
|
-
* Build a provider-shape Slack token. When `exp` is passed, emits the
|
|
30
|
-
* 4-segment shape `<prefix>-pome-<base64url(sid)>_<exp>_<sig>` where the
|
|
31
|
-
* HMAC covers `slack:<sid>:<exp>` so a leaked token expires with its
|
|
32
|
-
* session. When `exp` is omitted, emits the legacy 3-segment shape for
|
|
33
|
-
* backward compatibility — verifyProviderToken accepts both.
|
|
34
|
-
*
|
|
35
|
-
* Cloud control-plane should always pass `exp` matching the issued JWT's
|
|
36
|
-
* `exp` claim so xoxb / xoxp tokens cannot outlive their session.
|
|
37
|
-
*/
|
|
38
|
-
export declare function signSlackProviderToken(sid: string, secret?: string, prefix?: "xoxb" | "xoxp", exp?: number): string;
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
2
|
-
import { verify } from "hono/jwt";
|
|
3
|
-
import { slackError } from "./serializers.js";
|
|
4
|
-
export function resolveAuthSecret() {
|
|
5
|
-
const secret = process.env.TWIN_AUTH_SECRET;
|
|
6
|
-
if (!secret && process.env.NODE_ENV === "production") {
|
|
7
|
-
throw new Error("TWIN_AUTH_SECRET required in production");
|
|
8
|
-
}
|
|
9
|
-
return secret ?? "dev-only-insecure-secret";
|
|
10
|
-
}
|
|
11
|
-
function unauthorized(code = "invalid_auth") {
|
|
12
|
-
return Response.json(slackError(code), { status: 401 });
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Resolve the bearer token from any of the locations real Slack accepts:
|
|
16
|
-
* 1. Authorization: Bearer <token> (preferred — MCP / SDK default)
|
|
17
|
-
* 2. ?token=<token> in the URL (some legacy Slack SDK paths)
|
|
18
|
-
* 3. token=<token> in the form body (Slack docs note this is supported
|
|
19
|
-
* for application/x-www-form-urlencoded requests).
|
|
20
|
-
*
|
|
21
|
-
* We read the form body via parseBody() — but only when the content-type
|
|
22
|
-
* is form-encoded, to avoid breaking JSON streaming reads downstream.
|
|
23
|
-
*/
|
|
24
|
-
async function resolveToken(c) {
|
|
25
|
-
const header = c.req.header("Authorization") ?? c.req.header("authorization");
|
|
26
|
-
if (header && header.startsWith("Bearer ")) {
|
|
27
|
-
const t = header.slice("Bearer ".length).trim();
|
|
28
|
-
if (t)
|
|
29
|
-
return t;
|
|
30
|
-
}
|
|
31
|
-
// ?token= fallback (query string).
|
|
32
|
-
const qToken = c.req.query("token");
|
|
33
|
-
if (qToken)
|
|
34
|
-
return qToken;
|
|
35
|
-
// form-body token= fallback. Only attempt for form-encoded POSTs.
|
|
36
|
-
const contentType = (c.req.header("content-type") ?? "").toLowerCase();
|
|
37
|
-
if (c.req.method === "POST" &&
|
|
38
|
-
(contentType.includes("application/x-www-form-urlencoded") || contentType.includes("multipart/form-data"))) {
|
|
39
|
-
try {
|
|
40
|
-
// parseBody is buffered + caches the parsed body on Hono's context,
|
|
41
|
-
// so downstream handlers calling parseFormOrJson get the same object.
|
|
42
|
-
const body = (await c.req.parseBody());
|
|
43
|
-
const formToken = body.token;
|
|
44
|
-
if (typeof formToken === "string" && formToken.length > 0)
|
|
45
|
-
return formToken;
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
// ignore parse failures; auth fall-through returns not_authed
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return undefined;
|
|
52
|
-
}
|
|
53
|
-
function extractSidFromUrl(rawUrl) {
|
|
54
|
-
try {
|
|
55
|
-
const path = new URL(rawUrl).pathname;
|
|
56
|
-
const match = path.match(/^\/s\/([^/]+)/);
|
|
57
|
-
return match?.[1] ? decodeURIComponent(match[1]) : undefined;
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
return undefined;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
export function bearerAuth() {
|
|
64
|
-
return async (c, next) => {
|
|
65
|
-
const token = await resolveToken(c);
|
|
66
|
-
if (!token)
|
|
67
|
-
return unauthorized("not_authed");
|
|
68
|
-
// Provider-shape Slack tokens: xoxb-pome-<sid>-<sig> | xoxp-pome-<sid>-<sig>
|
|
69
|
-
const providerSid = verifyProviderToken(token);
|
|
70
|
-
if (providerSid) {
|
|
71
|
-
const pathSid = c.req.param("sid") ?? extractSidFromUrl(c.req.url);
|
|
72
|
-
if (providerSid !== pathSid) {
|
|
73
|
-
return Response.json(slackError("invalid_auth"), { status: 401 });
|
|
74
|
-
}
|
|
75
|
-
c.set("session", { sid: providerSid, team_id: "provider-shaped", login: "pome-agent" });
|
|
76
|
-
await next();
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
let claims;
|
|
80
|
-
try {
|
|
81
|
-
claims = (await verify(token, resolveAuthSecret(), "HS256"));
|
|
82
|
-
}
|
|
83
|
-
catch (err) {
|
|
84
|
-
const name = err.name ?? "";
|
|
85
|
-
if (name === "JwtTokenExpired" || /expired/i.test(err.message ?? "")) {
|
|
86
|
-
return unauthorized("token_expired");
|
|
87
|
-
}
|
|
88
|
-
return unauthorized("invalid_auth");
|
|
89
|
-
}
|
|
90
|
-
if (typeof claims.exp === "number" && claims.exp < Math.floor(Date.now() / 1000)) {
|
|
91
|
-
return unauthorized("token_expired");
|
|
92
|
-
}
|
|
93
|
-
const pathSid = c.req.param("sid") ?? extractSidFromUrl(c.req.url);
|
|
94
|
-
if (!claims.sid || claims.sid !== pathSid) {
|
|
95
|
-
return Response.json(slackError("invalid_auth"), { status: 401 });
|
|
96
|
-
}
|
|
97
|
-
const session = { sid: claims.sid, team_id: claims.team_id };
|
|
98
|
-
if (typeof claims.login === "string" && claims.login.length > 0)
|
|
99
|
-
session.login = claims.login;
|
|
100
|
-
c.set("session", session);
|
|
101
|
-
await next();
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
function verifyProviderToken(token) {
|
|
105
|
-
// Preferred shape (with session expiry): xoxb-pome-<base64url(sid)>_<exp>_<sig>
|
|
106
|
-
// Legacy shape (no expiry): xoxb-pome-<base64url(sid)>_<sig>
|
|
107
|
-
// The `\d+` middle segment unambiguously picks the new shape over the legacy.
|
|
108
|
-
const matchExp = token.match(/^xox[bp]-pome-([^_]+)_(\d+)_(.+)$/);
|
|
109
|
-
if (matchExp) {
|
|
110
|
-
const expSeconds = Number(matchExp[2]);
|
|
111
|
-
if (!Number.isFinite(expSeconds))
|
|
112
|
-
return undefined;
|
|
113
|
-
if (expSeconds < Math.floor(Date.now() / 1000))
|
|
114
|
-
return undefined;
|
|
115
|
-
const sid = decodeBase64Url(matchExp[1]);
|
|
116
|
-
if (!sid)
|
|
117
|
-
return undefined;
|
|
118
|
-
const expected = signProviderExp(sid, expSeconds, resolveAuthSecret());
|
|
119
|
-
if (safeEqual(matchExp[3], expected))
|
|
120
|
-
return sid;
|
|
121
|
-
return undefined;
|
|
122
|
-
}
|
|
123
|
-
const matchLegacy = token.match(/^xox[bp]-pome-([^_]+)_(.+)$/);
|
|
124
|
-
if (!matchLegacy)
|
|
125
|
-
return undefined;
|
|
126
|
-
const sid = decodeBase64Url(matchLegacy[1]);
|
|
127
|
-
if (!sid)
|
|
128
|
-
return undefined;
|
|
129
|
-
const expected = signProvider(sid, resolveAuthSecret());
|
|
130
|
-
if (safeEqual(matchLegacy[2], expected))
|
|
131
|
-
return sid;
|
|
132
|
-
return undefined;
|
|
133
|
-
}
|
|
134
|
-
function signProvider(sid, secret) {
|
|
135
|
-
return createHmac("sha256", secret).update(`slack:${sid}`).digest("base64url").slice(0, 22);
|
|
136
|
-
}
|
|
137
|
-
function signProviderExp(sid, exp, secret) {
|
|
138
|
-
return createHmac("sha256", secret).update(`slack:${sid}:${exp}`).digest("base64url").slice(0, 22);
|
|
139
|
-
}
|
|
140
|
-
function decodeBase64Url(value) {
|
|
141
|
-
try {
|
|
142
|
-
return Buffer.from(value, "base64url").toString("utf8");
|
|
143
|
-
}
|
|
144
|
-
catch {
|
|
145
|
-
return undefined;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
function safeEqual(a, b) {
|
|
149
|
-
const ab = Buffer.from(a);
|
|
150
|
-
const bb = Buffer.from(b);
|
|
151
|
-
return ab.length === bb.length && timingSafeEqual(ab, bb);
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Admin endpoint protection. Tiered policy:
|
|
155
|
-
* 1. TWIN_ADMIN_TOKEN set → require X-Admin-Token to match (timing-safe).
|
|
156
|
-
* 2. TWIN_ADMIN_TOKEN unset + remoteAddress known → allow only loopback.
|
|
157
|
-
* 3. TWIN_ADMIN_TOKEN unset + remoteAddress unknown (test path) →
|
|
158
|
-
* allow only when NODE_ENV is not "production".
|
|
159
|
-
*
|
|
160
|
-
* The unknown-remote case is the gap that the legacy localhostOnly() fell
|
|
161
|
-
* through. In production we now deny it explicitly; in tests we still allow
|
|
162
|
-
* so the in-process Hono harness keeps working without env plumbing.
|
|
163
|
-
*/
|
|
164
|
-
export function requireAdminAuth() {
|
|
165
|
-
return async (c, next) => {
|
|
166
|
-
const adminToken = process.env.TWIN_ADMIN_TOKEN;
|
|
167
|
-
if (adminToken && adminToken.length > 0) {
|
|
168
|
-
const provided = c.req.header("X-Admin-Token") ?? c.req.header("x-admin-token");
|
|
169
|
-
if (!provided) {
|
|
170
|
-
return Response.json(slackError("restricted_action"), { status: 403 });
|
|
171
|
-
}
|
|
172
|
-
const a = Buffer.from(provided);
|
|
173
|
-
const b = Buffer.from(adminToken);
|
|
174
|
-
if (a.length !== b.length || !timingSafeEqual(a, b)) {
|
|
175
|
-
return Response.json(slackError("restricted_action"), { status: 403 });
|
|
176
|
-
}
|
|
177
|
-
await next();
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
const remote = c.env?.incoming?.socket?.remoteAddress;
|
|
181
|
-
if (!remote) {
|
|
182
|
-
if (process.env.NODE_ENV === "production") {
|
|
183
|
-
return Response.json(slackError("restricted_action"), { status: 403 });
|
|
184
|
-
}
|
|
185
|
-
await next();
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
const isLocal = remote === "127.0.0.1" ||
|
|
189
|
-
remote === "::1" ||
|
|
190
|
-
remote === "::ffff:127.0.0.1" ||
|
|
191
|
-
remote === "localhost";
|
|
192
|
-
if (!isLocal) {
|
|
193
|
-
return Response.json(slackError("restricted_action"), { status: 403 });
|
|
194
|
-
}
|
|
195
|
-
await next();
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
// Back-compat alias — existing imports of localhostOnly resolve to the new
|
|
199
|
-
// tiered policy. New code should import requireAdminAuth directly.
|
|
200
|
-
export const localhostOnly = requireAdminAuth;
|
|
201
|
-
/**
|
|
202
|
-
* Build a provider-shape Slack token. When `exp` is passed, emits the
|
|
203
|
-
* 4-segment shape `<prefix>-pome-<base64url(sid)>_<exp>_<sig>` where the
|
|
204
|
-
* HMAC covers `slack:<sid>:<exp>` so a leaked token expires with its
|
|
205
|
-
* session. When `exp` is omitted, emits the legacy 3-segment shape for
|
|
206
|
-
* backward compatibility — verifyProviderToken accepts both.
|
|
207
|
-
*
|
|
208
|
-
* Cloud control-plane should always pass `exp` matching the issued JWT's
|
|
209
|
-
* `exp` claim so xoxb / xoxp tokens cannot outlive their session.
|
|
210
|
-
*/
|
|
211
|
-
export function signSlackProviderToken(sid, secret = resolveAuthSecret(), prefix = "xoxb", exp) {
|
|
212
|
-
const sigEncoded = Buffer.from(sid, "utf8").toString("base64url");
|
|
213
|
-
if (typeof exp === "number" && Number.isFinite(exp)) {
|
|
214
|
-
const sig = signProviderExp(sid, exp, secret);
|
|
215
|
-
return `${prefix}-pome-${sigEncoded}_${exp}_${sig}`;
|
|
216
|
-
}
|
|
217
|
-
const sig = signProvider(sid, secret);
|
|
218
|
-
return `${prefix}-pome-${sigEncoded}_${sig}`;
|
|
219
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
export function twinBuildInfo() {
|
|
3
|
-
return {
|
|
4
|
-
package: "@pome-sh/twin-slack",
|
|
5
|
-
version: process.env.POME_TWIN_VERSION ?? "0.1.0",
|
|
6
|
-
git_sha: process.env.POME_TWIN_GIT_SHA ?? process.env.VERCEL_GIT_COMMIT_SHA ?? "dev",
|
|
7
|
-
build_time: process.env.POME_TWIN_BUILD_TIME ?? "dev",
|
|
8
|
-
};
|
|
9
|
-
}
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
import Database from "better-sqlite3";
|
|
3
|
-
import { mkdirSync } from "node:fs";
|
|
4
|
-
import { dirname } from "node:path";
|
|
5
|
-
const MIGRATION_SQL = `
|
|
6
|
-
CREATE TABLE IF NOT EXISTS workspaces (
|
|
7
|
-
id TEXT PRIMARY KEY,
|
|
8
|
-
name TEXT NOT NULL,
|
|
9
|
-
domain TEXT NOT NULL,
|
|
10
|
-
url TEXT NOT NULL,
|
|
11
|
-
enterprise_id TEXT,
|
|
12
|
-
created_at TEXT NOT NULL,
|
|
13
|
-
entity_counter INTEGER NOT NULL DEFAULT 0
|
|
14
|
-
);
|
|
15
|
-
|
|
16
|
-
CREATE TABLE IF NOT EXISTS users (
|
|
17
|
-
id TEXT PRIMARY KEY,
|
|
18
|
-
team_id TEXT NOT NULL,
|
|
19
|
-
name TEXT NOT NULL,
|
|
20
|
-
real_name TEXT NOT NULL DEFAULT '',
|
|
21
|
-
display_name TEXT NOT NULL DEFAULT '',
|
|
22
|
-
email TEXT,
|
|
23
|
-
is_bot INTEGER NOT NULL DEFAULT 0,
|
|
24
|
-
is_admin INTEGER NOT NULL DEFAULT 0,
|
|
25
|
-
deleted INTEGER NOT NULL DEFAULT 0,
|
|
26
|
-
tz TEXT NOT NULL DEFAULT 'America/Los_Angeles',
|
|
27
|
-
profile_json TEXT NOT NULL DEFAULT '{}',
|
|
28
|
-
created_at TEXT NOT NULL,
|
|
29
|
-
updated_at TEXT NOT NULL,
|
|
30
|
-
FOREIGN KEY (team_id) REFERENCES workspaces(id) ON DELETE CASCADE
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
CREATE UNIQUE INDEX IF NOT EXISTS users_email_idx
|
|
34
|
-
ON users(team_id, email) WHERE email IS NOT NULL;
|
|
35
|
-
|
|
36
|
-
CREATE TABLE IF NOT EXISTS channels (
|
|
37
|
-
id TEXT PRIMARY KEY,
|
|
38
|
-
team_id TEXT NOT NULL,
|
|
39
|
-
name TEXT NOT NULL DEFAULT '',
|
|
40
|
-
is_channel INTEGER NOT NULL DEFAULT 1,
|
|
41
|
-
is_group INTEGER NOT NULL DEFAULT 0,
|
|
42
|
-
is_im INTEGER NOT NULL DEFAULT 0,
|
|
43
|
-
is_mpim INTEGER NOT NULL DEFAULT 0,
|
|
44
|
-
is_private INTEGER NOT NULL DEFAULT 0,
|
|
45
|
-
is_archived INTEGER NOT NULL DEFAULT 0,
|
|
46
|
-
topic TEXT NOT NULL DEFAULT '',
|
|
47
|
-
purpose TEXT NOT NULL DEFAULT '',
|
|
48
|
-
creator TEXT NOT NULL,
|
|
49
|
-
created_at TEXT NOT NULL,
|
|
50
|
-
ts_counter INTEGER NOT NULL DEFAULT 0,
|
|
51
|
-
dm_signature TEXT,
|
|
52
|
-
FOREIGN KEY (team_id) REFERENCES workspaces(id) ON DELETE CASCADE
|
|
53
|
-
);
|
|
54
|
-
|
|
55
|
-
CREATE UNIQUE INDEX IF NOT EXISTS channels_name_idx
|
|
56
|
-
ON channels(team_id, name) WHERE name <> '';
|
|
57
|
-
|
|
58
|
-
-- Deterministic DM / MPIM dedup: dm_signature is the sorted member-id list
|
|
59
|
-
-- joined with a pipe character. NULL on public channels and private groups.
|
|
60
|
-
CREATE UNIQUE INDEX IF NOT EXISTS channels_dm_signature_idx
|
|
61
|
-
ON channels(team_id, dm_signature) WHERE dm_signature IS NOT NULL;
|
|
62
|
-
|
|
63
|
-
CREATE TABLE IF NOT EXISTS channel_members (
|
|
64
|
-
channel_id TEXT NOT NULL,
|
|
65
|
-
user_id TEXT NOT NULL,
|
|
66
|
-
joined_at TEXT NOT NULL,
|
|
67
|
-
last_read TEXT NOT NULL DEFAULT '0000000000.000000',
|
|
68
|
-
PRIMARY KEY (channel_id, user_id),
|
|
69
|
-
FOREIGN KEY (channel_id) REFERENCES channels(id) ON DELETE CASCADE,
|
|
70
|
-
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
CREATE TABLE IF NOT EXISTS messages (
|
|
74
|
-
channel_id TEXT NOT NULL,
|
|
75
|
-
ts TEXT NOT NULL,
|
|
76
|
-
user_id TEXT NOT NULL,
|
|
77
|
-
text TEXT NOT NULL,
|
|
78
|
-
subtype TEXT,
|
|
79
|
-
thread_ts TEXT,
|
|
80
|
-
reply_count INTEGER NOT NULL DEFAULT 0,
|
|
81
|
-
reply_users_count INTEGER NOT NULL DEFAULT 0,
|
|
82
|
-
latest_reply TEXT,
|
|
83
|
-
edited_user_id TEXT,
|
|
84
|
-
edited_ts TEXT,
|
|
85
|
-
blocks_json TEXT NOT NULL DEFAULT '[]',
|
|
86
|
-
attachments_json TEXT NOT NULL DEFAULT '[]',
|
|
87
|
-
bot_id TEXT,
|
|
88
|
-
app_id TEXT,
|
|
89
|
-
username TEXT,
|
|
90
|
-
icon_url TEXT,
|
|
91
|
-
icon_emoji TEXT,
|
|
92
|
-
PRIMARY KEY (channel_id, ts),
|
|
93
|
-
FOREIGN KEY (channel_id) REFERENCES channels(id) ON DELETE CASCADE
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
CREATE INDEX IF NOT EXISTS messages_history_idx ON messages(channel_id, ts DESC);
|
|
97
|
-
CREATE INDEX IF NOT EXISTS messages_thread_idx ON messages(channel_id, thread_ts, ts);
|
|
98
|
-
|
|
99
|
-
CREATE TABLE IF NOT EXISTS reactions (
|
|
100
|
-
channel_id TEXT NOT NULL,
|
|
101
|
-
message_ts TEXT NOT NULL,
|
|
102
|
-
name TEXT NOT NULL,
|
|
103
|
-
user_id TEXT NOT NULL,
|
|
104
|
-
added_at TEXT NOT NULL,
|
|
105
|
-
PRIMARY KEY (channel_id, message_ts, name, user_id),
|
|
106
|
-
FOREIGN KEY (channel_id, message_ts) REFERENCES messages(channel_id, ts) ON DELETE CASCADE
|
|
107
|
-
);
|
|
108
|
-
|
|
109
|
-
CREATE INDEX IF NOT EXISTS reactions_by_msg_idx ON reactions(channel_id, message_ts);
|
|
110
|
-
|
|
111
|
-
CREATE TABLE IF NOT EXISTS pins (
|
|
112
|
-
channel_id TEXT NOT NULL,
|
|
113
|
-
message_ts TEXT NOT NULL,
|
|
114
|
-
pinned_by TEXT NOT NULL,
|
|
115
|
-
pinned_at TEXT NOT NULL,
|
|
116
|
-
PRIMARY KEY (channel_id, message_ts),
|
|
117
|
-
FOREIGN KEY (channel_id, message_ts) REFERENCES messages(channel_id, ts) ON DELETE CASCADE
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
CREATE TABLE IF NOT EXISTS files (
|
|
121
|
-
id TEXT PRIMARY KEY,
|
|
122
|
-
team_id TEXT NOT NULL,
|
|
123
|
-
user_id TEXT NOT NULL,
|
|
124
|
-
name TEXT NOT NULL,
|
|
125
|
-
title TEXT NOT NULL DEFAULT '',
|
|
126
|
-
mimetype TEXT NOT NULL DEFAULT 'text/plain',
|
|
127
|
-
filetype TEXT NOT NULL DEFAULT 'text',
|
|
128
|
-
size INTEGER NOT NULL DEFAULT 0,
|
|
129
|
-
url_private TEXT NOT NULL DEFAULT '',
|
|
130
|
-
channels_json TEXT NOT NULL DEFAULT '[]',
|
|
131
|
-
deleted INTEGER NOT NULL DEFAULT 0,
|
|
132
|
-
content TEXT,
|
|
133
|
-
created_at TEXT NOT NULL,
|
|
134
|
-
FOREIGN KEY (team_id) REFERENCES workspaces(id) ON DELETE CASCADE
|
|
135
|
-
);
|
|
136
|
-
|
|
137
|
-
CREATE TABLE IF NOT EXISTS bookmarks (
|
|
138
|
-
id TEXT PRIMARY KEY,
|
|
139
|
-
channel_id TEXT NOT NULL,
|
|
140
|
-
title TEXT NOT NULL,
|
|
141
|
-
link TEXT NOT NULL,
|
|
142
|
-
emoji TEXT,
|
|
143
|
-
type TEXT NOT NULL DEFAULT 'link',
|
|
144
|
-
created_by TEXT NOT NULL,
|
|
145
|
-
created_at TEXT NOT NULL,
|
|
146
|
-
FOREIGN KEY (channel_id) REFERENCES channels(id) ON DELETE CASCADE
|
|
147
|
-
);
|
|
148
|
-
|
|
149
|
-
CREATE TABLE IF NOT EXISTS scheduled_messages (
|
|
150
|
-
id TEXT PRIMARY KEY,
|
|
151
|
-
channel_id TEXT NOT NULL,
|
|
152
|
-
user_id TEXT NOT NULL,
|
|
153
|
-
text TEXT NOT NULL,
|
|
154
|
-
thread_ts TEXT,
|
|
155
|
-
post_at INTEGER NOT NULL,
|
|
156
|
-
date_created INTEGER NOT NULL,
|
|
157
|
-
blocks_json TEXT NOT NULL DEFAULT '[]',
|
|
158
|
-
FOREIGN KEY (channel_id) REFERENCES channels(id) ON DELETE CASCADE
|
|
159
|
-
);
|
|
160
|
-
|
|
161
|
-
CREATE INDEX IF NOT EXISTS messages_text_idx ON messages(text);
|
|
162
|
-
`;
|
|
163
|
-
const RESET_SQL = `
|
|
164
|
-
DELETE FROM scheduled_messages;
|
|
165
|
-
DELETE FROM bookmarks;
|
|
166
|
-
DELETE FROM files;
|
|
167
|
-
DELETE FROM pins;
|
|
168
|
-
DELETE FROM reactions;
|
|
169
|
-
DELETE FROM messages;
|
|
170
|
-
DELETE FROM channel_members;
|
|
171
|
-
DELETE FROM channels;
|
|
172
|
-
DELETE FROM users;
|
|
173
|
-
DELETE FROM workspaces;
|
|
174
|
-
`;
|
|
175
|
-
export function openSlackTwinDatabase(path = process.env.SLACK_CLONE_DB ?? ":memory:") {
|
|
176
|
-
if (path !== ":memory:") {
|
|
177
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
178
|
-
}
|
|
179
|
-
const db = new Database(path);
|
|
180
|
-
migrate(db);
|
|
181
|
-
return db;
|
|
182
|
-
}
|
|
183
|
-
export function migrate(db) {
|
|
184
|
-
db.pragma("busy_timeout = 5000");
|
|
185
|
-
db.pragma("journal_mode = WAL");
|
|
186
|
-
db.pragma("foreign_keys = ON");
|
|
187
|
-
db.exec(MIGRATION_SQL);
|
|
188
|
-
// Append-only column additions for forward-compat (e.g. future fields).
|
|
189
|
-
ensureColumn(db, "workspaces", "entity_counter", "INTEGER NOT NULL DEFAULT 0");
|
|
190
|
-
ensureColumn(db, "workspaces", "ts_counter", "INTEGER NOT NULL DEFAULT 0");
|
|
191
|
-
ensureColumn(db, "channels", "ts_counter", "INTEGER NOT NULL DEFAULT 0");
|
|
192
|
-
ensureColumn(db, "channels", "dm_signature", "TEXT");
|
|
193
|
-
// Backfill workspace.ts_counter from per-channel max so any in-flight
|
|
194
|
-
// snapshot stays monotonic after the per-workspace switch.
|
|
195
|
-
db.exec(`UPDATE workspaces SET ts_counter = COALESCE(
|
|
196
|
-
(SELECT MAX(ts_counter) FROM channels WHERE team_id = workspaces.id),
|
|
197
|
-
ts_counter
|
|
198
|
-
) WHERE ts_counter = 0`);
|
|
199
|
-
ensureColumn(db, "messages", "bot_id", "TEXT");
|
|
200
|
-
ensureColumn(db, "messages", "app_id", "TEXT");
|
|
201
|
-
ensureColumn(db, "messages", "username", "TEXT");
|
|
202
|
-
ensureColumn(db, "messages", "icon_url", "TEXT");
|
|
203
|
-
ensureColumn(db, "messages", "icon_emoji", "TEXT");
|
|
204
|
-
}
|
|
205
|
-
export function resetDatabase(db) {
|
|
206
|
-
db.exec(RESET_SQL);
|
|
207
|
-
}
|
|
208
|
-
function ensureColumn(db, table, column, definition) {
|
|
209
|
-
const columns = db.prepare(`PRAGMA table_info(${table})`).all();
|
|
210
|
-
if (!columns.some((row) => row.name === column)) {
|
|
211
|
-
db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
|
|
212
|
-
}
|
|
213
|
-
}
|