narai-primitives 2.0.0-rc.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.
Files changed (440) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +64 -0
  3. package/dist/config/bootstrap.d.ts +28 -0
  4. package/dist/config/bootstrap.d.ts.map +1 -0
  5. package/dist/config/bootstrap.js +80 -0
  6. package/dist/config/bootstrap.js.map +1 -0
  7. package/dist/config/index.d.ts +13 -0
  8. package/dist/config/index.d.ts.map +1 -0
  9. package/dist/config/index.js +12 -0
  10. package/dist/config/index.js.map +1 -0
  11. package/dist/config/load.d.ts +37 -0
  12. package/dist/config/load.d.ts.map +1 -0
  13. package/dist/config/load.js +99 -0
  14. package/dist/config/load.js.map +1 -0
  15. package/dist/config/resolve.d.ts +23 -0
  16. package/dist/config/resolve.d.ts.map +1 -0
  17. package/dist/config/resolve.js +198 -0
  18. package/dist/config/resolve.js.map +1 -0
  19. package/dist/config/secrets.d.ts +20 -0
  20. package/dist/config/secrets.d.ts.map +1 -0
  21. package/dist/config/secrets.js +43 -0
  22. package/dist/config/secrets.js.map +1 -0
  23. package/dist/config/types.d.ts +104 -0
  24. package/dist/config/types.d.ts.map +1 -0
  25. package/dist/config/types.js +11 -0
  26. package/dist/config/types.js.map +1 -0
  27. package/dist/connectors/aws/cli.d.ts +3 -0
  28. package/dist/connectors/aws/cli.d.ts.map +1 -0
  29. package/dist/connectors/aws/cli.js +27 -0
  30. package/dist/connectors/aws/cli.js.map +1 -0
  31. package/dist/connectors/aws/index.d.ts +27 -0
  32. package/dist/connectors/aws/index.d.ts.map +1 -0
  33. package/dist/connectors/aws/index.js +281 -0
  34. package/dist/connectors/aws/index.js.map +1 -0
  35. package/dist/connectors/aws/lib/aws_client.d.ts +140 -0
  36. package/dist/connectors/aws/lib/aws_client.d.ts.map +1 -0
  37. package/dist/connectors/aws/lib/aws_client.js +196 -0
  38. package/dist/connectors/aws/lib/aws_client.js.map +1 -0
  39. package/dist/connectors/aws/lib/aws_error.d.ts +10 -0
  40. package/dist/connectors/aws/lib/aws_error.d.ts.map +1 -0
  41. package/dist/connectors/aws/lib/aws_error.js +15 -0
  42. package/dist/connectors/aws/lib/aws_error.js.map +1 -0
  43. package/dist/connectors/confluence/cli.d.ts +3 -0
  44. package/dist/connectors/confluence/cli.d.ts.map +1 -0
  45. package/dist/connectors/confluence/cli.js +24 -0
  46. package/dist/connectors/confluence/cli.js.map +1 -0
  47. package/dist/connectors/confluence/index.d.ts +15 -0
  48. package/dist/connectors/confluence/index.d.ts.map +1 -0
  49. package/dist/connectors/confluence/index.js +295 -0
  50. package/dist/connectors/confluence/index.js.map +1 -0
  51. package/dist/connectors/confluence/lib/confluence_client.d.ts +135 -0
  52. package/dist/connectors/confluence/lib/confluence_client.d.ts.map +1 -0
  53. package/dist/connectors/confluence/lib/confluence_client.js +329 -0
  54. package/dist/connectors/confluence/lib/confluence_client.js.map +1 -0
  55. package/dist/connectors/confluence/lib/confluence_error.d.ts +13 -0
  56. package/dist/connectors/confluence/lib/confluence_error.d.ts.map +1 -0
  57. package/dist/connectors/confluence/lib/confluence_error.js +19 -0
  58. package/dist/connectors/confluence/lib/confluence_error.js.map +1 -0
  59. package/dist/connectors/db/cli.d.ts +5 -0
  60. package/dist/connectors/db/cli.d.ts.map +1 -0
  61. package/dist/connectors/db/cli.js +34 -0
  62. package/dist/connectors/db/cli.js.map +1 -0
  63. package/dist/connectors/db/config.d.ts +18 -0
  64. package/dist/connectors/db/config.d.ts.map +1 -0
  65. package/dist/connectors/db/config.js +142 -0
  66. package/dist/connectors/db/config.js.map +1 -0
  67. package/dist/connectors/db/connector.d.ts +31 -0
  68. package/dist/connectors/db/connector.d.ts.map +1 -0
  69. package/dist/connectors/db/connector.js +175 -0
  70. package/dist/connectors/db/connector.js.map +1 -0
  71. package/dist/connectors/db/dispatcher.d.ts +36 -0
  72. package/dist/connectors/db/dispatcher.d.ts.map +1 -0
  73. package/dist/connectors/db/dispatcher.js +597 -0
  74. package/dist/connectors/db/dispatcher.js.map +1 -0
  75. package/dist/connectors/db/index.d.ts +22 -0
  76. package/dist/connectors/db/index.d.ts.map +1 -0
  77. package/dist/connectors/db/index.js +26 -0
  78. package/dist/connectors/db/index.js.map +1 -0
  79. package/dist/connectors/db/lib/audit.d.ts +32 -0
  80. package/dist/connectors/db/lib/audit.d.ts.map +1 -0
  81. package/dist/connectors/db/lib/audit.js +130 -0
  82. package/dist/connectors/db/lib/audit.js.map +1 -0
  83. package/dist/connectors/db/lib/connection.d.ts +61 -0
  84. package/dist/connectors/db/lib/connection.d.ts.map +1 -0
  85. package/dist/connectors/db/lib/connection.js +326 -0
  86. package/dist/connectors/db/lib/connection.js.map +1 -0
  87. package/dist/connectors/db/lib/credentials.d.ts +60 -0
  88. package/dist/connectors/db/lib/credentials.d.ts.map +1 -0
  89. package/dist/connectors/db/lib/credentials.js +117 -0
  90. package/dist/connectors/db/lib/credentials.js.map +1 -0
  91. package/dist/connectors/db/lib/drivers/base.d.ts +83 -0
  92. package/dist/connectors/db/lib/drivers/base.d.ts.map +1 -0
  93. package/dist/connectors/db/lib/drivers/base.js +46 -0
  94. package/dist/connectors/db/lib/drivers/base.js.map +1 -0
  95. package/dist/connectors/db/lib/drivers/dynamodb.d.ts +108 -0
  96. package/dist/connectors/db/lib/drivers/dynamodb.d.ts.map +1 -0
  97. package/dist/connectors/db/lib/drivers/dynamodb.js +468 -0
  98. package/dist/connectors/db/lib/drivers/dynamodb.js.map +1 -0
  99. package/dist/connectors/db/lib/drivers/mongodb.d.ts +60 -0
  100. package/dist/connectors/db/lib/drivers/mongodb.d.ts.map +1 -0
  101. package/dist/connectors/db/lib/drivers/mongodb.js +371 -0
  102. package/dist/connectors/db/lib/drivers/mongodb.js.map +1 -0
  103. package/dist/connectors/db/lib/drivers/mysql.d.ts +45 -0
  104. package/dist/connectors/db/lib/drivers/mysql.d.ts.map +1 -0
  105. package/dist/connectors/db/lib/drivers/mysql.js +265 -0
  106. package/dist/connectors/db/lib/drivers/mysql.js.map +1 -0
  107. package/dist/connectors/db/lib/drivers/oracle.d.ts +53 -0
  108. package/dist/connectors/db/lib/drivers/oracle.d.ts.map +1 -0
  109. package/dist/connectors/db/lib/drivers/oracle.js +350 -0
  110. package/dist/connectors/db/lib/drivers/oracle.js.map +1 -0
  111. package/dist/connectors/db/lib/drivers/postgresql.d.ts +65 -0
  112. package/dist/connectors/db/lib/drivers/postgresql.d.ts.map +1 -0
  113. package/dist/connectors/db/lib/drivers/postgresql.js +294 -0
  114. package/dist/connectors/db/lib/drivers/postgresql.js.map +1 -0
  115. package/dist/connectors/db/lib/drivers/register.d.ts +16 -0
  116. package/dist/connectors/db/lib/drivers/register.d.ts.map +1 -0
  117. package/dist/connectors/db/lib/drivers/register.js +111 -0
  118. package/dist/connectors/db/lib/drivers/register.js.map +1 -0
  119. package/dist/connectors/db/lib/drivers/sqlite.d.ts +11 -0
  120. package/dist/connectors/db/lib/drivers/sqlite.d.ts.map +1 -0
  121. package/dist/connectors/db/lib/drivers/sqlite.js +147 -0
  122. package/dist/connectors/db/lib/drivers/sqlite.js.map +1 -0
  123. package/dist/connectors/db/lib/drivers/sqlserver.d.ts +58 -0
  124. package/dist/connectors/db/lib/drivers/sqlserver.d.ts.map +1 -0
  125. package/dist/connectors/db/lib/drivers/sqlserver.js +274 -0
  126. package/dist/connectors/db/lib/drivers/sqlserver.js.map +1 -0
  127. package/dist/connectors/db/lib/environments.d.ts +68 -0
  128. package/dist/connectors/db/lib/environments.d.ts.map +1 -0
  129. package/dist/connectors/db/lib/environments.js +53 -0
  130. package/dist/connectors/db/lib/environments.js.map +1 -0
  131. package/dist/connectors/db/lib/index.d.ts +28 -0
  132. package/dist/connectors/db/lib/index.d.ts.map +1 -0
  133. package/dist/connectors/db/lib/index.js +30 -0
  134. package/dist/connectors/db/lib/index.js.map +1 -0
  135. package/dist/connectors/db/lib/plugin_config.d.ts +64 -0
  136. package/dist/connectors/db/lib/plugin_config.d.ts.map +1 -0
  137. package/dist/connectors/db/lib/plugin_config.js +287 -0
  138. package/dist/connectors/db/lib/plugin_config.js.map +1 -0
  139. package/dist/connectors/db/lib/policy.d.ts +162 -0
  140. package/dist/connectors/db/lib/policy.d.ts.map +1 -0
  141. package/dist/connectors/db/lib/policy.js +581 -0
  142. package/dist/connectors/db/lib/policy.js.map +1 -0
  143. package/dist/connectors/db/lib/query.d.ts +22 -0
  144. package/dist/connectors/db/lib/query.d.ts.map +1 -0
  145. package/dist/connectors/db/lib/query.js +93 -0
  146. package/dist/connectors/db/lib/query.js.map +1 -0
  147. package/dist/connectors/db/lib/schema.d.ts +13 -0
  148. package/dist/connectors/db/lib/schema.d.ts.map +1 -0
  149. package/dist/connectors/db/lib/schema.js +80 -0
  150. package/dist/connectors/db/lib/schema.js.map +1 -0
  151. package/dist/connectors/gcp/cli.d.ts +3 -0
  152. package/dist/connectors/gcp/cli.d.ts.map +1 -0
  153. package/dist/connectors/gcp/cli.js +24 -0
  154. package/dist/connectors/gcp/cli.js.map +1 -0
  155. package/dist/connectors/gcp/index.d.ts +24 -0
  156. package/dist/connectors/gcp/index.d.ts.map +1 -0
  157. package/dist/connectors/gcp/index.js +205 -0
  158. package/dist/connectors/gcp/index.js.map +1 -0
  159. package/dist/connectors/gcp/lib/gcp_client.d.ts +88 -0
  160. package/dist/connectors/gcp/lib/gcp_client.d.ts.map +1 -0
  161. package/dist/connectors/gcp/lib/gcp_client.js +434 -0
  162. package/dist/connectors/gcp/lib/gcp_client.js.map +1 -0
  163. package/dist/connectors/gcp/lib/gcp_error.d.ts +10 -0
  164. package/dist/connectors/gcp/lib/gcp_error.d.ts.map +1 -0
  165. package/dist/connectors/gcp/lib/gcp_error.js +15 -0
  166. package/dist/connectors/gcp/lib/gcp_error.js.map +1 -0
  167. package/dist/connectors/github/cli.d.ts +3 -0
  168. package/dist/connectors/github/cli.d.ts.map +1 -0
  169. package/dist/connectors/github/cli.js +23 -0
  170. package/dist/connectors/github/cli.js.map +1 -0
  171. package/dist/connectors/github/index.d.ts +23 -0
  172. package/dist/connectors/github/index.d.ts.map +1 -0
  173. package/dist/connectors/github/index.js +462 -0
  174. package/dist/connectors/github/index.js.map +1 -0
  175. package/dist/connectors/github/lib/github_client.d.ts +181 -0
  176. package/dist/connectors/github/lib/github_client.d.ts.map +1 -0
  177. package/dist/connectors/github/lib/github_client.js +383 -0
  178. package/dist/connectors/github/lib/github_client.js.map +1 -0
  179. package/dist/connectors/github/lib/github_error.d.ts +11 -0
  180. package/dist/connectors/github/lib/github_error.d.ts.map +1 -0
  181. package/dist/connectors/github/lib/github_error.js +17 -0
  182. package/dist/connectors/github/lib/github_error.js.map +1 -0
  183. package/dist/connectors/jira/cli.d.ts +3 -0
  184. package/dist/connectors/jira/cli.d.ts.map +1 -0
  185. package/dist/connectors/jira/cli.js +24 -0
  186. package/dist/connectors/jira/cli.js.map +1 -0
  187. package/dist/connectors/jira/index.d.ts +13 -0
  188. package/dist/connectors/jira/index.d.ts.map +1 -0
  189. package/dist/connectors/jira/index.js +287 -0
  190. package/dist/connectors/jira/index.js.map +1 -0
  191. package/dist/connectors/jira/lib/adf.d.ts +25 -0
  192. package/dist/connectors/jira/lib/adf.d.ts.map +1 -0
  193. package/dist/connectors/jira/lib/adf.js +105 -0
  194. package/dist/connectors/jira/lib/adf.js.map +1 -0
  195. package/dist/connectors/jira/lib/jira_client.d.ts +143 -0
  196. package/dist/connectors/jira/lib/jira_client.d.ts.map +1 -0
  197. package/dist/connectors/jira/lib/jira_client.js +355 -0
  198. package/dist/connectors/jira/lib/jira_client.js.map +1 -0
  199. package/dist/connectors/jira/lib/jira_error.d.ts +11 -0
  200. package/dist/connectors/jira/lib/jira_error.d.ts.map +1 -0
  201. package/dist/connectors/jira/lib/jira_error.js +17 -0
  202. package/dist/connectors/jira/lib/jira_error.js.map +1 -0
  203. package/dist/connectors/notion/cli.d.ts +3 -0
  204. package/dist/connectors/notion/cli.d.ts.map +1 -0
  205. package/dist/connectors/notion/cli.js +22 -0
  206. package/dist/connectors/notion/cli.js.map +1 -0
  207. package/dist/connectors/notion/index.d.ts +20 -0
  208. package/dist/connectors/notion/index.d.ts.map +1 -0
  209. package/dist/connectors/notion/index.js +317 -0
  210. package/dist/connectors/notion/index.js.map +1 -0
  211. package/dist/connectors/notion/lib/notion_client.d.ts +117 -0
  212. package/dist/connectors/notion/lib/notion_client.d.ts.map +1 -0
  213. package/dist/connectors/notion/lib/notion_client.js +377 -0
  214. package/dist/connectors/notion/lib/notion_client.js.map +1 -0
  215. package/dist/connectors/notion/lib/notion_error.d.ts +12 -0
  216. package/dist/connectors/notion/lib/notion_error.d.ts.map +1 -0
  217. package/dist/connectors/notion/lib/notion_error.js +18 -0
  218. package/dist/connectors/notion/lib/notion_error.js.map +1 -0
  219. package/dist/hub/cli.d.ts +4 -0
  220. package/dist/hub/cli.d.ts.map +1 -0
  221. package/dist/hub/cli.js +93 -0
  222. package/dist/hub/cli.js.map +1 -0
  223. package/dist/hub/dispatch.d.ts +33 -0
  224. package/dist/hub/dispatch.d.ts.map +1 -0
  225. package/dist/hub/dispatch.js +297 -0
  226. package/dist/hub/dispatch.js.map +1 -0
  227. package/dist/hub/index.d.ts +9 -0
  228. package/dist/hub/index.d.ts.map +1 -0
  229. package/dist/hub/index.js +215 -0
  230. package/dist/hub/index.js.map +1 -0
  231. package/dist/hub/plan.d.ts +24 -0
  232. package/dist/hub/plan.d.ts.map +1 -0
  233. package/dist/hub/plan.js +103 -0
  234. package/dist/hub/plan.js.map +1 -0
  235. package/dist/hub/types.d.ts +65 -0
  236. package/dist/hub/types.d.ts.map +1 -0
  237. package/dist/hub/types.js +3 -0
  238. package/dist/hub/types.js.map +1 -0
  239. package/dist/toolkit/_optional.d.ts +14 -0
  240. package/dist/toolkit/_optional.d.ts.map +1 -0
  241. package/dist/toolkit/_optional.js +96 -0
  242. package/dist/toolkit/_optional.js.map +1 -0
  243. package/dist/toolkit/agent_cli.d.ts +33 -0
  244. package/dist/toolkit/agent_cli.d.ts.map +1 -0
  245. package/dist/toolkit/agent_cli.js +62 -0
  246. package/dist/toolkit/agent_cli.js.map +1 -0
  247. package/dist/toolkit/agent_resolver.d.ts +46 -0
  248. package/dist/toolkit/agent_resolver.d.ts.map +1 -0
  249. package/dist/toolkit/agent_resolver.js +78 -0
  250. package/dist/toolkit/agent_resolver.js.map +1 -0
  251. package/dist/toolkit/audit/events.d.ts +45 -0
  252. package/dist/toolkit/audit/events.d.ts.map +1 -0
  253. package/dist/toolkit/audit/events.js +8 -0
  254. package/dist/toolkit/audit/events.js.map +1 -0
  255. package/dist/toolkit/audit/writer.d.ts +16 -0
  256. package/dist/toolkit/audit/writer.d.ts.map +1 -0
  257. package/dist/toolkit/audit/writer.js +73 -0
  258. package/dist/toolkit/audit/writer.js.map +1 -0
  259. package/dist/toolkit/cli/usage-report.d.ts +3 -0
  260. package/dist/toolkit/cli/usage-report.d.ts.map +1 -0
  261. package/dist/toolkit/cli/usage-report.js +76 -0
  262. package/dist/toolkit/cli/usage-report.js.map +1 -0
  263. package/dist/toolkit/connector.d.ts +142 -0
  264. package/dist/toolkit/connector.d.ts.map +1 -0
  265. package/dist/toolkit/connector.js +593 -0
  266. package/dist/toolkit/connector.js.map +1 -0
  267. package/dist/toolkit/extract_binary.d.ts +45 -0
  268. package/dist/toolkit/extract_binary.d.ts.map +1 -0
  269. package/dist/toolkit/extract_binary.js +342 -0
  270. package/dist/toolkit/extract_binary.js.map +1 -0
  271. package/dist/toolkit/extract_multimodal.d.ts +22 -0
  272. package/dist/toolkit/extract_multimodal.d.ts.map +1 -0
  273. package/dist/toolkit/extract_multimodal.js +209 -0
  274. package/dist/toolkit/extract_multimodal.js.map +1 -0
  275. package/dist/toolkit/fetch_attachment.d.ts +21 -0
  276. package/dist/toolkit/fetch_attachment.d.ts.map +1 -0
  277. package/dist/toolkit/fetch_attachment.js +169 -0
  278. package/dist/toolkit/fetch_attachment.js.map +1 -0
  279. package/dist/toolkit/fetch_helper.d.ts +47 -0
  280. package/dist/toolkit/fetch_helper.d.ts.map +1 -0
  281. package/dist/toolkit/fetch_helper.js +124 -0
  282. package/dist/toolkit/fetch_helper.js.map +1 -0
  283. package/dist/toolkit/guardrail.d.ts +63 -0
  284. package/dist/toolkit/guardrail.d.ts.map +1 -0
  285. package/dist/toolkit/guardrail.js +166 -0
  286. package/dist/toolkit/guardrail.js.map +1 -0
  287. package/dist/toolkit/hardship/curate.d.ts +47 -0
  288. package/dist/toolkit/hardship/curate.d.ts.map +1 -0
  289. package/dist/toolkit/hardship/curate.js +113 -0
  290. package/dist/toolkit/hardship/curate.js.map +1 -0
  291. package/dist/toolkit/hardship/patterns.d.ts +32 -0
  292. package/dist/toolkit/hardship/patterns.d.ts.map +1 -0
  293. package/dist/toolkit/hardship/patterns.js +98 -0
  294. package/dist/toolkit/hardship/patterns.js.map +1 -0
  295. package/dist/toolkit/hardship/preamble.d.ts +13 -0
  296. package/dist/toolkit/hardship/preamble.d.ts.map +1 -0
  297. package/dist/toolkit/hardship/preamble.js +47 -0
  298. package/dist/toolkit/hardship/preamble.js.map +1 -0
  299. package/dist/toolkit/hardship/read.d.ts +34 -0
  300. package/dist/toolkit/hardship/read.d.ts.map +1 -0
  301. package/dist/toolkit/hardship/read.js +116 -0
  302. package/dist/toolkit/hardship/read.js.map +1 -0
  303. package/dist/toolkit/hardship/record.d.ts +43 -0
  304. package/dist/toolkit/hardship/record.d.ts.map +1 -0
  305. package/dist/toolkit/hardship/record.js +74 -0
  306. package/dist/toolkit/hardship/record.js.map +1 -0
  307. package/dist/toolkit/hardship/scope.d.ts +20 -0
  308. package/dist/toolkit/hardship/scope.d.ts.map +1 -0
  309. package/dist/toolkit/hardship/scope.js +56 -0
  310. package/dist/toolkit/hardship/scope.js.map +1 -0
  311. package/dist/toolkit/index.d.ts +42 -0
  312. package/dist/toolkit/index.d.ts.map +1 -0
  313. package/dist/toolkit/index.js +51 -0
  314. package/dist/toolkit/index.js.map +1 -0
  315. package/dist/toolkit/plugin/curate-cmd.d.ts +22 -0
  316. package/dist/toolkit/plugin/curate-cmd.d.ts.map +1 -0
  317. package/dist/toolkit/plugin/curate-cmd.js +72 -0
  318. package/dist/toolkit/plugin/curate-cmd.js.map +1 -0
  319. package/dist/toolkit/plugin/prefs.d.ts +15 -0
  320. package/dist/toolkit/plugin/prefs.d.ts.map +1 -0
  321. package/dist/toolkit/plugin/prefs.js +78 -0
  322. package/dist/toolkit/plugin/prefs.js.map +1 -0
  323. package/dist/toolkit/plugin/reminder.d.ts +28 -0
  324. package/dist/toolkit/plugin/reminder.d.ts.map +1 -0
  325. package/dist/toolkit/plugin/reminder.js +103 -0
  326. package/dist/toolkit/plugin/reminder.js.map +1 -0
  327. package/dist/toolkit/policy/approval.d.ts +24 -0
  328. package/dist/toolkit/policy/approval.d.ts.map +1 -0
  329. package/dist/toolkit/policy/approval.js +56 -0
  330. package/dist/toolkit/policy/approval.js.map +1 -0
  331. package/dist/toolkit/policy/config.d.ts +38 -0
  332. package/dist/toolkit/policy/config.d.ts.map +1 -0
  333. package/dist/toolkit/policy/config.js +172 -0
  334. package/dist/toolkit/policy/config.js.map +1 -0
  335. package/dist/toolkit/policy/gate.d.ts +28 -0
  336. package/dist/toolkit/policy/gate.d.ts.map +1 -0
  337. package/dist/toolkit/policy/gate.js +126 -0
  338. package/dist/toolkit/policy/gate.js.map +1 -0
  339. package/dist/toolkit/policy/types.d.ts +106 -0
  340. package/dist/toolkit/policy/types.d.ts.map +1 -0
  341. package/dist/toolkit/policy/types.js +22 -0
  342. package/dist/toolkit/policy/types.js.map +1 -0
  343. package/dist/toolkit/security_check.d.ts +15 -0
  344. package/dist/toolkit/security_check.d.ts.map +1 -0
  345. package/dist/toolkit/security_check.js +109 -0
  346. package/dist/toolkit/security_check.js.map +1 -0
  347. package/dist/toolkit/usage/aggregate-cross-session.d.ts +36 -0
  348. package/dist/toolkit/usage/aggregate-cross-session.d.ts.map +1 -0
  349. package/dist/toolkit/usage/aggregate-cross-session.js +142 -0
  350. package/dist/toolkit/usage/aggregate-cross-session.js.map +1 -0
  351. package/dist/toolkit/usage/aggregate.d.ts +4 -0
  352. package/dist/toolkit/usage/aggregate.d.ts.map +1 -0
  353. package/dist/toolkit/usage/aggregate.js +105 -0
  354. package/dist/toolkit/usage/aggregate.js.map +1 -0
  355. package/dist/toolkit/usage/index.d.ts +11 -0
  356. package/dist/toolkit/usage/index.d.ts.map +1 -0
  357. package/dist/toolkit/usage/index.js +7 -0
  358. package/dist/toolkit/usage/index.js.map +1 -0
  359. package/dist/toolkit/usage/parse.d.ts +5 -0
  360. package/dist/toolkit/usage/parse.d.ts.map +1 -0
  361. package/dist/toolkit/usage/parse.js +19 -0
  362. package/dist/toolkit/usage/parse.js.map +1 -0
  363. package/dist/toolkit/usage/record.d.ts +8 -0
  364. package/dist/toolkit/usage/record.d.ts.map +1 -0
  365. package/dist/toolkit/usage/record.js +18 -0
  366. package/dist/toolkit/usage/record.js.map +1 -0
  367. package/dist/toolkit/usage/retention.d.ts +6 -0
  368. package/dist/toolkit/usage/retention.d.ts.map +1 -0
  369. package/dist/toolkit/usage/retention.js +71 -0
  370. package/dist/toolkit/usage/retention.js.map +1 -0
  371. package/dist/toolkit/usage/tokenize.d.ts +11 -0
  372. package/dist/toolkit/usage/tokenize.d.ts.map +1 -0
  373. package/dist/toolkit/usage/tokenize.js +24 -0
  374. package/dist/toolkit/usage/tokenize.js.map +1 -0
  375. package/dist/toolkit/usage/types.d.ts +34 -0
  376. package/dist/toolkit/usage/types.d.ts.map +1 -0
  377. package/dist/toolkit/usage/types.js +2 -0
  378. package/dist/toolkit/usage/types.js.map +1 -0
  379. package/package.json +124 -0
  380. package/plugin-hooks/session-summary.mjs +138 -0
  381. package/plugin-hooks/stale-summarize.mjs +70 -0
  382. package/plugin-hooks/usage-record.mjs +112 -0
  383. package/plugins/aws-agent/.claude-plugin/plugin.json +6 -0
  384. package/plugins/aws-agent/README.md +46 -0
  385. package/plugins/aws-agent/bin/aws-agent +22 -0
  386. package/plugins/aws-agent/commands/aws-agent.md +6 -0
  387. package/plugins/aws-agent/hooks/hooks.json +49 -0
  388. package/plugins/aws-agent/hooks/reminder.mjs +16 -0
  389. package/plugins/aws-agent/package.json +9 -0
  390. package/plugins/aws-agent/skills/aws-agent/SKILL.md +70 -0
  391. package/plugins/confluence-agent/.claude-plugin/plugin.json +6 -0
  392. package/plugins/confluence-agent/README.md +15 -0
  393. package/plugins/confluence-agent/bin/confluence-agent +17 -0
  394. package/plugins/confluence-agent/commands/confluence-agent.md +6 -0
  395. package/plugins/confluence-agent/hooks/hooks.json +49 -0
  396. package/plugins/confluence-agent/hooks/reminder.mjs +25 -0
  397. package/plugins/confluence-agent/package.json +8 -0
  398. package/plugins/confluence-agent/skills/confluence-agent/SKILL.md +40 -0
  399. package/plugins/db-agent/.claude-plugin/plugin.json +20 -0
  400. package/plugins/db-agent/README.md +13 -0
  401. package/plugins/db-agent/bin/db-agent +17 -0
  402. package/plugins/db-agent/commands/db-agent.md +6 -0
  403. package/plugins/db-agent/hooks/db-guard.mjs +110 -0
  404. package/plugins/db-agent/hooks/guardrails.json +26 -0
  405. package/plugins/db-agent/hooks/hooks.json +61 -0
  406. package/plugins/db-agent/hooks/reminder.mjs +16 -0
  407. package/plugins/db-agent/package.json +8 -0
  408. package/plugins/db-agent/skills/db-agent/SKILL.md +50 -0
  409. package/plugins/gcp-agent/.claude-plugin/plugin.json +6 -0
  410. package/plugins/gcp-agent/README.md +31 -0
  411. package/plugins/gcp-agent/bin/gcp-agent +18 -0
  412. package/plugins/gcp-agent/commands/gcp-agent.md +6 -0
  413. package/plugins/gcp-agent/hooks/hooks.json +49 -0
  414. package/plugins/gcp-agent/hooks/reminder.mjs +16 -0
  415. package/plugins/gcp-agent/package.json +9 -0
  416. package/plugins/gcp-agent/skills/gcp-agent/SKILL.md +54 -0
  417. package/plugins/github-agent/.claude-plugin/plugin.json +6 -0
  418. package/plugins/github-agent/README.md +13 -0
  419. package/plugins/github-agent/bin/github-agent +17 -0
  420. package/plugins/github-agent/commands/github-agent.md +6 -0
  421. package/plugins/github-agent/hooks/hooks.json +49 -0
  422. package/plugins/github-agent/hooks/reminder.mjs +16 -0
  423. package/plugins/github-agent/package.json +8 -0
  424. package/plugins/github-agent/skills/github-agent/SKILL.md +41 -0
  425. package/plugins/jira-agent/.claude-plugin/plugin.json +6 -0
  426. package/plugins/jira-agent/README.md +15 -0
  427. package/plugins/jira-agent/bin/jira-agent +17 -0
  428. package/plugins/jira-agent/commands/jira-agent.md +6 -0
  429. package/plugins/jira-agent/hooks/hooks.json +49 -0
  430. package/plugins/jira-agent/hooks/reminder.mjs +16 -0
  431. package/plugins/jira-agent/package.json +8 -0
  432. package/plugins/jira-agent/skills/jira-agent/SKILL.md +37 -0
  433. package/plugins/notion-agent/.claude-plugin/plugin.json +6 -0
  434. package/plugins/notion-agent/README.md +23 -0
  435. package/plugins/notion-agent/bin/notion-agent +17 -0
  436. package/plugins/notion-agent/commands/notion-agent.md +6 -0
  437. package/plugins/notion-agent/hooks/hooks.json +49 -0
  438. package/plugins/notion-agent/hooks/reminder.mjs +17 -0
  439. package/plugins/notion-agent/package.json +8 -0
  440. package/plugins/notion-agent/skills/notion-agent/SKILL.md +48 -0
@@ -0,0 +1,38 @@
1
+ import { type ApprovalMode, type PolicyRules } from "./types.js";
2
+ export interface LoadedPolicy {
3
+ rules: PolicyRules;
4
+ approval_mode: ApprovalMode;
5
+ }
6
+ export interface LoadPolicyConfigOptions {
7
+ /** Connector name — shapes the discovery path `~/.<name>-agent/config.yaml`. */
8
+ name: string;
9
+ /** Aspects that cannot be downgraded to `"success"` by operator config. */
10
+ floorAspects?: readonly string[];
11
+ /** Explicit path (overrides discovery). */
12
+ explicitPath?: string;
13
+ /** Working directory for the repo-level lookup. Defaults to `process.cwd()`. */
14
+ cwd?: string;
15
+ /** Override home dir (tests). Defaults to `os.homedir()`. */
16
+ home?: string;
17
+ }
18
+ export interface DiscoveredPaths {
19
+ user?: string;
20
+ repo?: string;
21
+ }
22
+ export declare function discoverConfigPaths(name: string, cwd?: string, home?: string): DiscoveredPaths;
23
+ /** Recursive per-key merge. Overlay wins on collision; arrays replace wholesale. */
24
+ export declare function deepMerge<T extends Record<string, unknown>>(base: T, overlay: T): T;
25
+ /**
26
+ * Top-level validator: accepts a parsed YAML mapping with optional `policy`
27
+ * and `approval_mode` keys, returns a LoadedPolicy. Unknown top-level keys
28
+ * pass through silently — this lets connectors add their own sections
29
+ * (e.g., db-agent's `servers`, `audit`) without the toolkit needing to know
30
+ * about them.
31
+ */
32
+ export declare function validatePolicyConfig(raw: unknown, floorAspects?: readonly string[]): LoadedPolicy;
33
+ /**
34
+ * Discover → merge → validate. Returns `null` if no config is found and no
35
+ * explicit path is provided; caller falls back to defaults.
36
+ */
37
+ export declare function loadPolicyConfig(opts: LoadPolicyConfigOptions): LoadedPolicy | null;
38
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/toolkit/policy/config.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,WAAW,EAGjB,MAAM,YAAY,CAAC;AAgBpB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,CAAC;IACnB,aAAa,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAsB,EAC3B,IAAI,GAAE,MAAqB,GAC1B,eAAe,CAQjB;AAWD,oFAAoF;AACpF,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzD,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,CAAC,GACT,CAAC,CAWH;AAsGD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,OAAO,EACZ,YAAY,GAAE,SAAS,MAAM,EAAO,GACnC,YAAY,CAUd;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,uBAAuB,GAC5B,YAAY,GAAG,IAAI,CAkBrB"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Operator-facing config loader. Discovers two YAML files for each connector:
3
+ *
4
+ * 1. `~/.<name>-agent/config.yaml` — user-level base
5
+ * 2. `<cwd>/.<name>-agent/config.yaml` — repo-level overlay (wins on collision)
6
+ *
7
+ * Plus an optional explicit path (caller-provided). Returns validated
8
+ * `PolicyRules` + `ApprovalMode`, or `null` if no config is discovered and no
9
+ * explicit path is given — callers fall through to `DEFAULT_POLICY` + `"auto"`.
10
+ *
11
+ * Safety floor: `admin` can never be `"success"` in config. Connectors can
12
+ * declare additional floor aspects (e.g., db-agent declares `ddl`, `privilege`);
13
+ * those aspects are also rejected if set to `"success"`.
14
+ */
15
+ import * as fs from "node:fs";
16
+ import * as os from "node:os";
17
+ import * as path from "node:path";
18
+ import * as yaml from "js-yaml";
19
+ import { DEFAULT_POLICY, } from "./types.js";
20
+ const VALID_RULES = new Set([
21
+ "success",
22
+ "present",
23
+ "escalate",
24
+ "denied",
25
+ ]);
26
+ const VALID_APPROVAL_MODES = new Set([
27
+ "auto",
28
+ "confirm_once",
29
+ "confirm_each",
30
+ "grant_required",
31
+ ]);
32
+ export function discoverConfigPaths(name, cwd = process.cwd(), home = os.homedir()) {
33
+ const rel = `.${name}-agent/config.yaml`;
34
+ const userPath = path.join(home, rel);
35
+ const repoPath = path.join(cwd, rel);
36
+ const out = {};
37
+ if (fs.existsSync(userPath))
38
+ out.user = userPath;
39
+ if (fs.existsSync(repoPath))
40
+ out.repo = repoPath;
41
+ return out;
42
+ }
43
+ function isPlainObject(v) {
44
+ return (typeof v === "object" &&
45
+ v !== null &&
46
+ !Array.isArray(v) &&
47
+ v.constructor === Object);
48
+ }
49
+ /** Recursive per-key merge. Overlay wins on collision; arrays replace wholesale. */
50
+ export function deepMerge(base, overlay) {
51
+ const out = { ...base };
52
+ for (const [k, v] of Object.entries(overlay)) {
53
+ const baseV = base[k];
54
+ if (isPlainObject(v) && isPlainObject(baseV)) {
55
+ out[k] = deepMerge(baseV, v);
56
+ }
57
+ else {
58
+ out[k] = v;
59
+ }
60
+ }
61
+ return out;
62
+ }
63
+ function readYaml(filePath) {
64
+ const raw = fs.readFileSync(filePath, { encoding: "utf-8" });
65
+ let parsed;
66
+ try {
67
+ parsed = yaml.load(raw);
68
+ }
69
+ catch (exc) {
70
+ const msg = exc instanceof Error ? exc.message : String(exc);
71
+ throw new Error(`Failed to parse YAML (${filePath}): ${msg}`);
72
+ }
73
+ if (parsed === null || parsed === undefined)
74
+ return {};
75
+ if (!isPlainObject(parsed)) {
76
+ throw new Error(`Config must be a YAML mapping (${filePath}), got: ${Array.isArray(parsed) ? "list" : typeof parsed}`);
77
+ }
78
+ return parsed;
79
+ }
80
+ function validateRule(field, value, restricted) {
81
+ if (typeof value !== "string" || !VALID_RULES.has(value)) {
82
+ throw new Error(`${field}: expected one of [success, present, escalate, denied], got: ${JSON.stringify(value)}`);
83
+ }
84
+ const rule = value;
85
+ if (restricted && rule === "success") {
86
+ throw new Error(`${field}: 'success' is not permitted (safety floor — cannot be downgraded to success)`);
87
+ }
88
+ return rule;
89
+ }
90
+ function validateRules(raw, floorAspects) {
91
+ if (raw === undefined || raw === null)
92
+ return { ...DEFAULT_POLICY };
93
+ if (!isPlainObject(raw)) {
94
+ throw new Error(`policy: expected an object, got: ${typeof raw}`);
95
+ }
96
+ const out = { ...DEFAULT_POLICY };
97
+ for (const [k, v] of Object.entries(raw)) {
98
+ switch (k) {
99
+ case "read":
100
+ out.read = validateRule("policy.read", v, false);
101
+ break;
102
+ case "write":
103
+ out.write = validateRule("policy.write", v, false);
104
+ break;
105
+ case "admin":
106
+ out.admin = validateRule("policy.admin", v, true);
107
+ break;
108
+ case "aspects": {
109
+ if (!isPlainObject(v)) {
110
+ throw new Error(`policy.aspects: expected an object, got: ${typeof v}`);
111
+ }
112
+ const aspects = {};
113
+ const floorSet = new Set(floorAspects);
114
+ for (const [aspect, rule] of Object.entries(v)) {
115
+ aspects[aspect] = validateRule(`policy.aspects.${aspect}`, rule, floorSet.has(aspect));
116
+ }
117
+ out.aspects = aspects;
118
+ break;
119
+ }
120
+ default:
121
+ throw new Error(`policy: unknown key '${k}' (expected: read, write, admin, aspects)`);
122
+ }
123
+ }
124
+ return out;
125
+ }
126
+ function validateApprovalMode(raw) {
127
+ if (raw === undefined || raw === null)
128
+ return "auto";
129
+ if (typeof raw !== "string" || !VALID_APPROVAL_MODES.has(raw)) {
130
+ throw new Error(`approval_mode: expected one of [auto, confirm_once, confirm_each, grant_required], got: ${JSON.stringify(raw)}`);
131
+ }
132
+ return raw;
133
+ }
134
+ /**
135
+ * Top-level validator: accepts a parsed YAML mapping with optional `policy`
136
+ * and `approval_mode` keys, returns a LoadedPolicy. Unknown top-level keys
137
+ * pass through silently — this lets connectors add their own sections
138
+ * (e.g., db-agent's `servers`, `audit`) without the toolkit needing to know
139
+ * about them.
140
+ */
141
+ export function validatePolicyConfig(raw, floorAspects = []) {
142
+ if (!isPlainObject(raw)) {
143
+ throw new Error(`config: expected a YAML mapping at root, got: ${typeof raw}`);
144
+ }
145
+ return {
146
+ rules: validateRules(raw["policy"], floorAspects),
147
+ approval_mode: validateApprovalMode(raw["approval_mode"]),
148
+ };
149
+ }
150
+ /**
151
+ * Discover → merge → validate. Returns `null` if no config is found and no
152
+ * explicit path is provided; caller falls back to defaults.
153
+ */
154
+ export function loadPolicyConfig(opts) {
155
+ const floor = opts.floorAspects ?? [];
156
+ if (opts.explicitPath !== undefined && opts.explicitPath.length > 0) {
157
+ if (!fs.existsSync(opts.explicitPath)) {
158
+ throw new Error(`Config file not found: ${opts.explicitPath}`);
159
+ }
160
+ return validatePolicyConfig(readYaml(opts.explicitPath), floor);
161
+ }
162
+ const paths = discoverConfigPaths(opts.name, opts.cwd, opts.home);
163
+ if (paths.user === undefined && paths.repo === undefined)
164
+ return null;
165
+ let merged = {};
166
+ if (paths.user !== undefined)
167
+ merged = deepMerge(merged, readYaml(paths.user));
168
+ if (paths.repo !== undefined)
169
+ merged = deepMerge(merged, readYaml(paths.repo));
170
+ return validatePolicyConfig(merged, floor);
171
+ }
172
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/toolkit/policy/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Pure rule → Decision mapping. Stateless; approval-mode state lives in
3
+ * `./approval.ts` (the factory wires it up per connector invocation).
4
+ *
5
+ * Rule combination: kind rule is the base; each aspect rule (if declared)
6
+ * applies on top via Rule strictness (denied > escalate > present > success).
7
+ * Note: Rule "present" collapses to Decision "escalate" — extendDecision
8
+ * hooks intercept escalate to emit ExtendedEnvelope.
9
+ * Ties go to the first offender so the `reason` message is predictable.
10
+ */
11
+ import type { ApprovalMode, Classification, Decision, PolicyRules } from "./types.js";
12
+ /** Minimal state needed for approval-mode resolution. Pure-data. */
13
+ export interface ApprovalState {
14
+ sessionApproved: boolean;
15
+ hasActiveGrant: (grantType: string) => boolean;
16
+ }
17
+ /**
18
+ * Evaluate a classification against rules + approval mode, returning a
19
+ * decision. No side effects — the caller is responsible for emitting audit
20
+ * events (see `../audit/writer.ts`).
21
+ */
22
+ export declare function checkPolicy(classification: Classification, rules: PolicyRules, approvalMode: ApprovalMode, approvalState: ApprovalState): Decision;
23
+ /**
24
+ * Combine multiple per-call decisions (e.g., db-agent classifies each SQL
25
+ * statement separately). Strictest decision wins; ties by first occurrence.
26
+ */
27
+ export declare function combineDecisions(decisions: readonly Decision[]): Decision;
28
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../../src/toolkit/policy/gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,WAAW,EAEZ,MAAM,YAAY,CAAC;AAWpB,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CAChD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,WAAW,EAClB,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,aAAa,GAC3B,QAAQ,CA0CV;AAuCD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,GAAG,QAAQ,CAYzE"}
@@ -0,0 +1,126 @@
1
+ import { DECISION_RANK } from "./types.js";
2
+ /** Strictness rank for combining Rule values (same order as DECISION_RANK). */
3
+ const RULE_RANK = {
4
+ success: 0,
5
+ present: 1,
6
+ escalate: 2,
7
+ denied: 3,
8
+ };
9
+ /**
10
+ * Evaluate a classification against rules + approval mode, returning a
11
+ * decision. No side effects — the caller is responsible for emitting audit
12
+ * events (see `../audit/writer.ts`).
13
+ */
14
+ export function checkPolicy(classification, rules, approvalMode, approvalState) {
15
+ const kind = classification.kind;
16
+ const kindRule = rules[kind];
17
+ // Combine kind rule with the strictest matching aspect rule.
18
+ let combinedRule = kindRule;
19
+ let strictestReasonSource = "kind";
20
+ let offendingAspect = null;
21
+ if (classification.aspects && rules.aspects) {
22
+ for (const aspect of classification.aspects) {
23
+ const aspectRule = rules.aspects[aspect];
24
+ if (aspectRule === undefined)
25
+ continue;
26
+ if (RULE_RANK[aspectRule] > RULE_RANK[combinedRule]) {
27
+ combinedRule = aspectRule;
28
+ strictestReasonSource = "aspect";
29
+ offendingAspect = aspect;
30
+ }
31
+ }
32
+ }
33
+ // Map the combined rule to a decision.
34
+ switch (combinedRule) {
35
+ case "denied":
36
+ return { status: "denied", reason: denyReason(kind, strictestReasonSource, offendingAspect) };
37
+ case "escalate":
38
+ return {
39
+ status: "escalate",
40
+ reason: escalateReason(kind, strictestReasonSource, offendingAspect),
41
+ };
42
+ // Rule "present" collapses to Decision "escalate" in toolkit 3.0;
43
+ // extendDecision hooks (e.g. db-agent) intercept escalate to emit
44
+ // a connector-specific ExtendedEnvelope.
45
+ case "present":
46
+ return { status: "escalate", reason: presentReason(kind, strictestReasonSource, offendingAspect) };
47
+ case "success":
48
+ // A "success" rule for reads still has to pass the approval mode gate.
49
+ if (kind === "read") {
50
+ return resolveApprovalMode(approvalMode, approvalState);
51
+ }
52
+ return { status: "success", reason: `${kind} allowed by policy` };
53
+ }
54
+ }
55
+ /**
56
+ * Read-specific: given that policy says "success", apply the approval-mode
57
+ * state machine.
58
+ *
59
+ * - auto: always success
60
+ * - confirm_once: escalate until sessionApproved, then success
61
+ * - confirm_each: always escalate
62
+ * - grant_required: success iff hasActiveGrant("read"), else denied
63
+ */
64
+ function resolveApprovalMode(mode, state) {
65
+ switch (mode) {
66
+ case "auto":
67
+ return { status: "success", reason: "auto-approved" };
68
+ case "confirm_once":
69
+ if (state.sessionApproved) {
70
+ return { status: "success", reason: "session approved" };
71
+ }
72
+ return {
73
+ status: "escalate",
74
+ reason: "First read requires confirmation (confirm_once)",
75
+ };
76
+ case "confirm_each":
77
+ return {
78
+ status: "escalate",
79
+ reason: "Each read requires confirmation (confirm_each)",
80
+ };
81
+ case "grant_required":
82
+ if (state.hasActiveGrant("read")) {
83
+ return { status: "success", reason: "active read grant" };
84
+ }
85
+ return { status: "denied", reason: "No active read grant" };
86
+ }
87
+ }
88
+ /**
89
+ * Combine multiple per-call decisions (e.g., db-agent classifies each SQL
90
+ * statement separately). Strictest decision wins; ties by first occurrence.
91
+ */
92
+ export function combineDecisions(decisions) {
93
+ if (decisions.length === 0) {
94
+ throw new Error("combineDecisions requires at least one decision");
95
+ }
96
+ let winner = decisions[0];
97
+ for (let i = 1; i < decisions.length; i++) {
98
+ const d = decisions[i];
99
+ if (DECISION_RANK[d.status] > DECISION_RANK[winner.status]) {
100
+ winner = d;
101
+ }
102
+ }
103
+ return winner;
104
+ }
105
+ // ───────────────────────────────────────────────────────────────────────────
106
+ // Reason builders — stable strings so tests/evals can assert on them.
107
+ // ───────────────────────────────────────────────────────────────────────────
108
+ function denyReason(kind, source, aspect) {
109
+ if (source === "aspect" && aspect !== null) {
110
+ return `${aspect} aspect is denied by policy`;
111
+ }
112
+ return `${kind} is denied by policy`;
113
+ }
114
+ function escalateReason(kind, source, aspect) {
115
+ if (source === "aspect" && aspect !== null) {
116
+ return `${aspect} aspect requires approval`;
117
+ }
118
+ return `${kind} requires approval`;
119
+ }
120
+ function presentReason(kind, source, aspect) {
121
+ if (source === "aspect" && aspect !== null) {
122
+ return `${aspect} aspect is displayed but not executed`;
123
+ }
124
+ return `${kind} is displayed but not executed`;
125
+ }
126
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../../src/toolkit/policy/gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Approval-gate type system. Shared across every connector.
3
+ *
4
+ * Wire formats are lowercase string literals so JSON round-trips without a
5
+ * codec step. The canonical envelope `status` is `success | denied | escalate
6
+ * | error`; connectors MAY extend with custom status values via the
7
+ * `extendDecision` hook on `createConnector` (db-agent uses `present_only`).
8
+ */
9
+ /** The CRUD-ish base axis every connector classifies into. */
10
+ export type Kind = "read" | "write" | "admin";
11
+ /**
12
+ * Kind plus optional connector-specific aspects (free-form strings).
13
+ * Aspects layer on top of kind for finer gating (e.g. `unbounded_select`,
14
+ * `source_code`, `pii`, `bulk_read`). Rule lookup applies kind first, then
15
+ * the strictest aspect rule that matches wins.
16
+ */
17
+ export interface Classification {
18
+ kind: Kind;
19
+ aspects?: readonly string[];
20
+ }
21
+ /** Wire rules operators set per classification. */
22
+ export type Rule = "success" | "present" | "escalate" | "denied";
23
+ /** Rule without `"success"` — used for safety-floor slots (admin, ddl, privilege). */
24
+ export type RestrictedRule = Exclude<Rule, "success">;
25
+ export interface PolicyRules {
26
+ read: Rule;
27
+ write: Rule;
28
+ admin: RestrictedRule;
29
+ /** Per-aspect rule map. Absent aspects fall through to the kind's rule. */
30
+ aspects?: Record<string, Rule>;
31
+ }
32
+ export type ApprovalMode = "auto" | "confirm_once" | "confirm_each" | "grant_required";
33
+ /** Defaults matching db-agent's historical behavior, generalized to CRUD. */
34
+ export declare const DEFAULT_POLICY: PolicyRules;
35
+ /**
36
+ * A gate decision. `extendDecision` hooks (e.g., db-agent's `present_only`)
37
+ * widen this by returning an envelope with additional fields; the base
38
+ * discriminants are fixed.
39
+ */
40
+ export type Decision = {
41
+ status: "success";
42
+ reason: string;
43
+ } | {
44
+ status: "denied";
45
+ reason: string;
46
+ } | {
47
+ status: "escalate";
48
+ reason: string;
49
+ };
50
+ /** Strictness rank for combining multiple decisions (denied wins). */
51
+ export declare const DECISION_RANK: Record<Decision["status"], number>;
52
+ /** Canonical 7-code error taxonomy used across every connector. */
53
+ export type ErrorCode = "AUTH_ERROR" | "NOT_FOUND" | "RATE_LIMITED" | "TIMEOUT" | "VALIDATION_ERROR" | "CONFIG_ERROR" | "CONNECTION_ERROR";
54
+ /** Success envelope — data payload is connector-specific. */
55
+ export interface SuccessEnvelope {
56
+ status: "success";
57
+ action: string;
58
+ data: Record<string, unknown>;
59
+ }
60
+ /**
61
+ * Resolution hint attached to non-success envelopes when a curated hardship
62
+ * pattern matches. Task 6.2 attaches these at runtime.
63
+ */
64
+ export interface ResolutionHint {
65
+ pattern_id: string;
66
+ advice: string;
67
+ confidence: number;
68
+ scope: "tenant" | "global";
69
+ }
70
+ /** Gate-deny envelope. */
71
+ export interface DeniedEnvelope {
72
+ status: "denied";
73
+ action: string;
74
+ reason: string;
75
+ resolution_hint?: ResolutionHint;
76
+ }
77
+ /** Gate-escalate envelope. */
78
+ export interface EscalateEnvelope {
79
+ status: "escalate";
80
+ action: string;
81
+ reason: string;
82
+ resolution_hint?: ResolutionHint;
83
+ }
84
+ /** Runtime error envelope. */
85
+ export interface ErrorEnvelope {
86
+ status: "error";
87
+ action: string;
88
+ error_code: ErrorCode;
89
+ message: string;
90
+ retriable: boolean;
91
+ resolution_hint?: ResolutionHint;
92
+ }
93
+ /**
94
+ * Connector-extended envelope. `extendDecision` hooks may emit custom status
95
+ * values (e.g., `present_only`). The `extension` field carries the
96
+ * connector-specific payload; arbitrary extra fields are accessed via cast.
97
+ */
98
+ export interface ExtendedEnvelope {
99
+ status: string;
100
+ action: string;
101
+ message?: string;
102
+ extension: Record<string, unknown>;
103
+ resolution_hint?: ResolutionHint;
104
+ }
105
+ export type Envelope = SuccessEnvelope | DeniedEnvelope | EscalateEnvelope | ErrorEnvelope | ExtendedEnvelope;
106
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/toolkit/policy/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Approval-gate type system. Shared across every connector.
3
+ *
4
+ * Wire formats are lowercase string literals so JSON round-trips without a
5
+ * codec step. The canonical envelope `status` is `success | denied | escalate
6
+ * | error`; connectors MAY extend with custom status values via the
7
+ * `extendDecision` hook on `createConnector` (db-agent uses `present_only`).
8
+ */
9
+ /** Defaults matching db-agent's historical behavior, generalized to CRUD. */
10
+ export const DEFAULT_POLICY = {
11
+ read: "success",
12
+ write: "present",
13
+ admin: "denied",
14
+ aspects: {},
15
+ };
16
+ /** Strictness rank for combining multiple decisions (denied wins). */
17
+ export const DECISION_RANK = {
18
+ success: 0,
19
+ escalate: 1,
20
+ denied: 2,
21
+ };
22
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/toolkit/policy/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA4CH,6EAA6E;AAC7E,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,EAAE;CACZ,CAAC;AAgBF,sEAAsE;AACtE,MAAM,CAAC,MAAM,aAAa,GAAuC;IAC/D,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,CAAC;IACX,MAAM,EAAE,CAAC;CACV,CAAC"}
@@ -0,0 +1,15 @@
1
+ export { FETCH_MAX_BYTES_DEFAULT, FETCH_TIMEOUT_MS_DEFAULT, FetchCapExceeded, fetchWithCaps, type FetchCapsOptions, } from "./fetch_helper.js";
2
+ /**
3
+ * Check that a URL uses an allowed scheme (http or https only).
4
+ */
5
+ export declare function validateUrl(url: string): boolean;
6
+ /**
7
+ * Verify that `p` resolves to a location inside `wikiRoot`.
8
+ * Symlinks are resolved before the prefix comparison, to prevent traversal.
9
+ */
10
+ export declare function checkPathContainment(p: string, wikiRoot: string): boolean;
11
+ /**
12
+ * Sanitize a label by stripping control characters, capping length, and HTML-escaping.
13
+ */
14
+ export declare function sanitizeLabel(label: string, maxLength?: number): string;
15
+ //# sourceMappingURL=security_check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security_check.d.ts","sourceRoot":"","sources":["../../src/toolkit/security_check.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,gBAAgB,EAChB,aAAa,EACb,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAI3B;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUhD;AA+CD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAWzE;AAkBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAK5E"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * security_check — URL validation, path containment, and label sanitization.
3
+ *
4
+ * Re-exports the fetch-cap symbols from `fetch_helper` so the two
5
+ * security-baseline knobs live under one import at call sites.
6
+ * `fetch_helper` remains the canonical owner; update the numbers there.
7
+ */
8
+ import * as fs from "node:fs";
9
+ import * as path from "node:path";
10
+ export { FETCH_MAX_BYTES_DEFAULT, FETCH_TIMEOUT_MS_DEFAULT, FetchCapExceeded, fetchWithCaps, } from "./fetch_helper.js";
11
+ const ALLOWED_SCHEMES = new Set(["http", "https"]);
12
+ /**
13
+ * Check that a URL uses an allowed scheme (http or https only).
14
+ */
15
+ export function validateUrl(url) {
16
+ if (!url) {
17
+ return false;
18
+ }
19
+ const match = url.match(/^([A-Za-z][A-Za-z0-9+.\-]*):/);
20
+ if (!match || match[1] === undefined) {
21
+ return false;
22
+ }
23
+ const scheme = match[1].toLowerCase();
24
+ return ALLOWED_SCHEMES.has(scheme);
25
+ }
26
+ /**
27
+ * Best-effort realpath that mirrors Python's pathlib.Path.resolve(strict=False).
28
+ *
29
+ * Resolves existing symlinks in the path even when the full path does not
30
+ * exist: walks up from the target until finding an existing ancestor,
31
+ * realpaths it, then re-appends the non-existent tail.
32
+ *
33
+ * TOCTOU note: this function calls `existsSync` / `lstatSync` and then
34
+ * `realpathSync.native` as two distinct system calls. On POSIX there is
35
+ * no atomic replacement (Node's fs API does not expose `openat` /
36
+ * `O_NOFOLLOW`), so on a shared host a malicious local user could swap
37
+ * a parent directory between the two calls and defeat path containment
38
+ * checks built on top of this function. Callers must run this helper in
39
+ * a directory hierarchy under their own control — a developer workstation
40
+ * or a CI runner with a private filesystem. If multi-user isolation is
41
+ * required, sandbox the toolchain (container, user namespace, etc.)
42
+ * rather than relying on this function to police the filesystem.
43
+ */
44
+ function bestEffortRealpath(p) {
45
+ const abs = path.resolve(p);
46
+ const tail = [];
47
+ let cur = abs;
48
+ while (cur && cur !== path.dirname(cur)) {
49
+ let entryExists = fs.existsSync(cur);
50
+ if (!entryExists) {
51
+ try {
52
+ fs.lstatSync(cur);
53
+ entryExists = true;
54
+ }
55
+ catch {
56
+ /* path truly absent; continue walking up */
57
+ }
58
+ }
59
+ if (entryExists) {
60
+ const real = fs.realpathSync.native(cur);
61
+ if (tail.length === 0) {
62
+ return real;
63
+ }
64
+ return path.join(real, ...tail.reverse());
65
+ }
66
+ tail.push(path.basename(cur));
67
+ cur = path.dirname(cur);
68
+ }
69
+ return abs;
70
+ }
71
+ /**
72
+ * Verify that `p` resolves to a location inside `wikiRoot`.
73
+ * Symlinks are resolved before the prefix comparison, to prevent traversal.
74
+ */
75
+ export function checkPathContainment(p, wikiRoot) {
76
+ try {
77
+ const resolvedPath = bestEffortRealpath(p);
78
+ const resolvedRoot = bestEffortRealpath(wikiRoot);
79
+ return (resolvedPath.startsWith(resolvedRoot + path.sep) ||
80
+ resolvedPath === resolvedRoot);
81
+ }
82
+ catch {
83
+ return false;
84
+ }
85
+ }
86
+ /**
87
+ * HTML-escape a string the same way Python's html.escape(s, quote=True) does.
88
+ * Ampersand must be escaped first so subsequent replacements don't double-escape.
89
+ */
90
+ function htmlEscape(s) {
91
+ return s
92
+ .replace(/&/g, "&amp;")
93
+ .replace(/</g, "&lt;")
94
+ .replace(/>/g, "&gt;")
95
+ .replace(/"/g, "&quot;")
96
+ .replace(/'/g, "&#x27;");
97
+ }
98
+ // Regex matching Unicode general-category "Cc" (control chars): U+0000..U+001F, U+007F..U+009F.
99
+ const CONTROL_CHARS_RE = /[\u0000-\u001F\u007F-\u009F]/g;
100
+ /**
101
+ * Sanitize a label by stripping control characters, capping length, and HTML-escaping.
102
+ */
103
+ export function sanitizeLabel(label, maxLength = 256) {
104
+ let cleaned = label.replace(CONTROL_CHARS_RE, "");
105
+ cleaned = cleaned.slice(0, maxLength);
106
+ cleaned = htmlEscape(cleaned);
107
+ return cleaned;
108
+ }
109
+ //# sourceMappingURL=security_check.js.map